[
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Web related\nlib/generated_plugin_registrant.dart\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n\n\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: f4abaa0735eba4dfd8f33f73363911d63931fe03\n  channel: stable\n\nproject_type: app\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Hoa Nguyen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# MMAS: Money Tracker\n\n> An optimized application for daily expense tracking and finance management. <br />\n\n![MMAS (820 x 360 px)](https://user-images.githubusercontent.com/72301141/206877824-90492e92-2e2d-4de6-b23c-312f283bdfd6.png)\n\n\n## Setup\n\nRun the following commands from your terminal:\n\n1) `git clone https://github.com/floranguyen0/mmas-money-tracker` to clone this repository \n\n2) `flutter pub get` in the project root directory to install all the required dependencies.\n\n\n## Download MMAS at:\n\nhttps://apps.apple.com/vn/app/mmas-money-tracker/id1582638369\n\n\n## Screenshots\n\n<table width=\"100%\">\n  <tbody>\n    <tr>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206411105-4a64ada8-2a9c-4804-ad59-59302a6a82c5.jpg\"/></td>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417378-9da25e84-bf21-401c-bf23-bce3b352311e.jpg\"/></td>\n       <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417548-787625af-f4b1-4c9d-8aac-fa9bd7c47bfb.jpg\"/></td>\n    </tr>\n    <tr>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417565-01bc0f8c-27a4-4648-a845-0a7c29a957c2.jpg\"/></td>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417707-be626efa-6bed-41be-a932-4e7a5aa22039.jpg\"/></td>\n       <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417743-8a51d828-efe0-4d3e-9f6b-5b16a4f3b086.jpg\"/></td>\n    </tr>\n    <tr>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417756-a979fefe-23f8-4a21-bfa5-7e45745c19f0.jpg\"/></td>\n      <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417834-25dc5bb4-c099-4d90-81a6-eb4e469bc40e.jpg\"/></td>\n       <td width=\"1%\"><img src=\"https://user-images.githubusercontent.com/72301141/206417851-2ee18113-04bf-48ae-bf83-d377b4517742.jpg\"/></td>\n    </tr>\n  </tbody>\n</table>\n\n\n## LICENSE\nMMAS: Money Tracker is [MIT-licensed](https://github.com/floranguyen0/mmas-money-tracker/blob/main/LICENSE).\n"
  },
  {
    "path": "android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\napp/upload-keystore.jks\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\n\nandroid {\n    compileSdkVersion 30\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.mmas.money_assistant_2608\"\n        minSdkVersion 16\n        targetSdkVersion 33\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n    }\n\n    signingConfigs {\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n    buildTypes {\n        release {\n            signingConfig signingConfigs.release\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n}\n"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n   <application\n        android:label=\"MMAS\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <!-- Displays an Android View that continues showing the launch screen\n                 Drawable until Flutter paints its first frame, then this splash\n                 screen fades out. A splash screen is useful to avoid any visual\n                 gap between the end of Android's launch screen and the painting of\n                 Flutter's first frame. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.SplashScreenDrawable\"\n              android:resource=\"@drawable/launch_background\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/com/mmas/money_assistant_2608/MainActivity.kt",
    "content": "package com.mmas.money_assistant_2608\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity() {\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\n    </item>\n</layer-list>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <item name=\"android:windowFullscreen\">false</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n         \n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n    </style>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <item name=\"android:windowFullscreen\">false</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n         \n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n    </style>\n</resources>"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.8.0'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.1.0'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.6.1-bin.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "#org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.java.home=C:/Program Files/Java/jdk-19\norg.gradle.jvmargs=--add-opens java.base/java.io=ALL-UNNAMED"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Properties()\n\nassert localPropertiesFile.exists()\nlocalPropertiesFile.withReader(\"UTF-8\") { reader -> properties.load(reader) }\n\ndef flutterSdkPath = properties.getProperty(\"flutter.sdk\")\nassert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\napply from: \"$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle\"\n"
  },
  {
    "path": "flutter",
    "content": ""
  },
  {
    "path": "ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/ephemeral/\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>9.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '9.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\"images\":[{\"size\":\"60x60\",\"expected-size\":\"180\",\"filename\":\"180.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"3x\"},{\"size\":\"40x40\",\"expected-size\":\"80\",\"filename\":\"80.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"2x\"},{\"size\":\"40x40\",\"expected-size\":\"120\",\"filename\":\"120.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"3x\"},{\"size\":\"60x60\",\"expected-size\":\"120\",\"filename\":\"120.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"2x\"},{\"size\":\"57x57\",\"expected-size\":\"57\",\"filename\":\"57.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"1x\"},{\"size\":\"29x29\",\"expected-size\":\"58\",\"filename\":\"58.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"2x\"},{\"size\":\"29x29\",\"expected-size\":\"29\",\"filename\":\"29.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"1x\"},{\"size\":\"29x29\",\"expected-size\":\"87\",\"filename\":\"87.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"3x\"},{\"size\":\"57x57\",\"expected-size\":\"114\",\"filename\":\"114.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"2x\"},{\"size\":\"20x20\",\"expected-size\":\"40\",\"filename\":\"40.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"2x\"},{\"size\":\"20x20\",\"expected-size\":\"60\",\"filename\":\"60.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"iphone\",\"scale\":\"3x\"},{\"size\":\"1024x1024\",\"filename\":\"1024.png\",\"expected-size\":\"1024\",\"idiom\":\"ios-marketing\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"scale\":\"1x\"},{\"size\":\"40x40\",\"expected-size\":\"80\",\"filename\":\"80.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"72x72\",\"expected-size\":\"72\",\"filename\":\"72.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"76x76\",\"expected-size\":\"152\",\"filename\":\"152.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"50x50\",\"expected-size\":\"100\",\"filename\":\"100.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"29x29\",\"expected-size\":\"58\",\"filename\":\"58.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"76x76\",\"expected-size\":\"76\",\"filename\":\"76.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"29x29\",\"expected-size\":\"29\",\"filename\":\"29.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"50x50\",\"expected-size\":\"50\",\"filename\":\"50.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"72x72\",\"expected-size\":\"144\",\"filename\":\"144.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"40x40\",\"expected-size\":\"40\",\"filename\":\"40.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"83.5x83.5\",\"expected-size\":\"167\",\"filename\":\"167.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"},{\"size\":\"20x20\",\"expected-size\":\"20\",\"filename\":\"20.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"1x\"},{\"size\":\"20x20\",\"expected-size\":\"40\",\"filename\":\"40.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"idiom\":\"ipad\",\"scale\":\"2x\"}]}"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"background.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"LaunchImage.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" image=\"LaunchBackground\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tWc-Dq-wcI\"/>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\"></imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" id=\"3T2-ad-Qdv\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"bottom\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" id=\"RPx-PI-7Xg\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"top\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"top\" id=\"SdS-ul-q2q\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"tWc-Dq-wcI\" secondAttribute=\"trailing\" id=\"Swv-Gf-Rwn\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"YRO-k0-Ey4\" secondAttribute=\"trailing\" id=\"TQA-XW-tRk\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"bottom\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" id=\"duK-uY-Gun\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" id=\"kV7-tw-vXt\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"top\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"top\" id=\"xPn-NY-SIU\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"256\" height=\"256\"/>\n        <image name=\"LaunchBackground\" width=\"1\" height=\"1\"/>\n    </resources>\n</document>"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/GoogleService-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CLIENT_ID</key>\n\t<string>189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd.apps.googleusercontent.com</string>\n\t<key>REVERSED_CLIENT_ID</key>\n\t<string>com.googleusercontent.apps.189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd</string>\n\t<key>API_KEY</key>\n\t<string>AIzaSyC_4qm52Vkak1c_a-WucmgTY1GLhQvIp-g</string>\n\t<key>GCM_SENDER_ID</key>\n\t<string>189781709351</string>\n\t<key>PLIST_VERSION</key>\n\t<string>1</string>\n\t<key>BUNDLE_ID</key>\n\t<string>com.example.moneyAssistant2608</string>\n\t<key>PROJECT_ID</key>\n\t<string>mmas-moneytracker</string>\n\t<key>STORAGE_BUCKET</key>\n\t<string>mmas-moneytracker.appspot.com</string>\n\t<key>IS_ADS_ENABLED</key>\n\t<false></false>\n\t<key>IS_ANALYTICS_ENABLED</key>\n\t<false></false>\n\t<key>IS_APPINVITE_ENABLED</key>\n\t<true></true>\n\t<key>IS_GCM_ENABLED</key>\n\t<true></true>\n\t<key>IS_SIGNIN_ENABLED</key>\n\t<true></true>\n\t<key>GOOGLE_APP_ID</key>\n\t<string>1:189781709351:ios:53aeb605dc2b087285b402</string>\n</dict>\n</plist>"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en-US</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>MMAS</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleLocalizations</key>\n\t<array>\n\t\t<string>en</string>\n\t\t<string>zh</string>\n\t\t<string>zh_CN</string>\n\t\t<string>fr</string>\n\t\t<string>de</string>\n\t\t<string>ja</string>\n\t\t<string>ko</string>\n\t</array>\n\t<key>CFBundleName</key>\n\t<string>MMAS</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>We access your photo library to add a photo of your bills to your expense/income records</string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIStatusBarHidden</key>\n\t<false/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n\n\n<!-- Google Sign-In section -->\n<key>CFBundleURLTypes</key>\n<array>\n\t<dict>\n\t\t<key>CFBundleTypeRole</key>\n\t\t<string>Editor</string>\n\t\t<key>CFBundleURLSchemes</key>\n\t\t<array>\n\t\t\t<string>com.googleusercontent.apps.189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd</string>\n\t\t</array>\n\t</dict>\n</array>\n<!-- End of the Google Sign-In section -->\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner/Runner.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>aps-environment</key>\n\t<string>development</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t23D73B63272C62B1009E72A7 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t61499E5D1D041FF00E95B707 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B99D98016620F7A28ACDC882 /* Pods_Runner.framework */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"GoogleService-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t23E42C6126E530110040CEF6 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3CAD1B05AD9D13F3D49A238F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t6F42B7B7C5C3973C91F87BBA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB99D98016620F7A28ACDC882 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB9A5FB7A6583188949FF87EB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t61499E5D1D041FF00E95B707 /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t5A2F1614F901E5E08066321B /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB99D98016620F7A28ACDC882 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\tE1BD7345BC0DA67D9B5D118F /* Pods */,\n\t\t\t\t5A2F1614F901E5E08066321B /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */,\n\t\t\t\t23E42C6126E530110040CEF6 /* Runner.entitlements */,\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE1BD7345BC0DA67D9B5D118F /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9A5FB7A6583188949FF87EB /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t3CAD1B05AD9D13F3D49A238F /* Pods-Runner.release.xcconfig */,\n\t\t\t\t6F42B7B7C5C3973C91F87BBA /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t79D9EC2F681B8FDF039DE67A /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\tD1539A2B591CC9A875AC7664 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t23D73B63272C62B1009E72A7 /* GoogleService-Info.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t79D9EC2F681B8FDF039DE67A /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n\t\tD1539A2B591CC9A875AC7664 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 2U5AVM796N;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 2U5AVM796N;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 2U5AVM796N;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lib/main.dart",
    "content": "// @dart=2.9\n\n\nimport 'package:money_assistant_2608/project/real_main.dart';\n\nvoid main() async {\n  realMain();\n}\n"
  },
  {
    "path": "lib/project/app_pages/add_category.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:money_assistant_2608/project/app_pages/parent_category.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/saveOrSaveAndDeleteButtons.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:provider/provider.dart';\n\nimport 'select_icon.dart';\n\nclass AddCategory extends StatelessWidget {\n  final BuildContext? contextEx, contextExEdit, contextInEdit, contextIn;\n  final String type, appBarTitle;\n  final String? categoryName, description;\n  final IconData? categoryIcon;\n  final CategoryItem? parentItem;\n  static final _formKey4 = GlobalKey<FormState>(debugLabel: '_formKey4'),\n      _formKey5 = GlobalKey<FormState>(debugLabel: '_formKey5');\n  AddCategory(\n      {this.contextExEdit,\n      this.contextEx,\n      this.contextInEdit,\n      this.contextIn,\n      required this.type,\n      required this.appBarTitle,\n      this.categoryName,\n      this.categoryIcon,\n      this.parentItem,\n      this.description});\n\n  void unFocusNode(BuildContext context) {\n    FocusScopeNode currentFocus = FocusScope.of(context);\n    if (!currentFocus.hasPrimaryFocus) {\n      currentFocus.unfocus();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n        onTap: () {\n          unFocusNode(context);\n        },\n        child: Scaffold(\n          backgroundColor: blue1,\n          appBar: BasicAppBar(this.appBarTitle),\n          body: Form(\n            key: this.type == 'Income' ? _formKey4 : _formKey5,\n            child: ChangeNotifierProvider<ChangeCategory>(\n              create: (context) => ChangeCategory(),\n              child: ListView(\n                children: [\n                  CategoryName(\n                      this.type,\n                      this.categoryName == null\n                          ? null\n                          : getTranslated(context, this.categoryName!) ??\n                              this.categoryName,\n                      this.categoryIcon),\n                  // Hide ParentCategoryCard when either type is Income or users press on parent category\n                  // Fix this? why not (this.categoryName == null && this.parentCategory != null)\n                  this.type == 'Income' ||\n                          (this.categoryName != null && this.parentItem == null)\n                      ? SizedBox()\n                      : ParentCategoryCard(this.parentItem),\n                  SizedBox(\n                    height: 20.h,\n                  ),\n                  Description(this.description),\n                  Padding(\n                      padding: EdgeInsets.symmetric(vertical: 90.h),\n                      child: Save(\n                          formKey:\n                              this.type == 'Income' ? _formKey4 : _formKey5,\n                          contextEx: this.contextEx,\n                          contextExEdit: this.contextExEdit,\n                          contextIn: this.contextIn,\n                          contextInEdit: this.contextInEdit,\n                          categoryName: this.categoryName,\n                          categoryIcon: this.categoryIcon,\n                          parentItem: this.parentItem,\n                          description: this.description))\n                ],\n              ),\n            ),\n          ),\n        ));\n  }\n}\n\nclass CategoryName extends StatefulWidget {\n  final String type;\n  final String? categoryName;\n  final IconData? categoryIcon;\n  CategoryName(this.type, this.categoryName, this.categoryIcon);\n  @override\n  _CategoryNameState createState() => _CategoryNameState();\n}\n\nclass _CategoryNameState extends State<CategoryName> {\n  // late final FocusNode categoryNameFocusNode;\n  static late TextEditingController categoryNameController;\n  final FocusNode categoryNameFocusNode = FocusNode();\n\n  @override\n  void initState() {\n    super.initState();\n    // categoryNameFocusNode = FocusNode();\n    categoryNameController =\n        TextEditingController(text: widget.categoryName ?? '');\n  }\n\n  // @override\n  // void dispose() {\n  //   categoryNameFocusNode.dispose();\n  //   super.dispose();\n  // }\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      elevation: 7,\n      child: Padding(\n        padding: EdgeInsets.only(left: 10.w, top: 8.h, bottom: 8.h),\n        child: TextFormField(\n          controller: categoryNameController,\n          focusNode: categoryNameFocusNode,\n          onChanged: (value) => {},\n          maxLines: null,\n          cursorColor: blue1,\n          textCapitalization: TextCapitalization.sentences,\n          style: TextStyle(fontSize: 22.sp, fontWeight: FontWeight.bold),\n          validator: (categoryNameInput) {\n            categoryNameInput = categoryNameInput!.trim();\n            if (categoryNameInput.isEmpty) {\n              return getTranslated(context, 'Please fill a category name');\n            } else {\n              bool isIdenticalCategory() {\n                if (widget.type == 'Income') {\n                  for (CategoryItem incomeItem in incomeItems) {\n                    if (categoryNameInput == incomeItem.text) {\n                      return true;\n                    }\n                  }\n                } else {\n                  List<CategoryItem> expenseItems = [];\n                  sharedPrefs.getAllExpenseItemsLists().forEach(\n                      (parentExpenseItem) => parentExpenseItem.forEach(\n                          (expenseItem) => expenseItems.add(expenseItem)));\n                  for (CategoryItem expenseItem in expenseItems) {\n                    if (categoryNameInput == expenseItem.text) {\n                      return true;\n                    }\n                  }\n                }\n                return false;\n              }\n\n              // Show an error if users want to edit to or add an existing category\n              if ((categoryNameInput != widget.categoryName) &&\n                  (isIdenticalCategory())) {\n                return getTranslated(context, 'Category already exists');\n              }\n            }\n          },\n          decoration: InputDecoration(\n              border: InputBorder.none,\n              hintText: getTranslated(context, 'Category name'),\n              hintStyle: TextStyle(\n                  fontSize: 22.sp,\n                  color: grey,\n                  fontStyle: FontStyle.italic,\n                  fontWeight: FontWeight.normal),\n              suffixIcon: categoryNameController.text.length > 0\n                  ? IconButton(\n                      icon: Icon(Icons.clear),\n                      onPressed: () {\n                        categoryNameController.clear();\n                      })\n                  : SizedBox(),\n              icon: Selector<ChangeCategory, IconData?>(\n                  selector: (_, provider) => provider.selectedCategoryIcon,\n                  builder: (context, selectedCategoryIcon, child) {\n                    return GestureDetector(\n                      onTap: () async {\n                        IconData? selectedIcon = await Navigator.push(\n                                context,\n                                MaterialPageRoute(\n                                    builder: (context) =>\n                                        SelectIcon(widget.type))) ??\n                            selectedCategoryIcon;\n\n                        context\n                            .read<ChangeCategory>()\n                            .changeCategoryIcon(selectedIcon);\n                      },\n                      child: Column(\n                        children: [\n                          CircleAvatar(\n                              radius: 20.r,\n                              backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                              child: Icon(\n                                selectedCategoryIcon ??\n                                    widget.categoryIcon ??\n                                    Icons.category_outlined,\n                                size: 25.sp,\n                                color: widget.type == 'Income' ? green : red,\n                              )),\n                          SizedBox(\n                            height: 2,\n                          ),\n                          Text(\n                            'select icon',\n                            style:\n                                TextStyle(fontSize: 11, color: Colors.blueGrey),\n                          )\n                        ],\n                      ),\n                    );\n                  })),\n        ),\n      ),\n    );\n  }\n}\n\nclass ParentCategoryCard extends StatefulWidget {\n  final CategoryItem? parentItem;\n  const ParentCategoryCard(this.parentItem);\n  @override\n  _ParentCategoryCardState createState() => _ParentCategoryCardState();\n}\n\nclass _ParentCategoryCardState extends State<ParentCategoryCard> {\n  @override\n  Widget build(BuildContext context) {\n    return Selector<ChangeCategory, CategoryItem?>(\n        selector: (_, provider) => provider.parentItem,\n        builder: (context, selectedParentItem, child) {\n          selectedParentItem ??= widget.parentItem ??\n              categoryItem(Icons.category_outlined,\n                  getTranslated(context, 'Parent category')!);\n          context.read<ChangeCategory>().parentItem = selectedParentItem;\n          return GestureDetector(\n              onTap: () async {\n                CategoryItem newParentItem = await Navigator.push(\n                    context,\n                    MaterialPageRoute(\n                        builder: (context) => ParentCategoryList()));\n                context.read<ChangeCategory>().changeParentItem(newParentItem);\n              },\n              child: Card(\n                elevation: 7,\n                child: Padding(\n                  padding: EdgeInsets.only(left: 18.w, top: 6.h, bottom: 6.h),\n                  child: Row(\n                    children: [\n                      CircleAvatar(\n                          radius: 20.r,\n                          backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                          child: Icon(\n                            iconData(selectedParentItem),\n                            size: 25.sp,\n                            color: red,\n                          )),\n                      SizedBox(\n                        width: 28.w,\n                      ),\n                      Text(\n                        getTranslated(context, selectedParentItem.text) ??\n                            selectedParentItem.text,\n                        style: selectedParentItem.text ==\n                                getTranslated(context, 'Parent category')!\n                            ? TextStyle(\n                                fontSize: 22.sp,\n                                color: grey,\n                                fontStyle: FontStyle.italic,\n                              )\n                            : TextStyle(\n                                fontSize: 22.sp,\n                                color: red,\n                                fontWeight: FontWeight.bold),\n                      ),\n                      Spacer(),\n                      Icon(\n                        Icons.arrow_forward_ios,\n                        size: 22.sp,\n                      ),\n                      SizedBox(\n                        width: 10.h,\n                      )\n                    ],\n                  ),\n                ),\n              ));\n        });\n  }\n}\n\nclass Description extends StatefulWidget {\n  final String? description;\n  Description(this.description);\n  @override\n  _DescriptionState createState() => _DescriptionState();\n}\n\nclass _DescriptionState extends State<Description> {\n  final FocusNode descriptionFocusNode = FocusNode();\n  static late TextEditingController descriptionController;\n\n  @override\n  void initState() {\n    super.initState();\n    descriptionController =\n        TextEditingController(text: widget.description ?? '');\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      elevation: 7,\n      child: SizedBox(\n        child: Padding(\n          padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 6.h),\n          child: TextFormField(\n              controller: descriptionController,\n              focusNode: descriptionFocusNode,\n              maxLines: null,\n              minLines: 1,\n              cursorColor: blue1,\n              textCapitalization: TextCapitalization.sentences,\n              style: TextStyle(fontSize: 22.sp),\n              decoration: InputDecoration(\n                  border: InputBorder.none,\n                  hintText:\n                      getTranslated(context, 'Description') ?? 'Description',\n                  hintStyle: GoogleFonts.cousine(\n                    fontSize: 21.5.sp,\n                    fontStyle: FontStyle.italic,\n                  ),\n                  suffixIcon: descriptionController.text.length > 0\n                      ? IconButton(\n                          icon: Icon(Icons.clear),\n                          onPressed: () {\n                            descriptionController.clear();\n                          })\n                      : SizedBox(),\n                  icon: Padding(\n                    padding: EdgeInsets.only(right: 10.w),\n                    child: Icon(\n                      Icons.description_outlined,\n                      size: 35.sp,\n                      color: Colors.blueGrey,\n                    ),\n                  ))),\n        ),\n      ),\n    );\n  }\n}\n\nclass Save extends StatefulWidget {\n  final GlobalKey<FormState> formKey;\n  final BuildContext? contextEx, contextExEdit, contextIn, contextInEdit;\n  final String? categoryName, description;\n  final IconData? categoryIcon;\n  final CategoryItem? parentItem;\n  const Save(\n      {required this.formKey,\n      this.contextEx,\n      this.contextExEdit,\n      this.contextIn,\n      this.contextInEdit,\n      this.categoryName,\n      this.categoryIcon,\n      this.parentItem,\n      this.description});\n\n  @override\n  _SaveState createState() => _SaveState();\n}\n\nclass _SaveState extends State<Save> {\n  @override\n  Widget build(BuildContext context) {\n    void saveCategoryFunction() {\n      if (widget.formKey.currentState!.validate()) {\n        String? finalDescription = _DescriptionState.descriptionController.text;\n        String finalCategoryName =\n            _CategoryNameState.categoryNameController.text;\n        IconData? finalCategoryIcon =\n            Provider.of<ChangeCategory>(context, listen: false)\n                .selectedCategoryIcon;\n        // trim to get a real input\n        finalCategoryName = finalCategoryName.trim();\n        finalDescription = finalDescription.trim();\n\n        CategoryItem categoryItem(IconData iconData) => CategoryItem(\n            iconData.codePoint,\n            iconData.fontPackage,\n            iconData.fontFamily,\n            finalCategoryName,\n            finalDescription);\n\n        void updateCategory() {\n          Provider.of<ChangeExpenseItemEdit>(widget.contextExEdit!,\n                  listen: false)\n              .getAllExpenseItems();\n          Provider.of<ChangeExpenseItem>(widget.contextEx!, listen: false)\n              .getAllExpenseItems();\n        }\n\n        if (widget.contextInEdit != null) {\n          print('income');\n          if (widget.categoryName != null) {\n            print('edit');\n            if (finalCategoryName != widget.categoryName ||\n                widget.categoryIcon != finalCategoryIcon ||\n                widget.description != finalDescription) {\n              print('something changed');\n              incomeItems\n                  .removeWhere((item) => item.text == widget.categoryName);\n            }\n          }\n          incomeItems.add(categoryItem(finalCategoryIcon ??\n              widget.categoryIcon ??\n              Icons.category_outlined));\n          sharedPrefs.saveItems('income items', incomeItems);\n          Provider.of<ChangeIncomeItemEdit>(widget.contextInEdit!,\n                  listen: false)\n              .getIncomeItems();\n          if (widget.contextIn != null) {\n            Provider.of<ChangeIncomeItem>(widget.contextIn!, listen: false)\n                .getIncomeItems();\n          }\n        } else {\n          print('expense');\n          CategoryItem? finalParent = context.read<ChangeCategory>().parentItem;\n\n          if ((widget.categoryName == null) && (widget.parentItem == null)) {\n            CategoryItem item =\n                categoryItem(finalCategoryIcon ?? Icons.category_outlined);\n            print('add expense');\n            if (finalParent!.text ==\n                getTranslated(context, 'Parent category')!) {\n              print('add parent');\n              sharedPrefs.saveItems(finalCategoryName, [item]);\n\n              var parentExpenseItemNames = sharedPrefs.parentExpenseItemNames;\n              parentExpenseItemNames.add(finalCategoryName);\n              sharedPrefs.parentExpenseItemNames = parentExpenseItemNames;\n            } else {\n              print('add new expense category to an existing parent');\n              List<CategoryItem> items = sharedPrefs.getItems(finalParent.text);\n              items.add(item);\n              sharedPrefs.saveItems(finalParent.text, items);\n            }\n            updateCategory();\n          } else {\n            print('edit');\n            if (widget.parentItem == null) {\n              print('edit parent only');\n              if (finalCategoryName != widget.categoryName ||\n                  widget.categoryIcon != finalCategoryIcon ||\n                  widget.description != finalDescription) {\n                print('something changed');\n                List<CategoryItem> items =\n                    sharedPrefs.getItems(widget.categoryName!);\n                items.removeAt(0);\n                items.insert(\n                    0, categoryItem(finalCategoryIcon ?? widget.categoryIcon!));\n\n                sharedPrefs.saveItems(finalCategoryName, items);\n                if (finalCategoryName != widget.categoryName) {\n                  print('parent name changed');\n                  var parentExpenseItemNames =\n                      sharedPrefs.parentExpenseItemNames;\n\n                  parentExpenseItemNames.removeWhere((parentExpenseItemName) =>\n                      widget.categoryName == parentExpenseItemName);\n                  parentExpenseItemNames.insert(0, finalCategoryName);\n                  sharedPrefs.parentExpenseItemNames = parentExpenseItemNames;\n                }\n                updateCategory();\n              }\n            } else {\n              print('edit category');\n              if (finalParent!.text != widget.parentItem!.text ||\n                  widget.categoryIcon != finalCategoryIcon ||\n                  finalCategoryName != widget.categoryName ||\n                  widget.description != finalDescription) {\n                print('something changed');\n                void itemsAdd(List<CategoryItem> items) {\n                  items.add(\n                      categoryItem(finalCategoryIcon ?? widget.categoryIcon!));\n                }\n\n                List<CategoryItem> items =\n                    sharedPrefs.getItems(widget.parentItem!.text);\n                items.removeWhere((item) => item.text == widget.categoryName);\n\n                if (finalParent.text != widget.parentItem!.text) {\n                  print('edit parent of expense category');\n                  List<CategoryItem> itemsMovedTo =\n                      sharedPrefs.getItems(finalParent.text);\n                  itemsAdd(itemsMovedTo);\n                  sharedPrefs.saveItems(finalParent.text, itemsMovedTo);\n                } else {\n                  print('edit other things');\n                  itemsAdd(items);\n                }\n                sharedPrefs.saveItems(widget.parentItem!.text, items);\n                updateCategory();\n              }\n            }\n          }\n        }\n        Navigator.pop(context);\n      }\n    }\n\n    if (widget.categoryName == null && widget.parentItem == null) {\n      return SaveButton(false, saveCategoryFunction, null);\n    } else {\n      return SaveAndDeleteButton(\n          saveAndDeleteInput: false,\n          saveCategory: saveCategoryFunction,\n          categoryName: widget.categoryName,\n          parentExpenseItem:\n              widget.parentItem == null ? null : widget.parentItem!.text,\n          contextEx: widget.contextEx,\n          contextExEdit: widget.contextExEdit,\n          contextIn: widget.contextIn,\n          contextInEdit: widget.contextInEdit);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/analysis.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/chart_pie.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/dropdown_box.dart';\nimport 'package:money_assistant_2608/project/classes/input_model.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\nimport '../provider.dart';\nimport 'report.dart';\n\nfinal List<InputModel> chartDataNull = [\n  InputModel(\n      id: null,\n      type: null,\n      amount: 1,\n      category: '',\n      description: null,\n      date: null,\n      time: null,\n      color: const Color.fromRGBO(0, 220, 252, 1))\n];\n\nclass Analysis extends StatefulWidget {\n  @override\n  _AnalysisState createState() => _AnalysisState();\n}\n\nclass _AnalysisState extends State<Analysis> {\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider<ChangeSelectedDate>(\n      create: (context) => ChangeSelectedDate(),\n      child: DefaultTabController(\n        initialIndex: 0,\n        length: 2,\n        child: Scaffold(\n            backgroundColor: blue1,\n            appBar: InExAppBar(false),\n            body: Selector<ChangeSelectedDate, String?>(\n                selector: (_, changeSelectedDate) =>\n                    changeSelectedDate.selectedAnalysisDate,\n                builder: (context, selectedAnalysisDate, child) {\n                  selectedAnalysisDate ??= sharedPrefs.selectedDate;\n                  ListView listViewChild(String type) => ListView(\n                        children: [\n                          ShowDate(true, selectedAnalysisDate!),\n                          ShowDetails(type, selectedAnalysisDate),\n                        ],\n                      );\n                  return TabBarView(\n                    children: [\n                      listViewChild('Expense'),\n                      listViewChild('Income')\n                    ],\n                  );\n                })),\n      ),\n    );\n  }\n}\n\nclass ShowDate extends StatelessWidget {\n  final bool forAnalysis;\n  final String selectedDate;\n  const ShowDate(this.forAnalysis, this.selectedDate);\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n        padding: EdgeInsets.symmetric(\n          horizontal: 10.w,\n          vertical: 25.h,\n        ),\n        child: Row(\n          children: [\n            Icon(\n              Icons.calendar_today,\n              size: 27.sp,\n              color: Color.fromRGBO(82, 179, 252, 1),\n            ),\n            SizedBox(\n              width: 10.w,\n            ),\n            DateDisplay(this.selectedDate),\n            Spacer(),\n            DropDownBox(this.forAnalysis, this.selectedDate)\n          ],\n        ));\n  }\n}\n\nclass DateDisplay extends StatelessWidget {\n  final String selectedDate;\n  DateDisplay(this.selectedDate);\n\n  @override\n  Widget build(BuildContext context) {\n    final String today = DateFormat(sharedPrefs.dateFormat).format(todayDT);\n    String since = getTranslated(context, 'Since')!;\n    TextStyle style =\n        GoogleFonts.aBeeZee(fontSize: 20.sp, fontWeight: FontWeight.bold);\n\n    Map<String, Widget> dateMap = {\n      'Today': Text('$today', style: style),\n      'This week': Text(\n        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisWeek)}',\n        style: style,\n      ),\n      'This month': Text(\n          '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisMonth)}',\n          style: style),\n      'This quarter': Text(\n        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisQuarter)}',\n        style: style,\n      ),\n      'This year': Text(\n        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisYear)}',\n        style: style,\n      ),\n      'All': Text('${getTranslated(context, 'All')!}', style: style)\n    };\n    var dateListKey = dateMap.keys.toList();\n    var dateListValue = dateMap.values.toList();\n\n    for (int i = 0; i < dateListKey.length; i++) {\n      if (selectedDate == dateListKey[i]) {\n        return dateListValue[i];\n      }\n    }\n    return Container();\n  }\n}\n\nclass ShowMoneyFrame extends StatelessWidget {\n  final String type;\n  final double typeValue, balance;\n  const ShowMoneyFrame(this.type, this.typeValue, this.balance);\n\n  @override\n  Widget build(BuildContext context) {\n    Widget rowFrame(String typeName, double value) {\n      return Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            getTranslated(context, typeName)!,\n            style: TextStyle(fontSize: 22.sp),\n          ),\n          Expanded(\n            child: Text(\n              format(value) + ' ' + currency,\n              style: GoogleFonts.aBeeZee(\n                  fontSize: format(value.toDouble()).length > 22\n                      ? 16.5.sp\n                      : format(value.toDouble()).length > 17\n                          ? 19.5.sp\n                          : 22.sp),\n              // fix here: Overflow is a temporary parameter, fix whatever it is so that the money value will never overflow\n              overflow: TextOverflow.ellipsis,\n              textAlign: TextAlign.end,\n            ),\n          ),\n        ],\n      );\n    }\n\n    return Container(\n      decoration: BoxDecoration(\n          color: Color.fromRGBO(239, 247, 253, 1),\n          borderRadius: BorderRadius.circular(40.r),\n          border: Border.all(\n            color: grey,\n            width: 0.4.w,\n          )),\n      child: Padding(\n        padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 18.5.h),\n        child: Column(\n          children: [\n            rowFrame(this.type, typeValue),\n            SizedBox(\n              height: 12.5.h,\n            ),\n            rowFrame('Balance', this.balance)\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass ShowDetails extends StatefulWidget {\n  final String type, selectedDate;\n  ShowDetails(this.type, this.selectedDate);\n\n  @override\n  _ShowDetailsState createState() => _ShowDetailsState();\n}\n\nclass _ShowDetailsState extends State<ShowDetails> {\n  Widget showInExDetails(\n    BuildContext context,\n    List<InputModel> transactionsSorted,\n  ) {\n    List<CategoryItem> itemList = widget.type == 'Income'\n        ? createItemList(\n            transactions: transactionsSorted,\n            forAnalysisPage: true,\n            isIncomeType: true,\n            forSelectIconPage: false)\n        : createItemList(\n            transactions: transactionsSorted,\n            forAnalysisPage: true,\n            isIncomeType: false,\n            forSelectIconPage: false);\n\n    return Column(\n        children: List.generate(itemList.length, (int) {\n      return\n          // SwipeActionCell(\n          // backgroundColor: Colors.transparent,\n          //   key: ObjectKey(transactionsSorted[int]),\n          //   performsFirstActionWithFullSwipe: true,\n          //   trailingActions: <SwipeAction>[\n          //     SwipeAction(\n          //         title: \"Delete\",\n          //         onTap: (CompletionHandler handler) async {\n          //           Future<void> onDeletion() async {\n          //             await handler(true);\n          //             transactionsSorted.removeAt(int);\n          //             customToast(context, 'Transactions has been deleted');\n          //             setState(() {});\n          //           }\n          //\n          //           Platform.isIOS\n          //               ? await iosDialog(\n          //                   context,\n          //                   'Deleted data can not be recovered. Are you sure you want to Delete All Transactions In This Category?',\n          //                   'Delete',\n          //                   onDeletion)\n          //               : await androidDialog(\n          //                   context,\n          //                   'Deleted data can not be recovered. Are you sure you want to Delete All Transactions In This Category?',\n          //                   'Delete',\n          //                   onDeletion);\n          //         },\n          //         color: red),\n          //   ], child:\n          GestureDetector(\n              onTap: () {\n                Navigator.push(\n                    context,\n                    MaterialPageRoute(\n                        builder: (context) => Report(\n                              type: widget.type,\n                              category: itemList[int].text,\n                              selectedDate: widget.selectedDate,\n                              icon: iconData(itemList[int]),\n                            ))).then((value) => setState(() {}));\n              },\n              child: CategoryDetails(\n                  widget.type,\n                  getTranslated(context, itemList[int].text) ??\n                      itemList[int].text,\n                  transactionsSorted[int].amount!,\n                  transactionsSorted[int].color,\n                  iconData(itemList[int]),\n                  false));\n    }));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    late Map<String, double> chartDataMap;\n    return FutureBuilder<List<InputModel>>(\n        initialData: [],\n        future: DB.inputModelList(),\n        builder:\n            (BuildContext context, AsyncSnapshot<List<InputModel>> snapshot) {\n          connectionUI(snapshot);\n          if (snapshot.connectionState == ConnectionState.waiting) {\n            return ShowNullDetail(0, null, this.widget.type, false);\n          }\n          if (snapshot.data == null) {\n            return ShowNullDetail(0, chartDataNull, this.widget.type, true);\n          } else {\n            double income = 0, expense = 0, balance = 0;\n\n            List<InputModel> allTransactions =\n                filterData(context, snapshot.data!, widget.selectedDate);\n\n            if (allTransactions.length > 0) {\n              //prepare for MoneyFrame\n\n              List<double?> incomeList = [], expenseList = [];\n              incomeList = allTransactions\n                  .map((data) {\n                    if (data.type == 'Income') {\n                      return data.amount;\n                    }\n                  })\n                  .where((element) => element != null)\n                  .toList();\n\n              expenseList = allTransactions\n                  .map((data) {\n                    if (data.type == 'Expense') {\n                      return data.amount;\n                    }\n                  })\n                  .where((element) => element != null)\n                  .toList();\n\n              if (incomeList.length > 0) {\n                for (int i = 0; i < incomeList.length; i++) {\n                  income = income + incomeList[i]!;\n                }\n              }\n              if (expenseList.length > 0) {\n                for (int i = 0; i < expenseList.length; i++) {\n                  expense = expense + expenseList[i]!;\n                }\n              }\n              balance = income - expense;\n\n              // prepare for InExDetails\n              if (this.widget.type == 'Income') {\n                allTransactions = allTransactions\n                    .map((data) {\n                      if (data.type == 'Income') {\n                        return inputModel(data);\n                      }\n                    })\n                    .where((element) => element != null)\n                    .cast<InputModel>()\n                    .toList();\n              } else {\n                allTransactions = allTransactions\n                    .map((data) {\n                      if (data.type == 'Expense') {\n                        return inputModel(data);\n                      }\n                    })\n                    .where((element) => element != null)\n                    .cast<InputModel>()\n                    .toList();\n              }\n            }\n\n            if (allTransactions.length == 0) {\n              return ShowNullDetail(\n                  balance, chartDataNull, this.widget.type, true);\n            } else {\n              List<InputModel> transactionsSorted = [\n                InputModel(\n                  type: this.widget.type,\n                  amount: allTransactions[0].amount,\n                  category: allTransactions[0].category,\n                )\n              ];\n\n              int i = 1;\n              //cmt: chartDataListDetailed.length must be greater than 2 to execute\n              while (i < allTransactions.length) {\n                allTransactions\n                    .sort((a, b) => a.category!.compareTo(b.category!));\n\n                if (i == 1) {\n                  chartDataMap = {\n                    allTransactions[0].category!: allTransactions[0].amount!\n                  };\n                }\n\n                if (allTransactions[i].category ==\n                    allTransactions[i - 1].category) {\n                  chartDataMap.update(allTransactions[i].category!,\n                      (value) => (value + allTransactions[i].amount!),\n                      ifAbsent: () => (allTransactions[i - 1].amount! +\n                          allTransactions[i].amount!));\n                  i++;\n                } else {\n                  chartDataMap.addAll({\n                    allTransactions[i].category!: allTransactions[i].amount!\n                  });\n\n                  i++;\n                }\n                transactionsSorted = chartDataMap.entries\n                    .map((entry) => InputModel(\n                          type: this.widget.type,\n                          category: entry.key,\n                          amount: entry.value,\n                        ))\n                    .toList();\n              }\n\n              void recurringFunc({required int i, n}) {\n                if (n > i) {\n                  for (int c = 1; c <= n - i; c++) {\n                    transactionsSorted[i + c - 1].color = chartPieColors[c - 1];\n                    recurringFunc(i: i, n: c);\n                  }\n                }\n              }\n\n              for (int n = 1; n <= transactionsSorted.length; n++) {\n                transactionsSorted[n - 1].color = chartPieColors[n - 1];\n                recurringFunc(i: chartPieColors.length, n: n);\n              }\n              return Column(\n                children: [\n                  ShowMoneyFrame(this.widget.type,\n                      this.widget.type == 'Income' ? income : expense, balance),\n                  SizedBox(height: 360.h, child: ChartPie(transactionsSorted)),\n                  showInExDetails(\n                    context,\n                    // sum value of transactions having a same category to one\n                    transactionsSorted,\n                  )\n                ],\n              );\n            }\n          }\n        });\n  }\n}\n\nclass ShowNullDetail extends StatelessWidget {\n  final double balanceValue;\n  final List<InputModel>? chartData;\n  final String type;\n  final bool connection;\n  ShowNullDetail(this.balanceValue, this.chartData, this.type, this.connection);\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        ShowMoneyFrame(this.type, 0, this.balanceValue),\n        SizedBox(\n            height: 360.h,\n            child: connection == false ? null : ChartPie(this.chartData!)),\n        CategoryDetails(\n            this.type,\n            getTranslated(context, 'Category') ?? 'Category',\n            0,\n            this.type == 'Income' ? green : red,\n            Icons.category_outlined,\n            true)\n      ],\n    );\n  }\n}\n\nclass CategoryDetails extends StatelessWidget {\n  final String type, category;\n  final double amount;\n  final Color? color;\n  final IconData icon;\n  final bool forNullDetail;\n  CategoryDetails(this.type, this.category, this.amount, this.color, this.icon,\n      this.forNullDetail);\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n        color: white,\n        elevation: 3,\n        shape:\n            RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r)),\n        child: Padding(\n          padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 15.h),\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              Icon(\n                this.icon,\n                color: forNullDetail\n                    ? this.type == 'Income'\n                        ? green\n                        : red\n                    : this.color,\n                size: 23.sp,\n              ),\n              Expanded(\n                child: Padding(\n                  padding: EdgeInsets.only(left: 15.w, right: 10.w),\n                  child: Text(\n                    this.category,\n                    style: TextStyle(fontSize: 20.sp),\n                    overflow: TextOverflow.ellipsis,\n                    textAlign: TextAlign.start,\n                  ),\n                ),\n              ),\n              // attention: This widget will never overflow\n              Flexible(\n                flex: 0,\n                child: Text(\n                  // '${this.color!.red},' + '${this.color!.green},' + '${this.color!.blue},',\n                  format(amount) + ' ' + currency,\n                  style: GoogleFonts.aBeeZee(fontSize: 20.sp),\n                  overflow: TextOverflow.ellipsis,\n                  textAlign: TextAlign.end,\n                ),\n              ),\n              SizedBox(\n                width: 10.w,\n              ),\n              forNullDetail\n                  ? SizedBox()\n                  : Icon(\n                      Icons.arrow_forward_ios,\n                      size: 18.sp,\n                    ),\n            ],\n          ),\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/calendar.dart",
    "content": "import 'dart:collection';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_swipe_action_cell/core/cell.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/classes/alert_dialog.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/custom_toast.dart';\nimport 'package:money_assistant_2608/project/classes/input_model.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:table_calendar/table_calendar.dart';\nimport 'dart:io' show Platform;\n\nimport '../classes/input_model.dart';\nimport 'edit.dart';\n\nclass Calendar extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n        backgroundColor: blue1,\n        appBar: BasicAppBar(getTranslated(context, 'Calendar')!),\n        body: CalendarBody());\n  }\n}\n\nclass CalendarBody extends StatefulWidget {\n  @override\n  _CalendarBodyState createState() => _CalendarBodyState();\n}\n\nclass _CalendarBodyState extends State<CalendarBody> {\n  CalendarFormat _calendarFormat = CalendarFormat.month;\n  RangeSelectionMode _rangeSelectionMode = RangeSelectionMode\n      .toggledOff; // Can be toggled on/off by longpressing a date\n  DateTime _focusedDay = DateTime.now(),\n      today = DateTime(\n          DateTime.now().year, DateTime.now().month, DateTime.now().day);\n  DateTime? _selectedDay, _rangeStart, _rangeEnd;\n  late Map<DateTime, List<InputModel>> transactions = {};\n  late ValueNotifier<List<InputModel>> _selectedEvents;\n\n  @override\n  void initState() {\n    super.initState();\n    _selectedDay = _focusedDay;\n  }\n\n  @override\n  void dispose() {\n    // _calendarController.dispose();\n    super.dispose();\n  }\n\n  int getHashCode(DateTime key) {\n    return key.day * 1000000 + key.month * 10000 + key.year;\n  }\n\n  /// Returns a list of [DateTime] objects from [first] to [last], inclusive.\n  List<DateTime> daysInRange(DateTime first, DateTime last) {\n    final dayCount = last.difference(first).inDays + 1;\n    return List.generate(\n      dayCount,\n      (index) => DateTime.utc(first.year, first.month, first.day + index),\n    );\n  }\n\n  Widget buildEvents(List<InputModel>? transactions) {\n    Color colorCategory;\n    if (transactions == null) {\n      return Container();\n    }\n    List<CategoryItem> itemList = createItemList(\n      transactions: transactions,\n      forAnalysisPage: false,\n      forSelectIconPage: false,\n      isIncomeType: false,\n    );\n    return ListView.builder(\n        shrinkWrap: true,\n        itemCount: itemList.length,\n        itemBuilder: (context, int) {\n          colorCategory =\n              transactions[int].type == 'Income' ? Colors.lightGreen : red;\n          return GestureDetector(\n              onTap: () {\n                Navigator.push(\n                    context,\n                    MaterialPageRoute(\n                        builder: (context) => Edit(\n                              inputModel: transactions[int],\n                              categoryIcon: iconData(itemList[int]),\n                            ))).then((value) => setState(() {}));\n              },\n              child: SwipeActionCell(\n                key: ObjectKey(transactions[int]),\n                performsFirstActionWithFullSwipe: true,\n                trailingActions: <SwipeAction>[\n                  SwipeAction(\n                      title: getTranslated(context, 'Delete') ?? 'Delete',\n                      //setState makes handler experience lagging\n                      onTap: (CompletionHandler handler)  {\n                        Platform.isIOS\n                            ? iosDialog(\n                                context,\n                                'Are you sure you want to delete this transaction?',\n                                'Delete', () {\n                                DB.delete(transactions[int].id!);\n                                setState(() {});\n                                customToast(\n                                    context, 'Transaction has been deleted');\n                              })\n                            : androidDialog(\n                                context,\n                                'Are you sure you want to delete this transaction?',\n                                'Delete', () {\n                                DB.delete(transactions[int].id!);\n                                setState(() {});\n                                customToast(\n                                    context, 'Transaction has been deleted');\n                              });\n                      },\n                      color: red),\n                  SwipeAction(\n                      title: getTranslated(context, 'Add') ?? 'Add',\n                      onTap: (CompletionHandler handler) {\n                        var model = transactions[int];\n                        model.id = null;\n                        DB.insert(model);\n                        setState(() {});\n                        customToast(context, 'Transaction has been updated');\n                      },\n                      color: Color.fromRGBO(255, 183, 121, 1)),\n                ],\n                child: Column(\n                  children: [\n                    Container(\n                      color: white,\n                      child: Padding(\n                        padding: EdgeInsets.symmetric(\n                            horizontal: 15.w, vertical: 15.h),\n                        child: Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: [\n                            Icon(\n                              iconData(itemList[int]),\n                              color: colorCategory,\n                            ),\n                            SizedBox(\n                              width: 150.w,\n                              child: Padding(\n                                padding:\n                                    EdgeInsets.only(left: 15.w, right: 10.w),\n                                child: Text(\n                                    getTranslated(\n                                            context, itemList[int].text) ??\n                                        itemList[int].text,\n                                    style: TextStyle(\n                                      fontSize: 18.sp,\n                                    ),\n                                    overflow: TextOverflow.ellipsis),\n                              ),\n                            ),\n                            Expanded(\n                              child: Text('(${transactions[int].description})',\n                                  style: TextStyle(\n                                      fontSize: 14.sp,\n                                      fontStyle: FontStyle.italic),\n                                  overflow: TextOverflow.fade),\n                            ),\n                            //this widget will never overflow\n                            Flexible(\n                              flex: 0,\n                              child: Padding(\n                                padding:\n                                    EdgeInsets.only(right: 10.w, left: 7.w),\n                                child: Text(\n                                    format(transactions[int].amount!) +\n                                        ' ' +\n                                        currency,\n                                    style: GoogleFonts.aBeeZee(\n                                      fontSize:\n                                          format(transactions[int].amount!)\n                                                      .length >\n                                                  15\n                                              ? 16.sp\n                                              : 17.sp,\n                                    ),\n                                    overflow: TextOverflow.ellipsis),\n                              ),\n                            ),\n                            Icon(\n                              Icons.arrow_forward_ios,\n                              size: 15.5.sp,\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                    Divider(\n                      height: 0,\n                      thickness: 0.25.h,\n                      indent: 20.w,\n                      color: grey,\n                      // color: Color.fromRGBO(213, 215, 217, 1),\n                    ),\n                  ],\n                ),\n              ));\n        });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FutureBuilder<List<InputModel>>(\n        initialData: [],\n        future: DB.inputModelList(),\n        builder: (context, snapshot) {\n          connectionUI(snapshot);\n          Map<String, List<InputModel>> map = {};\n          if (snapshot.data != null) {\n            for (int i = 0; i < snapshot.data!.length; i++) {\n              String description = snapshot.data![i].description!;\n              InputModel map1 = InputModel(\n                  id: snapshot.data![i].id,\n                  type: snapshot.data![i].type,\n                  amount: snapshot.data![i].amount,\n                  category: snapshot.data![i].category,\n                  description: description,\n                  date: snapshot.data![i].date,\n                  time: snapshot.data![i].time);\n\n              void updateMapValue<K, V>(Map<K, List<V>> map, K key, V value) =>\n                  map.update(key, (list) => list..add(value),\n                      ifAbsent: () => [value]);\n\n              updateMapValue(\n                map,\n                '${snapshot.data![i].date}',\n                map1,\n              );\n            }\n            transactions = map.map((key, value) =>\n                MapEntry(DateFormat('dd/MM/yyyy').parse(key), value));\n          }\n\n          late LinkedHashMap linkedHashedMapTransactions =\n              LinkedHashMap<DateTime, List<InputModel>>(\n            equals: isSameDay,\n            hashCode: getHashCode,\n          )..addAll(transactions);\n\n          List<InputModel> transactionsForDay(DateTime? day) =>\n              linkedHashedMapTransactions[day] ?? [];\n\n          if (_selectedDay != null) {\n            _selectedEvents = ValueNotifier(transactionsForDay(_selectedDay));\n          }\n\n          List<InputModel> _getEventsForRange(DateTime start, DateTime end) {\n            final days = daysInRange(start, end);\n\n            return [\n              for (final d in days) ...transactionsForDay(d),\n            ];\n          }\n\n          void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {\n            if (!isSameDay(_selectedDay, selectedDay)) {\n              setState(() {\n                _selectedDay = selectedDay;\n                _focusedDay = focusedDay;\n                _rangeStart = null; // Important to clean those\n                _rangeEnd = null;\n                _rangeSelectionMode = RangeSelectionMode.toggledOff;\n              });\n              _selectedEvents.value = transactionsForDay(selectedDay);\n            }\n          }\n\n          void _onRangeSelected(\n              DateTime? start, DateTime? end, DateTime focusedDay) {\n            setState(() {\n              _selectedDay = null;\n              _focusedDay = focusedDay;\n              _rangeStart = start;\n              _rangeEnd = end;\n              _rangeSelectionMode = RangeSelectionMode.toggledOn;\n              if (start != null && end != null) {\n                _selectedEvents = ValueNotifier(_getEventsForRange(start, end));\n              } else if (start != null) {\n                _selectedEvents = ValueNotifier(transactionsForDay(start));\n              } else if (end != null) {\n                _selectedEvents = ValueNotifier(transactionsForDay(end));\n              }\n            });\n          }\n\n          return Column(children: [\n            TableCalendar<InputModel>(\n              availableCalendarFormats: {\n                CalendarFormat.month: getTranslated(context, 'Month')!,\n                CalendarFormat.twoWeeks: getTranslated(context, '2 weeks')!,\n                CalendarFormat.week: getTranslated(context, 'Week')!\n              },\n              locale: Localizations.localeOf(context).languageCode,\n              // sixWeekMonthsEnforced: true,\n              // shouldFillViewport: true,\n              rowHeight: 52.h,\n              daysOfWeekHeight: 22.h,\n              firstDay: DateTime.utc(2000, 01, 01),\n              lastDay: DateTime.utc(2050, 01, 01),\n              focusedDay: _focusedDay,\n              calendarFormat: _calendarFormat,\n              selectedDayPredicate: (day) => isSameDay(_selectedDay, day),\n              rangeStartDay: _rangeStart,\n              rangeEndDay: _rangeEnd,\n              rangeSelectionMode: _rangeSelectionMode,\n              eventLoader: transactionsForDay,\n              startingDayOfWeek: StartingDayOfWeek.monday,\n              calendarStyle: CalendarStyle(\n                  // weekendTextStyle:\n                  // TextStyle().copyWith(color: Colors.blue[800]),\n                  ),\n\n              headerStyle: HeaderStyle(\n                formatButtonTextStyle: TextStyle(fontSize: 18.sp),\n                formatButtonDecoration: BoxDecoration(\n                    boxShadow: [BoxShadow()],\n                    color: blue2,\n                    borderRadius: BorderRadius.circular(25.r)),\n              ),\n              calendarBuilders: CalendarBuilders(\n                selectedBuilder: (context, date, _) {\n                  return Container(\n                    //see difference between margin and padding below: Margin: Out (for itself), padding: In (for its child)\n                    // margin: EdgeInsets.all(4.0.w),\n                    padding: EdgeInsets.only(top: 6.0.h, left: 6.0.w),\n                    color: Color.fromRGBO(255, 168, 68, 1),\n                    width: 46.w,\n                    height: 46.h,\n                    child: Text(\n                      '${date.day}',\n                      style: TextStyle().copyWith(fontSize: 17.0.sp),\n                    ),\n                  );\n                },\n                todayBuilder: (context, date, _) {\n                  return Container(\n                    padding: EdgeInsets.only(top: 6.0.w, left: 6.0.w),\n                    color: blue2,\n                    width: 46.w,\n                    height: 46.h,\n                    child: Text(\n                      '${date.day}',\n                      style: TextStyle().copyWith(fontSize: 17.0.sp),\n                    ),\n                  );\n                },\n                markerBuilder: (context, date, events) {\n                  if (events.isNotEmpty) {\n                    return Positioned(\n                      right: 1.w,\n                      bottom: 1.h,\n                      child: _buildEventsMarker(date, events),\n                    );\n                  }\n                },\n              ),\n\n              onDaySelected: _onDaySelected,\n              onRangeSelected: _onRangeSelected,\n              onFormatChanged: (format) {\n                if (_calendarFormat != format) {\n                  setState(() {\n                    _calendarFormat = format;\n                  });\n                }\n              },\n              onPageChanged: (focusedDay) {\n                _focusedDay = focusedDay;\n              },\n              pageJumpingEnabled: true,\n            ),\n            SizedBox(height: 8.0.h),\n            Expanded(\n              child: ValueListenableBuilder<List<InputModel>>(\n                valueListenable: _selectedEvents,\n                builder: (context, value, _) {\n                  return Column(children: [\n                    Balance(value),\n                    Expanded(child: buildEvents(value))\n                  ]);\n                },\n              ),\n            )\n          ]);\n        });\n  }\n}\n\nWidget _buildEventsMarker(DateTime date, List events) {\n  double width = events.length < 100 ? 18.w : 28.w;\n  return AnimatedContainer(\n    duration: const Duration(milliseconds: 300),\n    decoration: BoxDecoration(\n      shape: BoxShape.rectangle,\n      color: Color.fromRGBO(67, 125, 229, 1),\n    ),\n    width: width,\n    height: 18.0.h,\n    child: Center(\n      child: Text(\n        '${events.length}',\n        style: TextStyle().copyWith(\n          color: white,\n          fontSize: 13.0.sp,\n        ),\n      ),\n    ),\n  );\n}\n\nclass Balance extends StatefulWidget {\n  final List? events;\n  Balance(this.events);\n  @override\n  _BalanceState createState() => _BalanceState();\n}\n\nclass _BalanceState extends State<Balance> {\n  @override\n  Widget build(BuildContext context) {\n    double income = 0, expense = 0, balance = 0;\n    if (widget.events != null) {\n      for (int i = 0; i < widget.events!.length; i++) {\n        if (widget.events![i].type == 'Income') {\n          income = income + widget.events![i].amount;\n        } else {\n          expense = expense + widget.events![i].amount;\n        }\n        balance = income - expense;\n      }\n    }\n    Widget summaryFrame(String type, double amount, color) => Column(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            // this widget will never overflow\n            Text(\n              getTranslated(context, type)!,\n              style: TextStyle(\n                  color: color,\n                  fontSize: 15.sp,\n                  fontStyle: FontStyle.italic,\n                  fontWeight: FontWeight.bold),\n            ),\n            Text(format(amount.toDouble()) + ' ' + currency,\n                style: GoogleFonts.aBeeZee(\n                    color: color,\n                    fontSize: (format(amount.toDouble()).length > 19)\n                        ? 11.5.sp\n                        : format(amount.toDouble()).length > 14\n                            ? 14.sp\n                            : 18.sp,\n                    fontStyle: FontStyle.italic,\n                    fontWeight: FontWeight.bold),\n                overflow: TextOverflow.ellipsis)\n          ],\n        );\n    return Container(\n      color: Colors.white54,\n      height: 69.h,\n      child: Padding(\n        padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.h),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            summaryFrame(\n              'INCOME',\n              income,\n              Colors.lightGreen,\n            ),\n            Padding(\n                padding: EdgeInsets.symmetric(horizontal: 5.w),\n                child: summaryFrame('EXPENSE', expense, red)),\n            Flexible(\n                child: summaryFrame('TOTAL BALANCE', balance, Colors.black)),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/currency.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/language.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\n\nimport '../provider.dart';\n\nclass Currency extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    List<Language> languageList = Language.languageList;\n    return Scaffold(\n      appBar: AppBar(\n          backgroundColor: blue3,\n          title: Text(\n              getTranslated(context, 'Select a currency') ??\n                  'Select a currency',\n              style: TextStyle(fontSize: 21.sp)),\n          actions: [\n            Padding(\n              padding: EdgeInsets.only(right: 5.w),\n              child: TextButton(\n                  child: Text(\n                    getTranslated(context, 'Save') ?? 'Save',\n                    style: TextStyle(fontSize: 18.5.sp, color: white),\n                  ),\n                  onPressed: () => Navigator.pop(context)),\n            )\n          ]),\n      body: ChangeNotifierProvider<OnCurrencySelected>(\n          create: (context) => OnCurrencySelected(),\n          builder: (context, widget) => ListView.builder(\n              itemCount: languageList.length,\n              itemBuilder: (context, int) {\n                return GestureDetector(\n                  behavior: HitTestBehavior.translucent,\n                  onTap: () {\n                    context.read<OnCurrencySelected>().onCurrencySelected(\n                        '${languageList[int].languageCode}_${languageList[int].countryCode}');\n                  },\n                  child: Column(\n                    children: [\n                      Padding(\n                        padding: EdgeInsets.symmetric(\n                            horizontal: 15.w, vertical: 10.h),\n                        child: Row(\n                          children: [\n                            Text(\n                              Language.languageList[int].flag,\n                              style: TextStyle(fontSize: 45.sp),\n                            ),\n                            SizedBox(width: 30.w),\n                            Column(\n                              mainAxisAlignment: MainAxisAlignment.start,\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(Language.languageList[int].currencyName,\n                                    style: TextStyle(fontSize: 20.sp)),\n                                SizedBox(height: 2.5.h),\n                                Text(Language.languageList[int].currencyCode,\n                                    style: TextStyle(fontSize: 15.sp))\n                              ],\n                            ),\n                            Spacer(),\n                            context.watch<OnCurrencySelected>().appCurrency ==\n                                    '${languageList[int].languageCode}_${languageList[int].countryCode}'\n                                ? Icon(Icons.check_circle,\n                                    size: 25.sp, color: blue3)\n                                : SizedBox(),\n                            SizedBox(width: 25.w),\n                            Text(\n                              Language.languageList[int].currencySymbol,\n                              style: TextStyle(fontSize: 23.sp),\n                            ),\n                            SizedBox(width: 15.w)\n                          ],\n                        ),\n                      ),\n                      Divider(\n                        indent: 75.w,\n                        height: 0,\n                        thickness: 0.25.h,\n                        color: grey,\n                      ),\n                    ],\n                  ),\n                );\n              })),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/edit.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/input_model.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'input.dart';\n\nclass Edit extends StatelessWidget {\n  static final _formKey3 = GlobalKey<FormState>(debugLabel: '_formKey3');\n  final InputModel? inputModel;\n  final IconData categoryIcon;\n  const Edit({\n    this.inputModel,\n    required this.categoryIcon,\n  });\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      backgroundColor: blue1,\n      appBar: BasicAppBar(getTranslated(context, 'Edit')!),\n      body: GestureDetector(\n        onTap: () {\n          FocusScopeNode currentFocus = FocusScope.of(context);\n          if (!currentFocus.hasPrimaryFocus) {\n            currentFocus.unfocus();\n          }\n        },\n        child: PanelForKeyboard(AddEditInput(\n          formKey: _formKey3,\n          inputModel: this.inputModel,\n          categoryIcon: this.categoryIcon,\n        ),)\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/edit_expense_category.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\n\nimport '../provider.dart';\nimport 'add_category.dart';\nimport 'expense_category.dart';\n\nclass EditExpenseCategory extends StatefulWidget {\n  final BuildContext buildContext;\n  EditExpenseCategory(this.buildContext);\n  @override\n  _EditExpenseCategoryState createState() => _EditExpenseCategoryState();\n}\n\nclass _EditExpenseCategoryState extends State<EditExpenseCategory> {\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider<ChangeExpenseItemEdit>(\n        create: (context) => ChangeExpenseItemEdit(),\n        child: Builder(\n            builder: (contextEdit) => Scaffold(\n                backgroundColor: blue1,\n                appBar: EditCategoryAppBar(\n                  AddCategory(\n                      contextEx: widget.buildContext,\n                      contextExEdit: contextEdit,\n                      type: 'Expense',\n                      appBarTitle:\n                          getTranslated(context, 'Add Expense Category')!,\n                      description: ''),\n                ),\n                body: ExpenseCategoryBody(\n                  contextExEdit: contextEdit,\n                  contextEx: widget.buildContext,\n                ))));\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/edit_income_category.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608'\n    '/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608'\n    '/project/classes/constants.dart';\nimport 'package:money_assistant_2608'\n    '/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\nimport '../provider.dart';\nimport 'add_category.dart';\nimport 'income_category.dart';\n\nclass EditIncomeCategory extends StatelessWidget {\n  final BuildContext? buildContext;\n  EditIncomeCategory(this.buildContext);\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider<ChangeIncomeItemEdit>(\n        create: (context) => ChangeIncomeItemEdit(),\n    child: Builder(\n        builder: (contextEdit) => Scaffold(\n        backgroundColor: blue1,\n        appBar: EditCategoryAppBar(\n          AddCategory(\n            contextIn: this.buildContext,\n            contextInEdit: contextEdit  ,\n              type: 'Income',\n              appBarTitle: getTranslated(context, 'Add Income Category')!,\n              description: ''),\n        ),\n        body: IncomeCategoryBody( context: this.buildContext, contextEdit: contextEdit,editIncomeCategory: true))));\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/expense_category.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:provider/provider.dart';\n\nimport 'add_category.dart';\nimport 'edit_expense_category.dart';\n\nclass ExpenseCategory extends StatefulWidget {\n  @override\n  _ExpenseCategoryState createState() => _ExpenseCategoryState();\n}\n\nclass _ExpenseCategoryState extends State<ExpenseCategory> {\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider<ChangeExpenseItem>(\n        create: (context) => ChangeExpenseItem(),\n        child: Builder(\n          builder: (buildContext) => Scaffold(\n              backgroundColor: blue1,\n              appBar: CategoryAppBar(EditExpenseCategory(buildContext)),\n              body: ExpenseCategoryBody(\n                contextEx: buildContext,\n              )),\n        ));\n  }\n}\n\nclass ExpenseCategoryBody extends StatefulWidget {\n  final BuildContext? contextExEdit,contextEx;\n  ExpenseCategoryBody(\n      {this.contextExEdit, this.contextEx});\n\n  @override\n  _ExpenseCategoryBodyState createState() => _ExpenseCategoryBodyState();\n}\n\nclass _ExpenseCategoryBodyState extends State<ExpenseCategoryBody> {\n  @override\n  Widget build(BuildContext context) {\n    var exItemsLists = widget.contextExEdit == null ?\n        Provider.of<ChangeExpenseItem>(widget.contextEx!).exItemsLists : Provider.of<ChangeExpenseItemEdit>(widget.contextExEdit!).exItemsLists;\n    return SingleChildScrollView(\n        child: Padding(\n      padding: EdgeInsets.only(left: 10.w, right: 10.w, bottom: 20.h),\n      child: Column(\n        children: [\n          ListView.builder(\n              shrinkWrap: true,\n              physics: NeverScrollableScrollPhysics(),\n              itemCount: exItemsLists.length,\n              itemBuilder: (context, int) {\n                return Padding(\n                  padding: EdgeInsets.only(top: 20.h),\n                  child: CategoryContainer( contextEx: widget.contextEx , contextExEdit: widget.contextExEdit,\n                      itemsList: exItemsLists[int]),\n                );\n              }),\n        ],\n      ),\n    ));\n  }\n}\n\n// The named parameter 'body' is required, but there's no corresponding argument.  Try adding the required argument.\n// Widget searchBar() {\n//   return FloatingSearchAppBar(\n//     title: const Text('Enter Category Name'),\n//     transitionDuration: const Duration(milliseconds: 800),\n//     color: Colors.orangeAccent.shade100,\n//     colorOnScroll: Colors.greenAccent.shade200,\n//     height: 55,\n//   );\n// }\n\nclass CategoryContainer extends StatefulWidget {\n  final BuildContext? contextEx,contextExEdit;\n  final List<CategoryItem> itemsList;\n  const CategoryContainer(\n  { this.contextEx, this.contextExEdit,  required this.itemsList});\n  @override\n  _CategoryContainerState createState() => _CategoryContainerState();\n}\n\nclass _CategoryContainerState extends State<CategoryContainer> {\n  @override\n  Widget build(BuildContext context) {\n    if (widget.itemsList.length < 2) {\n      return ParentCategory(\n        contextEx:  widget.contextEx,\n        contextExEdit: widget.contextExEdit,\n        noChildren: true,\n        parentCategory:  widget.itemsList[0],\n      );\n    }\n    return Container(\n      decoration: BoxDecoration(\n        color: white,\n        borderRadius: BorderRadius.circular(40.r),\n      ),\n      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [\n        ParentCategory(\n          contextEx:  widget.contextEx,\n        contextExEdit: widget.contextExEdit,\n        noChildren:  false,\n          parentCategory:  widget.itemsList[0],\n        ),\n        CategoryItems(contextEx: widget.contextEx,         contextExEdit: widget.contextExEdit,\n            categoryItemChildren:  widget.itemsList.sublist(1),parentItem: widget.itemsList[0]),\n      ]),\n    );\n  }\n}\n\nclass CategoryItems extends StatefulWidget {\n  final BuildContext? contextEx,contextExEdit;\n  final List<CategoryItem> categoryItemChildren;\n  final CategoryItem parentItem;\n  const CategoryItems({this.contextEx, this.contextExEdit,\n    required this.categoryItemChildren, required this.parentItem});\n  @override\n  _CategoryItemsState createState() => _CategoryItemsState();\n}\n\nclass _CategoryItemsState extends State<CategoryItems> {\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: EdgeInsets.only(bottom: 25.h, top: 10.h),\n      child: Wrap(\n        children: List.generate(widget.categoryItemChildren.length, (index) {\n          final cellWidth = (1.sw - 20.w) / 4;\n          return SizedBox(\n            width: cellWidth,\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.center,\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                GestureDetector(\n                  onLongPress:(){\n                    if (widget.contextExEdit != null) {\n                      Navigator.push(\n                          context,\n                          MaterialPageRoute(\n                              builder: (context) => AddCategory(\n                                  contextEx: widget.contextEx,\n                                  contextExEdit: widget.contextExEdit,\n                                  type: 'Expense',\n                                  appBarTitle: 'Add Expense Category',\n                                  categoryName:\n                                  widget.categoryItemChildren[index].text,\n                                  categoryIcon: iconData(\n                                      widget.categoryItemChildren[index]),\n                                  parentItem: widget.parentItem,\n                                  description: widget\n                                      .categoryItemChildren[index]\n                                      .description!)));\n                    }\n                  },\n                  onTap: () {\n                    if (widget.contextExEdit != null) {\n                      Navigator.push(\n                          context,\n                          MaterialPageRoute(\n                              builder: (context) => AddCategory(\n                                  contextEx: widget.contextEx,\n                                  contextExEdit: widget.contextExEdit,\n                                  type: 'Expense',\n                                  appBarTitle: 'Add Expense Category',\n                                  categoryName:\n                                  widget.categoryItemChildren[index].text,\n                                  categoryIcon: iconData(\n                                      widget.categoryItemChildren[index]),\n                                  parentItem: widget.parentItem,\n                                  description: widget\n                                      .categoryItemChildren[index]\n                                      .description!)));\n                    } else {\n                      Navigator.pop(\n                          context, widget.categoryItemChildren[index]);\n                    }\n                  },\n                  child: Padding(\n                    padding:  EdgeInsets.symmetric(vertical: 15.h),\n                    child: CircleAvatar(\n                        radius: 24.r,\n                        backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                        child: Icon(\n                          iconData(widget.categoryItemChildren[index]),\n                          color: red,\n                          size: 30.sp,\n                        )),\n                  ),\n                ),\n                Text(\n                  getTranslated(\n                          context, widget.categoryItemChildren[index].text) ??\n                      widget.categoryItemChildren[index].text,\n                  style: TextStyle(\n                    fontSize: 16.sp,\n                  ),\n                  textAlign: TextAlign.center,\n                ),\n              ],\n            ),\n          );\n        }),\n      ),\n    );\n  }\n}\n\nclass ParentCategory extends StatefulWidget {\n  final BuildContext? contextEx, contextExEdit;\n  final bool noChildren;\n  final CategoryItem parentCategory;\n  ParentCategory(\n  { this.contextEx,\n  this.contextExEdit,\n    required this.noChildren,\n    required this.parentCategory,}\n  );\n  @override\n  _ParentCategoryState createState() => _ParentCategoryState();\n}\n\nclass _ParentCategoryState extends State<ParentCategory> {\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      behavior: HitTestBehavior.translucent,\n      onLongPress:(){\n        if (widget.contextExEdit != null) {\n          Navigator.push(\n              context,\n              MaterialPageRoute(\n                  builder: (context) => AddCategory(\n                      contextEx: widget.contextEx,\n                      contextExEdit: widget.contextExEdit,\n                      type: 'Expense',\n                      appBarTitle: 'Add Expense Category',\n                      categoryName: widget.parentCategory.text,\n                      categoryIcon: iconData(widget.parentCategory),\n                      description: widget.parentCategory.description)));\n        }\n      },\n      onTap: () {\n        if (widget.contextExEdit != null) {\n          Navigator.push(\n              context,\n              MaterialPageRoute(\n                  builder: (context) => AddCategory(\n                    contextEx: widget.contextEx,\n                      contextExEdit: widget.contextExEdit,\n                      type: 'Expense',\n                      appBarTitle: 'Add Expense Category',\n                      categoryName: widget.parentCategory.text,\n                      categoryIcon: iconData(widget.parentCategory),\n                      description: widget.parentCategory.description)));\n        }\n        // consider category as parent category for simplicity, need to change later\n        else {\n          Navigator.pop(context, widget.parentCategory);\n        }\n      },\n      child: Container(\n        decoration: BoxDecoration(\n          color: Color.fromRGBO(222, 174, 112, 1),\n          borderRadius: widget.noChildren\n              ? BorderRadius.circular(40.r)\n              : BorderRadius.vertical(\n                  top: Radius.circular(40.r), bottom: Radius.zero),\n        ),\n        child: Padding(\n          padding: EdgeInsets.symmetric(vertical: 18.h, horizontal: 15.w),\n          child: Row(\n            children: [\n              CircleAvatar(\n                  backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                  radius: 26.r,\n                  child: Icon(\n                    iconData(widget.parentCategory),\n                    size: 33.sp,\n                    color: red,\n                  )),\n              SizedBox(\n                width: 23.5.w,\n              ),\n              Expanded(\n                child: Text(\n                  getTranslated(context, widget.parentCategory.text) ??\n                      widget.parentCategory.text,\n                  style:\n                      TextStyle(fontSize: 22.sp, fontWeight: FontWeight.bold),\n                  overflow: TextOverflow.ellipsis,\n                ),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/income_category.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:provider/provider.dart';\n\nimport 'add_category.dart';\nimport 'edit_income_category.dart';\n\nclass IncomeCategory extends StatefulWidget {\n  @override\n  _IncomeCategoryState createState() => _IncomeCategoryState();\n}\n\nclass _IncomeCategoryState extends State<IncomeCategory> {\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider<ChangeIncomeItem>(\n        create: (context) => ChangeIncomeItem(),\n        child: Builder(\n            builder: (buildContext) => Scaffold(\n                backgroundColor: blue1,\n                appBar: CategoryAppBar(EditIncomeCategory(buildContext)),\n                body: IncomeCategoryBody(\n                    context: buildContext, editIncomeCategory: false))));\n  }\n}\n\nclass IncomeCategoryBody extends StatefulWidget {\n  final BuildContext? context, contextEdit;\n  final bool editIncomeCategory;\n  IncomeCategoryBody(\n      {this.context, this.contextEdit, required this.editIncomeCategory});\n\n  @override\n  _IncomeCategoryBodyState createState() => _IncomeCategoryBodyState();\n}\n\nclass _IncomeCategoryBodyState extends State<IncomeCategoryBody> {\n  @override\n  Widget build(BuildContext context) {\n    var incomeList = widget.contextEdit == null\n        ? Provider.of<ChangeIncomeItem>(widget.context!).incomeItems\n        : Provider.of<ChangeIncomeItemEdit>(widget.contextEdit!).incomeItems;\n    return Padding(\n      padding: EdgeInsets.only(top: 30.h),\n      child: ListView.builder(\n        itemCount: incomeList.length,\n        itemBuilder: (context, int) {\n          return Padding(\n            padding: EdgeInsets.only(top: 3.h, left: 10.w, right: 10.w),\n            child: GestureDetector(\n              onLongPress: () {\n                if (this.widget.editIncomeCategory) {\n                  Navigator.push(\n                      context,\n                      MaterialPageRoute(\n                          builder: (context) => AddCategory(\n                              contextIn: widget.context,\n                              contextInEdit: widget.contextEdit,\n                              type: 'Income',\n                              appBarTitle: 'Add Income Category',\n                              categoryName: incomeList[int].text,\n                              categoryIcon: iconData(incomeList[int]),\n                              description: incomeList[int].description!)));\n                }\n              },\n              onTap: () {\n                if (this.widget.editIncomeCategory) {\n                  Navigator.push(\n                      context,\n                      MaterialPageRoute(\n                          builder: (context) => AddCategory(\n                              contextIn: widget.context,\n                              contextInEdit: widget.contextEdit,\n                              type: 'Income',\n                              appBarTitle: 'Add Income Category',\n                              categoryName: incomeList[int].text,\n                              categoryIcon: iconData(incomeList[int]),\n                              description: incomeList[int].description!)));\n                } else {\n                  Navigator.pop(context, incomeList[int]);\n                }\n              },\n              child: Card(\n                elevation: 5,\n                color: white,\n                shape: RoundedRectangleBorder(\n                  borderRadius: BorderRadius.circular(35.r),\n                ),\n                child: Padding(\n                  padding: EdgeInsets.symmetric(vertical: 15.h),\n                  child: Row(\n                    children: [\n                      SizedBox(\n                        width: 40.h,\n                      ),\n                      CircleAvatar(\n                        backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                        radius: 25.r,\n                        child: Icon(\n                          iconData(incomeList[int]),\n                          size: 33.sp,\n                          color: green,\n                        ),\n                      ),\n                      SizedBox(\n                        width: 25.w,\n                      ),\n                      Text(\n                        getTranslated(context, incomeList[int].text) ??\n                            incomeList[int].text,\n                        style: TextStyle(\n                            fontSize: 20.sp, fontWeight: FontWeight.bold),\n                      )\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/input.dart",
    "content": "import 'dart:core';\nimport 'dart:io' show Platform;\nimport 'package:day_night_time_picker/day_night_time_picker.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_material_pickers/flutter_material_pickers.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:intl/intl.dart';\nimport 'package:keyboard_actions/keyboard_actions.dart';\nimport 'package:money_assistant_2608/project/classes/alert_dialog.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/custom_toast.dart';\nimport 'package:money_assistant_2608/project/classes/input_model.dart';\nimport 'package:money_assistant_2608/project/classes/keyboard.dart';\nimport 'package:money_assistant_2608/project/classes/saveOrSaveAndDeleteButtons.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\nimport 'package:sliding_up_panel/sliding_up_panel.dart';\n\nimport '../provider.dart';\nimport 'expense_category.dart';\nimport 'income_category.dart';\n\nlate CategoryItem defaultCategory;\nvar selectedTime = TimeOfDay.now();\nvar selectedDate = DateTime.now();\nInputModel model = InputModel();\nPanelController _pc = PanelController();\nlate TextEditingController _amountController;\nFocusNode? amountFocusNode, descriptionFocusNode;\n\nclass AddInput extends StatefulWidget {\n  @override\n  _AddInputState createState() => _AddInputState();\n}\n\nclass _AddInputState extends State<AddInput> {\n  static final _formKey1 = GlobalKey<FormState>(debugLabel: '_formKey1'),\n      _formKey2 = GlobalKey<FormState>(debugLabel: '_formKey2');\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      onTap: () {\n        FocusScopeNode currentFocus = FocusScope.of(context);\n        if (!currentFocus.hasFocus || !currentFocus.hasPrimaryFocus) {\n          currentFocus.unfocus();\n          if (_pc.isPanelOpen) {\n            _pc.close();\n          }\n        }\n      },\n      child: DefaultTabController(\n          initialIndex: 0,\n          length: 2,\n          child: Scaffold(\n              backgroundColor: blue1,\n              appBar: InExAppBar(true),\n              body:\n                  // ChangeNotifierProvider<ChangeModelType>(\n                  //     create: (context) => ChangeModelType(),\n                  //     child:\n                  PanelForKeyboard(\n                TabBarView(\n                  children: [\n                    AddEditInput(\n                      type: 'Expense',\n                      formKey: _formKey2,\n                    ),\n                    AddEditInput(\n                      type: 'Income',\n                      formKey: _formKey1,\n                    )\n                  ],\n                ),\n              ))),\n    )\n        // )\n        ;\n  }\n}\n\nclass PanelForKeyboard extends StatelessWidget {\n  const PanelForKeyboard(\n    this.body,\n  );\n  final Widget body;\n  void _insertText(String myText) {\n    final text = _amountController.text;\n    TextSelection textSelection = _amountController.selection;\n    String newText = text.replaceRange(\n      textSelection.start,\n      textSelection.end,\n      myText,\n    );\n    if (newText.length > 13) {\n      newText = newText.substring(0, 13);\n    }\n    // if input starts to have '.' => Don't need to reformat\n    if (newText.contains('.')) {\n      String fractionalNumber = newText.split('.').last;\n      // input can not have more than 2 numbers after a decimal point\n      if (fractionalNumber.length > 2) {\n        String wholeNumber = newText.split('.').first;\n        newText = wholeNumber + '.' + fractionalNumber.substring(0, 2);\n      }\n\n      if (newText.substring(newText.length - 1) == '.') {\n        // input can not have more than 1 dot\n        if ('.'.allMatches(newText).length == 2) {\n          newText = newText.substring(0, newText.length - 1);\n        }\n      }\n      _amountController.text = newText;\n    } else {\n      _amountController.text =\n          format(double.parse(newText.replaceAll(',', '')));\n    }\n\n    //define text input and cursor position\n    textSelection = TextSelection.fromPosition(\n        TextPosition(offset: _amountController.text.length));\n    _amountController.selection = textSelection;\n  }\n\n  void _backspace() {\n    final text = _amountController.text;\n    TextSelection textSelection = _amountController.selection;\n\n    // The cursor is at the beginning.\n    if (textSelection.start == 0) {\n      return;\n    }\n\n    final selectionLength = textSelection.end - textSelection.start;\n    // There is a selection.\n    if (selectionLength > 0) {\n      final newText = text.replaceRange(\n        textSelection.start,\n        textSelection.end,\n        '',\n      );\n      // if users delete all input or if input has '.'\n      // => Don't need to reformat when deleting\n      if (newText == '' || newText.contains('.')) {\n        _amountController.text = newText;\n      } else {\n        _amountController.text =\n            format(double.parse(newText.replaceAll(',', '')));\n      }\n\n      textSelection = TextSelection.fromPosition(\n          TextPosition(offset: _amountController.text.length));\n      _amountController.selection = textSelection;\n      return;\n    }\n\n    // Delete the previous character\n    final previousCodeUnit = text.codeUnitAt(textSelection.start - 1);\n    final offset = _isUtf16Surrogate(previousCodeUnit) ? 2 : 1;\n    final newStart = textSelection.start - offset;\n    final newEnd = textSelection.start;\n    final newText = text.replaceRange(\n      newStart,\n      newEnd,\n      '',\n    );\n    if (newText == '' || newText.contains('.')) {\n      _amountController.text = newText;\n    } else {\n      _amountController.text =\n          format(double.parse(newText.replaceAll(',', '')));\n    }\n    textSelection = TextSelection.fromPosition(\n        TextPosition(offset: _amountController.text.length));\n    _amountController.selection = textSelection;\n  }\n\n  bool _isUtf16Surrogate(int value) {\n    return value & 0xF800 == 0xD800;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SlidingUpPanel(\n        controller: _pc,\n        minHeight: 0,\n        maxHeight: 300.h,\n        parallaxEnabled: true,\n        isDraggable: false,\n        panelSnapping: true,\n        panel: CustomKeyboard(\n          panelController: _pc,\n          mainFocus: amountFocusNode,\n          nextFocus: descriptionFocusNode,\n          onTextInput: (myText) {\n            _insertText(myText);\n          },\n          onBackspace: () {\n            _backspace();\n          },\n          page: model.type == 'Income'\n              // Provider.of<ChangeModelType>(context).modelType == 'Income'\n              ? IncomeCategory()\n              : ExpenseCategory(),\n        ),\n        body: this.body);\n  }\n}\n\nclass AddEditInput extends StatelessWidget {\n  final GlobalKey<FormState> formKey;\n  final InputModel? inputModel;\n  final String? type;\n  final IconData? categoryIcon;\n  const AddEditInput({\n    required this.formKey,\n    this.inputModel,\n    this.type,\n    this.categoryIcon,\n  });\n  @override\n  Widget build(BuildContext context) {\n    if (this.inputModel != null) {\n      model = this.inputModel!;\n      defaultCategory = categoryItem(this.categoryIcon!, model.category!);\n      // Provider.of<ChangeModelType>(context, listen: false)\n      //     .changeModelType(this.inputModel!.type!);\n    } else {\n      model = InputModel(\n        type: this.type,\n      );\n      defaultCategory = categoryItem(Icons.category_outlined, 'Category');\n      // Provider.of<ChangeModelType>(context, listen: false)\n      //     .changeModelType(this.type!);\n    }\n    return ChangeNotifierProvider<ChangeCategoryA>(\n        create: (context) => ChangeCategoryA(),\n        child: ListView(children: [\n          AmountCard(),\n          SizedBox(\n            height: 30.h,\n          ),\n          Container(\n            decoration: BoxDecoration(\n                color: white,\n                border: Border.all(\n                  color: grey,\n                  width: 0.6.w,\n                )),\n            child: Column(\n              children: [\n                CategoryCard(),\n                DescriptionCard(),\n                DateCard(),\n              ],\n            ),\n          ),\n          Padding(\n            padding: EdgeInsets.symmetric(vertical: 70.h),\n            child: this.inputModel != null\n                ? SaveAndDeleteButton(\n                    saveAndDeleteInput: true,\n                    formKey: this.formKey,\n                  )\n                : SaveButton(true, null, true),\n          )\n        ]));\n  }\n}\n\nclass AmountCard extends StatefulWidget {\n  @override\n  _AmountCardState createState() => _AmountCardState();\n}\n\nclass _AmountCardState extends State<AmountCard> {\n  @override\n  void initState() {\n    super.initState();\n    amountFocusNode = FocusNode();\n    _amountController = TextEditingController(\n      text: model.id == null ? '' : format(model.amount!),\n    );\n  }\n  // @override\n  // void dispose(){\n  //   amountFocusNode!.dispose();\n  //   super.dispose();\n  // }\n\n  @override\n  Widget build(BuildContext context) {\n    Color colorMain = model.type == 'Income' ? green : red;\n    return Container(\n      decoration: BoxDecoration(\n          color: white,\n          border: Border(\n              bottom: BorderSide(\n            color: grey,\n            width: 0.6.h,\n          ))),\n      child: Padding(\n        padding:\n            EdgeInsets.only(top: 15.h, bottom: 30.h, right: 20.w, left: 20.w),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.end,\n          children: [\n            Text(\n              '${getTranslated(context, 'Amount')}',\n              style: TextStyle(\n                fontSize: 22.sp,\n              ),\n            ),\n            TextFormField(\n              controller: _amountController,\n              readOnly: true,\n              showCursor: true,\n              maxLines: null,\n              minLines: 1,\n              // maxLength: ,\n              // inputFormatters: [\n              //   FilteringTextInputFormatter.allow(\n              //       RegExp(r'^\\d*(.?|,?)\\d{0,2}')),\n              // ],\n              onTap: () => _pc.open(),\n              cursorColor: colorMain,\n              style: GoogleFonts.aBeeZee(\n                  color: colorMain,\n                  fontSize: 35.sp,\n                  fontWeight: FontWeight.bold),\n              focusNode: amountFocusNode,\n              decoration: InputDecoration(\n                hintText: '0',\n                hintStyle: GoogleFonts.aBeeZee(\n                    color: colorMain,\n                    fontSize: 35.sp,\n                    fontWeight: FontWeight.bold),\n                icon: Padding(\n                  padding: EdgeInsets.only(right: 5.w),\n                  child: Icon(\n                    Icons.monetization_on,\n                    size: 45.sp,\n                    color: colorMain,\n                  ),\n                ),\n                suffixIcon: _amountController.text.length > 0\n                    ? IconButton(\n                        icon: Icon(\n                          Icons.clear,\n                          size: 24.sp,\n                        ),\n                        onPressed: () {\n                          _amountController.clear();\n                        })\n                    : SizedBox(),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass CategoryCard extends StatefulWidget {\n  @override\n  _CategoryCardState createState() => _CategoryCardState();\n}\n\nclass _CategoryCardState extends State<CategoryCard> {\n  @override\n  Widget build(BuildContext context) {\n    return Consumer<ChangeCategoryA>(builder: (_, changeCategoryA, __) {\n      changeCategoryA.categoryItemA ??= defaultCategory;\n      var categoryItem = changeCategoryA.categoryItemA;\n      model.category = categoryItem!.text;\n      return GestureDetector(\n          onTap: () async {\n            if (_pc.isPanelOpen) {\n              _pc.close();\n            }\n            CategoryItem newCategoryItem = await Navigator.push(\n              context,\n              MaterialPageRoute(\n                  builder: (context) => model.type == 'Income'\n                      ? IncomeCategory()\n                      : ExpenseCategory()),\n            );\n            changeCategoryA.changeCategory(newCategoryItem);\n          },\n          child: Column(children: [\n            Padding(\n              padding: EdgeInsets.only(\n                  left: 20.w, right: 20.w, top: 20.h, bottom: 21.h),\n              child: Row(\n                children: [\n                  Icon(\n                    iconData(categoryItem),\n                    size: 40.sp,\n                    color: model.type == 'Income' ? green : red,\n                  ),\n                  Expanded(\n                    child: Padding(\n                      padding: EdgeInsets.only(left: 31.w),\n                      child: Text(\n                        getTranslated(context, categoryItem.text) ??\n                            categoryItem.text,\n                        style: TextStyle(\n                          fontSize: 24.sp,\n                          fontWeight: FontWeight.bold,\n                        ),\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ),\n                  ),\n                  // Spacer(),\n                  Icon(\n                    Icons.arrow_forward_ios_outlined,\n                    size: 20.sp,\n                  ),\n                ],\n              ),\n            ),\n            Divider(\n              height: 0,\n              thickness: 0.25.w,\n              color: grey,\n              indent: 85.w,\n            ),\n          ]));\n    });\n  }\n}\n\nclass DescriptionCard extends StatefulWidget {\n  @override\n  _DescriptionCardState createState() => _DescriptionCardState();\n}\n\nclass _DescriptionCardState extends State<DescriptionCard> {\n  static late TextEditingController descriptionController;\n\n  @override\n  void initState() {\n    super.initState();\n    descriptionFocusNode = FocusNode();\n    descriptionController =\n        TextEditingController(text: model.description ?? '');\n  }\n\n  // @override\n  // void dispose(){\n  //   descriptionFocusNode!.dispose();\n  //   super.dispose();\n  // }\n\n  KeyboardActionsConfig _buildConfig(BuildContext context) {\n    return KeyboardActionsConfig(\n        nextFocus: false,\n        keyboardActionsPlatform: KeyboardActionsPlatform.ALL,\n        keyboardBarColor: Colors.grey[200],\n        actions: [\n          KeyboardActionsItem(\n              focusNode: descriptionFocusNode!,\n              toolbarButtons: [\n                (node) {\n                  return SizedBox(\n                    width: 1.sw,\n                    child: Padding(\n                        padding: EdgeInsets.only(left: 5.w, right: 16.w),\n                        child: Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: [\n                            GestureDetector(\n                              onTap: () {\n                                FocusScope.of(context)\n                                    .requestFocus(amountFocusNode);\n                                _pc.open();\n                              },\n                              child: SizedBox(\n                                height: 35.h,\n                                width: 60.w,\n                                child: Icon(Icons.keyboard_arrow_up,\n                                    size: 25.sp, color: Colors.blueGrey),\n                              ),\n                            ),\n                            // GestureDetector(\n                            //   onTap: () {\n                            //     node.unfocus();\n                            //     Navigator.push(\n                            //         context,\n                            //         MaterialPageRoute(\n                            //             builder: (context) => model.type == 'Income'\n                            //                 ? IncomeCategory()\n                            //                 : ExpenseCategory()));\n                            //   },\n                            //   child: Text(\n                            //     getTranslated(context, 'Choose Category')!,\n                            //     style: TextStyle(\n                            //         fontSize: 16.sp,\n                            //         fontWeight: FontWeight.bold,\n                            //         color: Colors.blueGrey),\n                            //   ),\n                            // ),\n                            GestureDetector(\n                                onTap: () => node.unfocus(),\n                                child: Text(\n                                  getTranslated(context, \"Done\")!,\n                                  style: TextStyle(\n                                      fontSize: 16.sp,\n                                      fontWeight: FontWeight.bold,\n                                      color: Colors.blue),\n                                ))\n                          ],\n                        )),\n                  );\n                },\n              ])\n        ]);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return KeyboardActions(\n      overscroll: 0,\n      disableScroll: true,\n      tapOutsideBehavior: TapOutsideBehavior.translucentDismiss,\n      autoScroll: false,\n      config: _buildConfig(context),\n      child: Column(children: [\n        Padding(\n          padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 8.5.h),\n          child: TextFormField(\n            controller: descriptionController,\n            maxLines: null,\n            minLines: 1,\n            keyboardType: TextInputType.multiline,\n            keyboardAppearance: Brightness.light,\n            // maxLength: ,\n            onTap: () {\n              if (_pc.isPanelOpen) {\n                _pc.close();\n              }\n            },\n            cursorColor: blue1,\n            textCapitalization: TextCapitalization.sentences,\n            style: TextStyle(fontSize: 20.sp),\n            focusNode: descriptionFocusNode,\n            textInputAction: TextInputAction.newline,\n            decoration: InputDecoration(\n                border: InputBorder.none,\n                hintText: getTranslated(context, 'Description'),\n                hintStyle: GoogleFonts.cousine(\n                  fontSize: 22.sp,\n                  fontStyle: FontStyle.italic,\n                ),\n                suffixIcon: descriptionController.text.length > 0\n                    ? IconButton(\n                        icon: Icon(\n                          Icons.clear,\n                          size: 20.sp,\n                        ),\n                        onPressed: () {\n                          descriptionController.clear();\n                        })\n                    : SizedBox(),\n                icon: Padding(\n                  padding: EdgeInsets.only(right: 15.w),\n                  child: Icon(\n                    Icons.description_outlined,\n                    size: 40.sp,\n                    color: Colors.blueGrey,\n                  ),\n                )),\n          ),\n        ),\n        Divider(\n          height: 0,\n          thickness: 0.25.w,\n          color: grey,\n          indent: 85.w,\n        )\n      ]),\n    );\n  }\n}\n\nclass DateCard extends StatefulWidget {\n  const DateCard();\n  @override\n  _DateCardState createState() => _DateCardState();\n}\n\nclass _DateCardState extends State<DateCard> {\n  @override\n  Widget build(BuildContext context) {\n    if (model.date == null) {\n      model.date = DateFormat('dd/MM/yyyy').format(selectedDate);\n      model.time = selectedTime.format(context);\n    }\n    return Padding(\n      padding:\n          EdgeInsets.only(left: 20.w, right: 20.w, top: 17.5.h, bottom: 19.h),\n      child: Row(\n        children: [\n          GestureDetector(\n            onTap: () {\n              if (_pc.isPanelOpen) {\n                _pc.close();\n              }\n              showMaterialDatePicker(\n                headerColor: blue3,\n                headerTextColor: Colors.black,\n                backgroundColor: white,\n                buttonTextColor: Color.fromRGBO(80, 157, 253, 1),\n                cancelText: getTranslated(context, 'CANCEL'),\n                confirmText: getTranslated(context, 'OK') ?? 'OK',\n                maxLongSide: 450.w,\n                maxShortSide: 300.w,\n                title: getTranslated(context, 'Select a date'),\n                context: context,\n                firstDate: DateTime(1990, 1, 1),\n                lastDate: DateTime(2050, 12, 31),\n                selectedDate: DateFormat('dd/MM/yyyy').parse(model.date!),\n                onChanged: (value) => setState(() {\n                  selectedDate = value;\n                  model.date = DateFormat('dd/MM/yyyy').format(value);\n                }),\n              );\n            },\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Padding(\n                  padding: EdgeInsets.only(right: 30.w),\n                  child: Icon(\n                    Icons.event,\n                    size: 40.sp,\n                    color: Colors.blue,\n                  ),\n                ),\n                Text(\n                  DateFormat(sharedPrefs.dateFormat).format(\n                      DateFormat('dd/MM/yyyy').parse(\n                          model.date!)),\n                  style: GoogleFonts.aBeeZee(\n                    fontSize: 21.5.sp,\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Spacer(),\n          GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTap: () {\n              if (_pc.isPanelOpen) {\n                _pc.close();\n              }\n              Navigator.of(context).push(\n                showPicker(\n                    cancelText: getTranslated(context, 'Cancel') ?? 'Cancel',\n                    okText: getTranslated(context, 'Ok') ?? 'Ok',\n                    unselectedColor: grey,\n                    dialogInsetPadding: EdgeInsets.symmetric(\n                        horizontal: 50.w, vertical: 30.0.h),\n                    elevation: 12,\n                    context: context,\n                    value: selectedTime,\n                    is24HrFormat: true,\n                    onChange: (value) => setState(() {\n                          selectedTime = value;\n                          model.time = value.format(context);\n                        })),\n              );\n            },\n            child: Text(\n              model.time!,\n              style: GoogleFonts.aBeeZee(\n                fontSize: 21.5.sp,\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n\nvoid saveInputFunc(BuildContext context, bool saveFunction) {\n  model.amount = _amountController.text.isEmpty\n      ? 0\n      : double.parse(_amountController.text.replaceAll(',', ''));\n  model.description = _DescriptionCardState.descriptionController.text;\n  if (saveFunction) {\n    DB.insert(model);\n    _amountController.clear();\n    if (_DescriptionCardState.descriptionController.text.length > 0) {\n      _DescriptionCardState.descriptionController.clear();\n    }\n    customToast(context, 'Data has been saved');\n  } else {\n    DB.update(model);\n    Navigator.pop(context);\n    customToast(context, getTranslated(context, 'Transaction has been updated') ?? 'Transaction has been updated');\n  }\n}\n\nFuture<void> deleteInputFunction(\n  BuildContext context,\n) async {\n  void onDeletion() {\n    DB.delete(model.id!);\n    Navigator.pop(context);\n    customToast(context, 'Transaction has been deleted');\n  }\n\n  Platform.isIOS\n      ? await iosDialog(\n          context,\n          'Are you sure you want to delete this transaction?',\n          'Delete',\n          onDeletion)\n      : await androidDialog(\n          context,\n          'Are you sure you want to delete this transaction?',\n          'Delete',\n          onDeletion);\n}\n"
  },
  {
    "path": "lib/project/app_pages/others.dart",
    "content": "import 'dart:core';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:in_app_review/in_app_review.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/app_pages/select_date_format.dart';\nimport 'package:money_assistant_2608/project/app_pages/select_language.dart';\nimport 'package:money_assistant_2608/project/auth_pages/user_account.dart';\nimport 'package:money_assistant_2608/project/classes/alert_dialog.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/custom_toast.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\nimport 'package:share_plus/share_plus.dart';\nimport 'dart:io' show Platform;\nimport '../provider.dart';\nimport 'currency.dart';\n\nclass Other extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n        primary: true,\n        appBar: PreferredSize(\n          preferredSize: Size.fromHeight(\n            150.h,\n          ),\n          child: Container(\n            color: blue3,\n            padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 0),\n            height: 200.h,\n            child: Padding(\n              padding: EdgeInsets.only(top: 30.w),\n              child: Row(\n                children: [\n                  CircleAvatar(\n                    child: CircleAvatar(\n                        child: Icon(\n                          FontAwesomeIcons.smileBeam,\n                          color: Colors.black,\n                          size: 71.sp,\n                        ),\n                        radius: 35.r,\n                        backgroundColor: blue1),\n                    radius: 40.r,\n                    backgroundColor: Colors.orangeAccent,\n                  ),\n                  SizedBox(\n                    width: 20.w,\n                  ),\n                  Text(\n                    '${getTranslated(context, 'Hi you')!}!',\n                    style: TextStyle(fontSize: 30.sp),\n                  ),\n                  // Spacer(),\n                  // Icon(\n                  //   Icons.notifications_rounded,\n                  //   size: 25.sp,\n                  // )\n                ],\n              ),\n            ),\n          ),\n        ),\n        body: ChangeNotifierProvider<OnSwitch>(\n            create: (context) => OnSwitch(),\n            builder: (context, widget) => Settings(providerContext: context)));\n  }\n}\n\nclass Settings extends StatefulWidget {\n  final BuildContext providerContext;\n  const Settings({required this.providerContext});\n\n  @override\n  State<Settings> createState() => _SettingsState();\n}\n\nclass _SettingsState extends State<Settings> {\n  @override\n  Widget build(BuildContext context) {\n    List<Widget> pageRoute = [\n      UserAccount(),\n      SelectLanguage(),\n      Currency(),\n    ];\n    List<Widget> settingsIcons = [\n      Icon(\n        Icons.account_circle,\n        size: 35,\n        color: Colors.lightBlue,\n      ),\n      // Icon(\n      //   Icons.settings,\n      //   size: 32,\n      //   color: Colors.blueGrey[800],\n      // ),\n      // Icon(\n      //   Icons.feedback,\n      //   size: 35.sp,\n      //   color: Colors.black54,\n      // ),\n      Icon(\n        Icons.language,\n        size: 32.sp,\n        color: Colors.lightBlue,\n      ),\n      Icon(\n        Icons.monetization_on,\n        size: 32.sp,\n        color: Colors.orangeAccent,\n      ),\n      Icon(Icons.format_align_center, size: 32.sp, color: Colors.lightBlue),\n      Icon(Icons.refresh, size: 32.sp, color: Colors.lightBlue),\n      Icon(Icons.delete_forever, size: 32.sp, color: red),\n      // Icon(Icons.lock, size: 32.sp, color: Colors.blueGrey),\n      Icon(\n        Icons.share,\n        size: 28.sp,\n        color: Colors.lightBlue,\n      ),\n      Icon(\n        Icons.star,\n        size: 32.sp,\n        color: Colors.amber,\n      ),\n    ];\n    List<String> settingsList = [\n      getTranslated(context, 'My Account')!,\n      // getTranslated(context, 'General Settings')!,\n      // getTranslated(context, 'Feedback')!,\n      getTranslated(context, 'Language') ?? 'Language',\n      getTranslated(context, 'Currency') ?? 'Currency',\n      (getTranslated(context, 'Date format') ??\n          'Date format') +\n              ' (${DateFormat(sharedPrefs.dateFormat).format(now)})',\n      getTranslated(context, 'Reset All Categories') ?? 'Reset All Categories',\n      getTranslated(context, 'Delete All Data') ?? 'Delete All Data',\n      // getTranslated(context, 'Enable Passcode') ?? 'Enable Passcode',\n      getTranslated(context, 'Share Friends') ?? 'Share Friends',\n      getTranslated(context, 'Rate App') ?? 'Rate App',\n    ];\n\n    return ListView.builder(\n        itemCount: settingsList.length,\n        itemBuilder: (context, int) {\n          // void onPasscodeSwitched() {\n          //   context.read<OnSwitch>().onSwitch();\n          //   if (context.read<OnSwitch>().isPasscodeOn) {\n          //     showDialog<void>(\n          //         context: context,\n          //         builder: (providerContext) =>\n          //             OtherLockScreen(providerContext: this.providerContext));\n          //   } else {\n          //    customToast(context, 'Passcode has been disabled');\n          //   }\n          // }\n\n          return GestureDetector(\n            onTap: () async {\n              if ((int == 0) || (int == 1) || (int == 2)) {\n                Navigator.push(context,\n                    MaterialPageRoute(builder: (context) => pageRoute[int]));\n              } else if (int == 3) {\n                Navigator.push(context,\n                        MaterialPageRoute(builder: (context) => FormatDate()))\n                    .then((value) => setState(() {}));\n              } else if (int == 4) {\n                // Navigator.push(\n                //     context,\n                //     MaterialPageRoute(\n                //         builder: (context) => EditIncomeCategory(null)));\n                void onReset() {\n                  sharedPrefs.setItems(setCategoriesToDefault: true);\n                  customToast(context, 'Categories have been reset');\n                }\n\n                Platform.isIOS\n                    ? await iosDialog(\n                        context,\n                        'This action cannot be undone. Are you sure you want to reset all categories?',\n                        'Reset',\n                        onReset)\n                    : await androidDialog(\n                        context,\n                        'This action cannot be undone. Are you sure you want to reset all categories?',\n                        'reset',\n                        onReset);\n              } else if (int == 5) {\n                Future onDeletion() async {\n                  await DB.deleteAll();\n                  customToast(context, 'All data has been deleted');\n                }\n\n                Platform.isIOS\n                    ? await iosDialog(\n                        context,\n                        'Deleted data can not be recovered. Are you sure you want to delete all data?',\n                        'Delete',\n                        onDeletion)\n                    : await androidDialog(\n                        context,\n                        'Deleted data can not be recovered. Are you sure you want to delete all data?',\n                        'Delete',\n                        onDeletion);\n              }\n              // else if (int == 4) {\n              //   onPasscodeSwitched();\n              // }\n              else if (int == 6) {\n                Share.share(\n                    'https://apps.apple.com/us/app/mmas-money-tracker-bookkeeper/id1582638369');\n              } else {\n                final InAppReview inAppReview = InAppReview.instance;\n                await inAppReview.openStoreListing(\n                  appStoreId: Platform.isIOS\n                      ? '1582638369'\n                      : 'com.mmas.money_assistant_2608',\n                );\n              }\n            },\n            child: Column(\n              children: [\n                Padding(\n                  padding: EdgeInsets.symmetric(vertical: 7.h),\n                  child: SizedBox(\n                    child: Center(\n                        child: ListTile(\n                      title: Padding(\n                        padding: EdgeInsets.symmetric(horizontal: 8.w),\n                        child: Text(\n                          '${settingsList[int]}',\n                          style: TextStyle(fontSize: 18.5.sp),\n                        ),\n                      ),\n                      leading: CircleAvatar(\n                          radius: 24.r,\n                          backgroundColor: Color.fromRGBO(229, 231, 234, 1),\n                          child: settingsIcons[int]),\n                      trailing:\n                          // int == 4\n                          // ? Switch(\n                          //     value: context.watch<OnSwitch>().isPasscodeOn,\n                          //     onChanged: (value) {\n                          //       onPasscodeSwitched();\n                          //     },\n                          //     activeTrackColor: blue1,\n                          //     activeColor: Color.fromRGBO(71, 131, 192, 1),\n                          //   ) :\n                          Icon(\n                        Icons.arrow_forward_ios,\n                        size: 20.sp,\n                        color: Colors.blueGrey,\n                      ),\n                    )),\n                  ),\n                ),\n                Divider(\n                  indent: 78.w,\n                  height: 0.1.h,\n                  thickness: 0.4.h,\n                  color: grey,\n                ),\n              ],\n            ),\n          );\n        });\n  }\n}\n\n// class Upgrade extends StatelessWidget {\n//   @override\n//   Widget build(BuildContext context) {\n//     return Stack(\n//       alignment: Alignment.center,\n//       children: [\n//         Container(\n//           height: 165.h,\n//           color: Color.fromRGBO(234, 234, 234, 1),\n//         ),\n//         Container(\n//           alignment: Alignment.center,\n//           height: 115.h,\n//           decoration: BoxDecoration(\n//               image: DecorationImage(\n//                   fit: BoxFit.fill, image: AssetImage('images/image13.jpg'))),\n//         ),\n//         Container(\n//           alignment: Alignment.center,\n//           decoration: BoxDecoration(\n//               color: Color.fromRGBO(255, 255, 255, 1),\n//               borderRadius: BorderRadius.circular(40),\n//               border: Border.all(\n//                 color: Colors.grey,\n//                 width: 0.5.w,\n//               )),\n//           height: 55.h,\n//           width: 260.w,\n//           child: Text(\n//             getTranslated(context, 'VIEW UPGRADE OPTIONS')!,\n//             style: TextStyle(fontSize: 4.206, fontWeight: FontWeight.bold),\n//           ),\n//         ),\n//       ],\n//     );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/app_pages/parent_category.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\n\nclass ParentCategoryList extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    List<CategoryItem> parentCategories = sharedPrefs.getAllExpenseItemsLists()\n        .map((item) => CategoryItem(\n            item[0].iconCodePoint,\n            item[0].iconFontPackage,\n            item[0].iconFontFamily,\n            item[0].text,\n            item[0].description))\n        .toList();\n    return Scaffold(\n      appBar: BasicAppBar(getTranslated(context, 'Parent category')!),\n      body: ListView.builder(\n        itemCount: parentCategories.length,\n        itemBuilder: (context, int) {\n          return GestureDetector(\n              behavior: HitTestBehavior.translucent,\n              onTap: () {\n                Navigator.pop(\n                    context,\n                    parentCategories[int]);\n              },\n              child: Column(\n                children: [\n                  Padding(\n                    padding:\n                        EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h),\n                    child: Row(\n                      children: [\n                        CircleAvatar(\n                            backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                            radius: 20.r,\n                            child: Icon(\n                              iconData(parentCategories[int]),\n                              size: 25.sp,\n                              color: red,\n                            )),\n                        SizedBox(\n                          width: 28.w,\n                        ),\n                        Expanded(\n                          child: Text(\n                            getTranslated(context, parentCategories[int].text) ??\n                                parentCategories[int].text,\n                            style: TextStyle(fontSize: 22.sp),\n                            overflow: TextOverflow.ellipsis,\n                          ),\n                        )\n                      ],\n                    ),\n                  ),\n                  Divider(\n                    thickness: 0.25.h,\n                    indent: 67.w,\n                    color: grey,\n                  )\n                ],\n              ));\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/report.dart",
    "content": "/// Package import\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_swipe_action_cell/core/cell.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/classes/alert_dialog.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/classes/custom_toast.dart';\nimport 'package:money_assistant_2608/project/classes/input_model.dart';\nimport 'package:money_assistant_2608/project/classes/dropdown_box.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:provider/provider.dart';\nimport 'dart:io' show Platform;\n\n/// Chart import\nimport 'package:syncfusion_flutter_charts/charts.dart';\n\nimport 'edit.dart';\n\nvar year = todayDT.year;\n\nclass Report extends StatefulWidget {\n  final String type;\n  final String category;\n  final String selectedDate;\n  final IconData icon;\n  const Report({\n    required this.type,\n    required this.category,\n    required this.selectedDate,\n    required this.icon,\n  });\n\n  @override\n  _ReportState createState() => _ReportState();\n}\n\nclass _ReportState extends State<Report> {\n  @override\n  Widget build(BuildContext context) {\n    Color color = widget.type == getTranslated(context, 'Income') ? green : red;\n\n    return Scaffold(\n      backgroundColor: blue1,\n      appBar: BasicAppBar(getTranslated(context, 'Report')!),\n      body: Column(\n        children: [\n          Padding(\n            padding: EdgeInsets.only(\n              top: 17.h,\n              bottom: 15.h,\n              left: 7.w,\n              right: 7.w,\n            ),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Padding(\n                  padding: EdgeInsets.only(right: 15.w),\n                  child: Icon(this.widget.icon, size: 30.sp, color: color),\n                ),\n                Flexible(\n                  child: Text(\n                    '${getTranslated(context, widget.category) ?? widget.category} ($year)',\n                    style: TextStyle(\n                        fontSize: 24.sp,\n                        fontWeight: FontWeight.bold,\n                        color: color),\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                )\n              ],\n            ),\n          ),\n          Expanded(\n            child: ReportBody(widget.type, widget.category, widget.selectedDate,\n                color, widget.icon),\n          )\n        ],\n      ),\n    );\n  }\n}\n\nclass ReportBody extends StatefulWidget {\n  final String type;\n  final String category;\n  final String selectedDate;\n  final Color color;\n  final IconData icon;\n  ReportBody(\n      this.type, this.category, this.selectedDate, this.color, this.icon);\n  @override\n  _ReportBodyState createState() => _ReportBodyState();\n}\n\nclass _ReportBodyState extends State<ReportBody> {\n  @override\n  Widget build(BuildContext context) {\n    return ChangeNotifierProvider(\n        create: (context) => InputModelList(),\n        builder: (context, child) {\n          return FutureBuilder<List<InputModel>>(\n              initialData: [],\n              future: Provider.of<InputModelList>(context).inputModelList,\n              builder: (BuildContext context,\n                  AsyncSnapshot<List<InputModel>> snapshot) {\n                connectionUI(snapshot);\n                if (snapshot.data == null ||\n                    snapshot.connectionState == ConnectionState.waiting) {\n                  return SizedBox();\n                } else {\n                  double yearAmount = 0;\n                  DateTime date(int duration) =>\n                      startOfThisYear.add(Duration(days: duration));\n                  bool isLeapYear(int year) {\n                    return (year % 4 == 0) && (year % 100 != 0) ||\n                        (year % 400 == 0);\n                  }\n\n                  // widget.transactions.sort((a, b) => a.date!.compareTo(b.date!));\n                  List<InputModel> sortByCategory(\n                      List<InputModel> data, String type) {\n                    return data\n                        .map((data) {\n                          if (data.type == type &&\n                              data.category == widget.category) {\n                            return inputModel(data);\n                          }\n                        })\n                        .where((element) => element != null)\n                        .toList()\n                        .cast<InputModel>();\n                  }\n\n                  List<InputModel> transactions = widget.type == 'Income'\n                      ? sortByCategory(snapshot.data!, 'Income')\n                      : sortByCategory(snapshot.data!, 'Expense');\n\n                  List<InputModel> transactionsYearly = (transactions\n                          .map((data) {\n                            DateTime dateSelectedDT =\n                                DateFormat('dd/MM/yyyy').parse(data.date!);\n\n                            if (dateSelectedDT.isAfter(startOfThisYear\n                                    .subtract(Duration(days: 1))) &&\n                                dateSelectedDT\n                                    .isBefore(DateTime(todayDT.year, 12, 31))) {\n                              return inputModel(data);\n                            }\n                          })\n                          .where((element) => element != null)\n                          .toList())\n                      .cast<InputModel>();\n\n                  if (transactionsYearly.length > 0) {\n                    for (InputModel? transaction in transactionsYearly) {\n                      yearAmount = yearAmount + transaction!.amount!;\n                    }\n                  }\n\n                  MonthAmount monthBasedTransaction(\n                      String month, DateTime date, int days) {\n                    double monthAmount = 0;\n                    for (InputModel transaction in transactionsYearly) {\n                      DateTime dateSelectedDT =\n                          DateFormat('dd/MM/yyyy').parse(transaction.date!);\n\n                      if (dateSelectedDT.isAfter(date) &&\n                          dateSelectedDT.isBefore(\n                              startOfThisYear.add(Duration(days: days)))) {\n                        transaction.amount ??= 0;\n                        monthAmount = monthAmount + transaction.amount!;\n                      }\n                    }\n                    return MonthAmount(month, monthAmount);\n                  }\n\n                  List<MonthAmount>? monthBasedTransactionList =\n                      isLeapYear(year)\n                          ? []\n                          : [\n                              monthBasedTransaction(\n                                  'Jan',\n                                  startOfThisYear.subtract(Duration(days: 1)),\n                                  30),\n                              monthBasedTransaction('Feb', date(30), 58),\n                              monthBasedTransaction('Mar', date(58), 89),\n                              monthBasedTransaction('Apr', date(89), 119),\n                              monthBasedTransaction('May', date(119), 150),\n                              monthBasedTransaction('Jun', date(150), 180),\n                              monthBasedTransaction('Jul', date(180), 211),\n                              monthBasedTransaction('Aug', date(211), 242),\n                              monthBasedTransaction('Sep', date(242), 272),\n                              monthBasedTransaction('Oct', date(272), 302),\n                              monthBasedTransaction('Nov', date(302), 333),\n                              monthBasedTransaction('Dec', date(333), 364),\n                            ];\n\n                  double maximumMonthAmount =\n                      monthBasedTransactionList[0].amount;\n                  for (int i = 0; i < monthBasedTransactionList.length; i++) {\n                    if (monthBasedTransactionList[i].amount >\n                        maximumMonthAmount) {\n                      maximumMonthAmount = monthBasedTransactionList[i].amount;\n                    }\n                  }\n\n                  return Column(\n                    children: [\n                      Padding(\n                        padding: EdgeInsets.only(right: 8.0.w),\n                        child: SizedBox(\n                          height: 280.h,\n                          child: SfCartesianChart(\n                            primaryXAxis: CategoryAxis(\n                                // placeLabelsNearAxisLine: true,\n                                // edgeLabelPlacement: EdgeLabelPlacement.none,\n                                // majorTickLines: MajorTickLines(size: 5, width: 1),\n                                axisLine: AxisLine(\n                                  width: 3.h,\n                                ),\n                                labelPlacement: LabelPlacement.onTicks,\n                                isVisible: true,\n                                labelRotation: -45,\n                                rangePadding: ChartRangePadding.none,\n                                majorGridLines: MajorGridLines(width: 0)),\n                            // tooltipBehavior: _tooltipBehavior,\n                            primaryYAxis: NumericAxis(\n                                majorGridLines: MajorGridLines(width: 0),\n                                minimum: 0,\n                                maximum: maximumMonthAmount,\n                                labelFormat: '{value}',\n                                axisLine: AxisLine(\n                                  width: 4.h,\n                                ),\n                                majorTickLines: MajorTickLines(size: 5.sp)),\n                            series: _getGradientAreaSeries(\n                                this.widget.type, monthBasedTransactionList),\n                            onMarkerRender: (MarkerRenderArgs args) {\n                              if (this.widget.type == 'Income') {\n                                if (args.pointIndex == 0) {\n                                  args.color =\n                                      const Color.fromRGBO(9, 110, 16, 1);\n                                } else if (args.pointIndex == 1) {\n                                  args.color =\n                                      const Color.fromRGBO(19, 134, 13, 1);\n                                } else if (args.pointIndex == 2) {\n                                  args.color =\n                                      const Color.fromRGBO(55, 171, 49, 1);\n                                } else if (args.pointIndex == 3) {\n                                  args.color =\n                                      const Color.fromRGBO(77, 213, 70, 1);\n                                } else if (args.pointIndex == 4) {\n                                  args.color =\n                                      const Color.fromRGBO(134, 213, 70, 1);\n                                } else if (args.pointIndex == 5) {\n                                  args.color =\n                                      const Color.fromRGBO(156, 222, 103, 1);\n                                } else if (args.pointIndex == 6) {\n                                  args.color =\n                                      const Color.fromRGBO(153, 249, 172, 1);\n                                } else if (args.pointIndex == 7) {\n                                  args.color =\n                                      const Color.fromRGBO(189, 235, 120, 1);\n                                } else if (args.pointIndex == 8) {\n                                  args.color =\n                                      const Color.fromRGBO(177, 249, 191, 1);\n                                } else if (args.pointIndex == 9) {\n                                  args.color =\n                                      const Color.fromRGBO(217, 241, 179, 1);\n                                } else if (args.pointIndex == 10) {\n                                  args.color =\n                                      const Color.fromRGBO(235, 246, 199, 1);\n                                } else if (args.pointIndex == 11) {\n                                  args.color = Colors.white;\n                                }\n                              } else {\n                                if (args.pointIndex == 0) {\n                                  args.color =\n                                      const Color.fromRGBO(159, 16, 32, 1);\n                                } else if (args.pointIndex == 1) {\n                                  args.color =\n                                      const Color.fromRGBO(197, 71, 84, 1);\n                                } else if (args.pointIndex == 2) {\n                                  args.color =\n                                      const Color.fromRGBO(207, 124, 168, 1);\n                                } else if (args.pointIndex == 3) {\n                                  args.color =\n                                      const Color.fromRGBO(219, 128, 161, 1);\n                                } else if (args.pointIndex == 4) {\n                                  args.color =\n                                      const Color.fromRGBO(213, 143, 151, 1);\n                                } else if (args.pointIndex == 5) {\n                                  args.color =\n                                      const Color.fromRGBO(226, 157, 126, 1);\n                                } else if (args.pointIndex == 6) {\n                                  args.color =\n                                      const Color.fromRGBO(230, 168, 138, 1);\n                                } else if (args.pointIndex == 7) {\n                                  args.color =\n                                      const Color.fromRGBO(221, 176, 108, 1);\n                                } else if (args.pointIndex == 8) {\n                                  args.color =\n                                      const Color.fromRGBO(222, 187, 97, 1);\n                                } else if (args.pointIndex == 9) {\n                                  args.color =\n                                      const Color.fromRGBO(250, 204, 160, 1);\n                                } else if (args.pointIndex == 10) {\n                                  args.color =\n                                      const Color.fromRGBO(248, 219, 191, 1);\n                                } else if (args.pointIndex == 11) {\n                                  args.color = Colors.white;\n                                }\n                              }\n                            },\n                          ),\n                        ),\n                      ),\n                      Text(\n                        '${getTranslated(context, 'This year')}: ${format(yearAmount.toDouble())} $currency',\n                        textAlign: TextAlign.center,\n                        style: TextStyle(\n                            fontSize: 17.5.sp, fontWeight: FontWeight.bold),\n                      ),\n                      ChangeNotifierProvider<ChangeSelectedDate>(\n                          create: (context) => ChangeSelectedDate(),\n                          child: Selector<ChangeSelectedDate, String?>(\n                              selector: (_, changeSelectedDate) =>\n                                  changeSelectedDate.selectedReportDate,\n                              builder: (context, selectedAnalysisDate, child) {\n                                selectedAnalysisDate ??= widget.selectedDate;\n\n                                //selectedTransactions is data sorted by category and selectedDate\n                                List<InputModel> selectedTransactions =\n                                    filterData(context, transactions,\n                                        selectedAnalysisDate);\n                                double totalAmount = 0;\n                                if (selectedTransactions.length > 0) {\n                                  for (InputModel? transaction\n                                      in selectedTransactions) {\n                                    totalAmount =\n                                        totalAmount + transaction!.amount!;\n                                  }\n                                }\n                                return Expanded(\n                                  child: Column(\n                                    children: [\n                                      // selectedTransactions = selectedTransactions.reversed.toList();\n                                      Padding(\n                                        padding: EdgeInsets.only(\n                                            left:\n                                                totalAmount.toString().length <\n                                                        16\n                                                    ? 10.w\n                                                    : 6.w,\n                                            right:\n                                                totalAmount.toString().length <\n                                                        15\n                                                    ? 20.h\n                                                    : 10.h,\n                                            top: 25.h),\n                                        child: Row(\n                                          children: [\n                                            DropDownBox(\n                                                false, selectedAnalysisDate),\n                                            Spacer(),\n                                            Text(\n                                              '${format(totalAmount.toDouble())} $currency',\n                                              style: GoogleFonts.aBeeZee(\n                                                  fontSize: format(totalAmount\n                                                                  .toDouble())\n                                                              .toString()\n                                                              .length >\n                                                          18\n                                                      ? 14.sp\n                                                      : format(totalAmount\n                                                                      .toDouble())\n                                                                  .toString()\n                                                                  .length >\n                                                              14\n                                                          ? 17.sp\n                                                          : 20.sp,\n                                                  fontStyle: FontStyle.italic,\n                                                  fontWeight: FontWeight.bold,\n                                                  color: widget.color),\n                                            )\n                                          ],\n                                        ),\n                                      ),\n\n                                      Divider(\n                                        thickness: 0.5.h,\n                                        height: 25.h,\n                                        color: grey,\n                                      ),\n                                      Expanded(\n                                        child: ListView.builder(\n                                            shrinkWrap: true,\n                                            itemCount:\n                                                selectedTransactions.length,\n                                            itemBuilder: (context, int) {\n                                              return GestureDetector(\n                                                behavior:\n                                                    HitTestBehavior.translucent,\n                                                onTap: () {\n                                                  Navigator.push(\n                                                      context,\n                                                      MaterialPageRoute(\n                                                          builder: (context) =>\n                                                              Edit(\n                                                                inputModel:\n                                                                    selectedTransactions[\n                                                                        int],\n                                                                categoryIcon:\n                                                                    widget.icon,\n                                                              ))).then(\n                                                      (value) => Provider.of<\n                                                                  InputModelList>(\n                                                              context,\n                                                              listen: false)\n                                                          .changeInputModelList());\n                                                },\n                                                child: SwipeActionCell(\n                                                  backgroundColor:\n                                                      Colors.transparent,\n                                                  key: ObjectKey(\n                                                      selectedTransactions[\n                                                          int]),\n                                                  performsFirstActionWithFullSwipe:\n                                                      true,\n                                                  trailingActions: <\n                                                      SwipeAction>[\n                                                    SwipeAction(\n                                                        title: getTranslated(context, 'Delete') ?? 'Delete',\n                                                        onTap:\n                                                            (CompletionHandler\n                                                                handler) async {\n                                                          Platform.isIOS\n                                                              ? iosDialog(\n                                                                  context,\n                                                                  'Are you sure you want to delete this transaction?',\n                                                                  'Delete',\n                                                                  () async {\n                                                                  DB.delete(\n                                                                      selectedTransactions[\n                                                                              int]\n                                                                          .id!);\n                                                                  await handler(\n                                                                      true);\n                                                                  Provider.of<InputModelList>(\n                                                                          context,\n                                                                          listen:\n                                                                              false)\n                                                                      .changeInputModelList();\n                                                                  customToast(\n                                                                      context,\n                                                                      'Transaction has been deleted');\n                                                                })\n                                                              : androidDialog(\n                                                                  context,\n                                                                  'Are you sure you want to delete this transaction?',\n                                                                  'Delete',\n                                                                  () async {\n                                                                  DB.delete(\n                                                                      selectedTransactions[\n                                                                              int]\n                                                                          .id!);\n                                                                  await handler(\n                                                                      true);\n                                                                  Provider.of<InputModelList>(\n                                                                          context,\n                                                                          listen:\n                                                                              false)\n                                                                      .changeInputModelList();\n                                                                  customToast(\n                                                                      context,\n                                                                      'Transaction has been deleted');\n                                                                });\n                                                        },\n                                                        color: red),\n                                                    SwipeAction(\n                                                        title: getTranslated(context, 'Add') ?? 'Add',\n                                                        onTap:\n                                                            (CompletionHandler\n                                                                handler) {\n                                                          var model =\n                                                              selectedTransactions[\n                                                                  int];\n                                                          model.id = null;\n                                                          DB.insert(model);\n                                                          Provider.of<InputModelList>(\n                                                                  context,\n                                                                  listen: false)\n                                                              .changeInputModelList();\n                                                          customToast(context,\n                                                              'Transaction has been updated');\n                                                        },\n                                                        color: Color.fromRGBO(\n                                                            255, 183, 121, 1)),\n                                                  ],\n                                                  child: Padding(\n                                                    padding: EdgeInsets.only(\n                                                        left: 15.w,\n                                                        right: 15.w,\n                                                        top: 7.h),\n                                                    child: Row(\n                                                      children: [\n                                                        Text(\n                                                            DateFormat(sharedPrefs\n                                                                    .dateFormat)\n                                                                .format(DateFormat(\n                                                                        'dd/MM/yyyy')\n                                                                    .parse(selectedTransactions[\n                                                                            int]\n                                                                        .date!)),\n                                                            style: GoogleFonts\n                                                                .aBeeZee(\n                                                                    fontSize:\n                                                                        17.sp)),\n                                                        Spacer(),\n                                                        Text(\n                                                            '${format(selectedTransactions[int].amount!)} $currency',\n                                                            style: GoogleFonts\n                                                                .aBeeZee(\n                                                                    fontSize:\n                                                                        18.5.sp)),\n                                                        SizedBox(\n                                                          width: 15.w,\n                                                        ),\n                                                        Icon(\n                                                          Icons\n                                                              .arrow_forward_ios,\n                                                          size: 17.sp,\n                                                        )\n                                                      ],\n                                                    ),\n                                                  ),\n                                                ),\n                                              );\n                                            }),\n                                      )\n                                    ],\n                                  ),\n                                );\n                              }))\n                    ],\n                  );\n                }\n              });\n        });\n  }\n}\n\n/// Returns the list of spline area series with horizontal gradient.\nList<ChartSeries<MonthAmount, String>> _getGradientAreaSeries(\n    String type, List<MonthAmount> monthAmountList) {\n  // final List<Color> color = <Color>[];\n  // color.add(Colors.blue[200]!);\n  // color.add(Colors.orange[200]!);\n\n  // final List<double> stops = <double>[];\n  // stops.add(0.2);\n  // stops.add(0.7);\n\n  return <ChartSeries<MonthAmount, String>>[\n    SplineAreaSeries<MonthAmount, String>(\n      /// To set the gradient colors for border here.\n      borderGradient: type == 'Income'\n          ? const LinearGradient(colors: <Color>[\n              Color.fromRGBO(56, 135, 5, 1),\n              Color.fromRGBO(159, 196, 135, 1)\n            ], stops: <double>[\n              0.2,\n              0.9\n            ])\n          : const LinearGradient(colors: <Color>[\n              Color.fromRGBO(212, 126, 166, 1),\n              Color.fromRGBO(222, 187, 104, 1)\n            ], stops: <double>[\n              0.2,\n              0.9\n            ]),\n\n      /// To set the gradient colors for series.\n      gradient: type == 'Income'\n          ? const LinearGradient(colors: <Color>[\n              Color.fromRGBO(101, 181, 60, 1),\n              Color.fromRGBO(139, 194, 72, 1),\n              Color.fromRGBO(203, 241, 119, 0.9)\n            ], stops: <double>[\n              0.2,\n              0.5,\n              0.9\n            ])\n          : const LinearGradient(colors: <Color>[\n              Color.fromRGBO(224, 139, 207, 0.9),\n              Color.fromRGBO(255, 232, 149, 0.9)\n            ], stops: <double>[\n              0.2,\n              0.9\n            ]),\n      borderWidth: 2.5.w,\n      markerSettings: MarkerSettings(\n        isVisible: true,\n        height: 8.h,\n        width: 8.h,\n        borderColor:\n            type == 'Income' ? Color.fromRGBO(161, 171, 35, 1) : Colors.white,\n        borderWidth: 2.w,\n      ),\n      borderDrawMode: BorderDrawMode.all,\n      dataSource: monthAmountList,\n      xValueMapper: (MonthAmount monthAmount, _) => monthAmount.month,\n      yValueMapper: (MonthAmount monthAmount, _) => monthAmount.amount,\n    )\n  ];\n}\n\nclass MonthAmount {\n  final String month;\n  final double amount;\n  const MonthAmount(this.month, this.amount);\n}\n"
  },
  {
    "path": "lib/project/app_pages/select_date_format.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:provider/provider.dart';\n\nimport '../provider.dart';\n\nclass FormatDate extends StatelessWidget {\n  const FormatDate({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    List<String> dateFormats = [\n      'dd/MM/yyyy',\n      'MM/dd/yyyy',\n      'yyyy/MM/dd',\n      'yMMMd',\n      'MMMEd',\n      'MEd',\n      'MMMMd',\n      'MMMd',\n    ];\n    return Scaffold(\n        appBar: AppBar(\n            backgroundColor: blue3,\n            title: Text(\n                getTranslated(context, 'Select a date format') ??\n                    'Select a date format',\n                style: TextStyle(fontSize: 21.sp)),\n            actions: [\n              Padding(\n                padding: EdgeInsets.only(right: 5.w),\n                child: TextButton(\n                    child: Text(\n                      getTranslated(context, 'Save') ?? 'Save',\n                      style: TextStyle(fontSize: 18.5.sp, color: white),\n                    ),\n                    onPressed: () => Navigator.pop(context)),\n              )\n            ]),\n        body: ChangeNotifierProvider<OnDateFormatSelected>(\n          create: (context) => OnDateFormatSelected(),\n          builder: (context, widget) => ListView.builder(\n              itemCount: dateFormats.length,\n              itemBuilder: (context, int) => GestureDetector(\n                    behavior: HitTestBehavior.translucent,\n                    onTap: () {\n                      context\n                          .read<OnDateFormatSelected>()\n                          .onDateFormatSelected(dateFormats[int]);\n                    },\n                    child: Column(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: [\n                          Padding(\n                            padding: EdgeInsets.all(\n                                27.h),\n                            child: Row(\n                              children: [\n                                Text(\n                                  '${DateFormat(dateFormats[int]).format(now)}',\n                                  style: TextStyle(\n                                      fontSize: 19.sp,\n                                  ),\n                                ),\n                                Spacer(),\n                                context\n                                            .watch<OnDateFormatSelected>()\n                                            .dateFormat ==\n                                        dateFormats[int]\n                                    ? Icon(Icons.check_circle,\n                                        size: 25.sp, color: blue3)\n                                    : SizedBox()\n                              ],\n                            ),\n                          ),\n                          Divider(height: 0, thickness: 0.25, color: grey)\n                        ]),\n                  )),\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/select_icon.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/app_bar.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\n\n\nclass SelectIcon extends StatelessWidget {\n  final String type;\n  SelectIcon(this.type);\n  @override\n  Widget build(BuildContext context) {\n    final List<CategoryItem> icons = createItemList(\n        forAnalysisPage: false, isIncomeType: false, forSelectIconPage: true);\n    return Scaffold(\n      appBar: BasicAppBar(getTranslated(context, 'Icons')!),\n      body: GridView.count(\n        crossAxisCount: 4,\n        childAspectRatio: 0.82,\n        shrinkWrap: true,\n        children: List.generate(icons.length, (index) {\n          return Padding(\n            padding: const EdgeInsets.symmetric(vertical: 15),\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.center,\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                IconButton(\n                  onPressed: () {\n                    Navigator.pop(context, iconData(icons[index])\n                        );\n                  },\n                  iconSize: 60.sp,\n                  icon: CircleAvatar(\n                      backgroundColor: Color.fromRGBO(215, 223, 231, 1),\n                      radius: 24.r,\n                      child: Icon(\n                        iconData(icons[index]),\n                        size: 30.sp,\n                        color: this.type == 'Income' ? green : red,\n                      )),\n                ),\n              ],\n            ),\n          );\n        }),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/app_pages/select_language.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/language.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\n\nimport '../provider.dart';\nimport '../real_main.dart';\n\nclass SelectLanguage extends StatefulWidget {\n  @override\n  _SelectLanguageState createState() => _SelectLanguageState();\n}\n\nclass _SelectLanguageState extends State<SelectLanguage> {\n\n  @override\n  Widget build(BuildContext context) {\n    List<Language> languageList = Language.languageList;\n    return Scaffold(\n        appBar: AppBar(\n            backgroundColor: blue3,\n            title: Text(getTranslated(context, 'Select a language')!,\n                style: TextStyle(fontSize: 21.sp)),\n            actions: [\n              Padding(\n                padding: EdgeInsets.only(right: 5.w),\n                child: TextButton(\n                  child: Text(\n                    getTranslated(context, 'Save') ?? 'Save',\n                    style: TextStyle(fontSize: 18.5.sp, color: white),\n                  ),\n                  onPressed: () => Navigator.pop(context),\n                ),\n              )\n            ]\n        ),\n        body: ChangeNotifierProvider<OnLanguageSelected>(\n          create: (context) => OnLanguageSelected(),\n          builder: (context, widget) => ListView.builder(\n              itemCount: languageList.length,\n              itemBuilder: (context, int) {\n                return GestureDetector(\n                  behavior: HitTestBehavior.translucent,\n                  onTap: () {\n                    Locale _locale = sharedPrefs.setLocale(languageList[int].languageCode);\n                    MyApp.setLocale(context, _locale);\n                    context\n                        .read<OnLanguageSelected>()\n                        .onSelect(languageList[int].languageCode);\n                  },\n                  child: Column(\n                    children: [\n                      Padding(\n                        padding: EdgeInsets.symmetric(\n                            vertical: 5.h, horizontal: 23.w),\n                        child: Row(\n                          children: [\n                            Text(\n                              languageList[int].flag,\n                              style: TextStyle(fontSize: 45.sp),\n                            ),\n                            SizedBox(\n                              width: 35.w,\n                            ),\n                            Text(languageList[int].name,\n                                style: TextStyle(\n                                  fontSize: 20.sp,\n                                )),\n                            Spacer(),\n                            context.watch<OnLanguageSelected>().languageCode ==\n                                    languageList[int].languageCode\n                                ? Icon(Icons.check_circle,\n                                    size: 25.sp, color: blue3)\n                                : SizedBox(),\n                            SizedBox(width: 15.w)\n                          ],\n                        ),\n                      ),\n                      Divider(\n                        indent: 90.w,\n                        height: 0,\n                        thickness: 0.25.h,\n                        color: grey,\n                      ),\n                    ],\n                  ),\n                );\n              }),\n        ));\n  }\n}\n"
  },
  {
    "path": "lib/project/auth_pages/loading_page.dart",
    "content": "// import 'package:flutter/material.dart';\n// import 'package:flutter_spinkit/flutter_spinkit.dart';\n//\n// class Loading extends StatelessWidget {\n//   @override\n//   Widget build(BuildContext context) {\n//     return Container(\n//       color: Colors.brown[100],\n//       child: Center(\n//         child: SpinKitChasingDots(\n//           color: Colors.brown,\n//           size: 50.0,\n//         ),\n//       ),\n//     );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/auth_pages/sign_in.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_login/flutter_login.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nimport '../home.dart';\n\nclass SignIn extends StatelessWidget {\n  Future<String?>? _authenticateUsers(LoginData data) {\n    print('authenticate users');\n    return Future.delayed(Duration(seconds: 1)).then((_) => null);\n  }\n\n  Future<String?>? _onRecoverPassword(String name) {\n    print('onRecoverPassword');\n    return Future.delayed(Duration(seconds: 1)).then((_) => null);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final inputBorder = BorderRadius.vertical(\n      bottom: Radius.circular(10.0),\n      top: Radius.circular(20.0),\n    );\n    return FlutterLogin(\n      title: 'MMAS',\n      logo: 'Hi!',\n      onSignup: _authenticateUsers,\n      onLogin: _authenticateUsers,\n      onRecoverPassword: _onRecoverPassword,\n      onSubmitAnimationCompleted: () {\n        Navigator.pushReplacement(\n            context, MaterialPageRoute(builder: (context) => Home()));\n      },\n      messages: LoginMessages(\n        userHint: 'User',\n        passwordHint: 'Pass',\n        confirmPasswordHint: 'Confirm',\n        loginButton: 'LOG IN',\n        signupButton: 'REGISTER',\n        forgotPasswordButton: 'Forgot huh?',\n        recoverPasswordButton: 'HELP ME',\n        goBackButton: 'GO BACK',\n        confirmPasswordError: 'Not match!',\n        recoverPasswordDescription: 'recoverPasswordDescription',\n        recoverPasswordSuccess: 'Password rescued successfully',\n      ),\n      loginProviders: <LoginProvider>[\n        LoginProvider(\n          icon: FontAwesomeIcons.google,\n          label: 'Google',\n          callback: () async {\n            print('start google sign in');\n            await Future.delayed(Duration(seconds: 1));\n            print('stop google sign in');\n            return null;\n          },\n        ),\n        LoginProvider(\n          icon: FontAwesomeIcons.facebookF,\n          label: 'Facebook',\n          callback: () async {\n            print('start facebook sign in');\n            await Future.delayed(Duration(seconds: 1));\n            print('stop facebook sign in');\n            return null;\n          },\n        ),\n        LoginProvider(\n          icon: FontAwesomeIcons.linkedinIn,\n          callback: () async {\n            print('start linkdin sign in');\n            await Future.delayed(Duration(seconds: 1));\n            print('stop linkdin sign in');\n            return null;\n          },\n        ),\n        LoginProvider(\n          icon: FontAwesomeIcons.githubAlt,\n          callback: () async {\n            print('start github sign in');\n            await Future.delayed(Duration(seconds: 1));\n            print('stop github sign in');\n            return null;\n          },\n        ),\n      ],\n      theme: LoginTheme(\n        primaryColor: Colors.teal,\n        accentColor: Colors.yellow,\n        errorColor: Colors.deepOrange,\n        titleStyle: TextStyle(\n          color: Colors.greenAccent,\n          fontFamily: 'Quicksand',\n          letterSpacing: 4,\n        ),\n        bodyStyle: TextStyle(\n          fontStyle: FontStyle.italic,\n          decoration: TextDecoration.underline,\n        ),\n        textFieldStyle: TextStyle(\n          color: Colors.orange,\n          shadows: [Shadow(color: Colors.yellow, blurRadius: 2)],\n        ),\n        buttonStyle: TextStyle(\n          fontWeight: FontWeight.w800,\n          color: Colors.yellow,\n        ),\n        cardTheme: CardTheme(\n          color: Colors.yellow.shade100,\n          elevation: 5,\n          margin: EdgeInsets.only(top: 15),\n          shape: ContinuousRectangleBorder(\n              borderRadius: BorderRadius.circular(100.0)),\n        ),\n        inputTheme: InputDecorationTheme(\n          filled: true,\n          fillColor: Colors.purple.withOpacity(.1),\n          contentPadding: EdgeInsets.zero,\n          errorStyle: TextStyle(\n            backgroundColor: Colors.orange,\n            color: Colors.white,\n          ),\n          labelStyle: TextStyle(fontSize: 12),\n          enabledBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.blue.shade700, width: 4),\n            borderRadius: inputBorder,\n          ),\n          focusedBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.blue.shade400, width: 5),\n            borderRadius: inputBorder,\n          ),\n          errorBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.red.shade700, width: 7),\n            borderRadius: inputBorder,\n          ),\n          focusedErrorBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.red.shade400, width: 8),\n            borderRadius: inputBorder,\n          ),\n          disabledBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.grey, width: 5),\n            borderRadius: inputBorder,\n          ),\n        ),\n        buttonTheme: LoginButtonTheme(\n          splashColor: Colors.purple,\n          backgroundColor: Colors.pinkAccent,\n          highlightColor: Colors.lightGreen,\n          elevation: 9.0,\n          highlightElevation: 6.0,\n          shape: BeveledRectangleBorder(\n            borderRadius: BorderRadius.circular(10),\n          ),\n          // shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),\n          // shape: CircleBorder(side: BorderSide(color: Colors.green)),\n          // shape: ContinuousRectangleBorder(borderRadius: BorderRadius.circular(55.0)),\n        ),\n      ),\n    );\n  }\n}\n\n// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n//\n// import '../../classes/textinput_decoration.dart';\n// import 'loading_page.dart';\n//\n// class SignIn extends StatefulWidget {\n//   @override\n//   _SignInState createState() => _SignInState();\n// }\n//\n// class _SignInState extends State<SignIn> {\n//   final AuthService _auth = AuthService();\n//   final _formKey = GlobalKey<FormState>();\n//   String error = '';\n//   bool loading = false;\n//\n//   // text field state\n//   String email = '';\n//   String password = '';\n//\n//   @override\n//   Widget build(BuildContext context) {\n//     return loading\n//         ? Loading()\n//         : Scaffold(\n//             backgroundColor: Colors.brown[100],\n//             appBar: AppBar(\n//               backgroundColor: Colors.brown[400],\n//               elevation: 0.0,\n//               title: Text('Sign in to Brew Crew'),\n//               actions: <Widget>[\n//                 FlatButton.icon(\n//                   icon: Icon(Icons.person),\n//                   label: Text('Register'),\n//                   onPressed: () {},\n//                 ),\n//               ],\n//             ),\n//             body: Container(\n//               padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 50.0),\n//               child: Form(\n//                 key: _formKey,\n//                 child: Column(\n//                   children: <Widget>[\n//                     SizedBox(height: 20.0),\n//                     TextFormField(\n//                       decoration:\n//                           textInputDecoration.copyWith(hintText: 'email'),\n//                       validator: (val) => val.isEmpty ? 'Enter an email' : null,\n//                       onChanged: (val) {\n//                         setState(() => email = val);\n//                       },\n//                     ),\n//                     SizedBox(height: 20.0),\n//                     TextFormField(\n//                       obscureText: true,\n//                       decoration:\n//                           textInputDecoration.copyWith(hintText: 'password'),\n//                       validator: (val) => val.length < 6\n//                           ? 'Enter a password 6+ chars long'\n//                           : null,\n//                       onChanged: (val) {\n//                         setState(() => password = val);\n//                       },\n//                     ),\n//                     SizedBox(height: 20.0),\n//                     RaisedButton(\n//                         color: Colors.pink[400],\n//                         child: Text(\n//                           'Sign In',\n//                           style: TextStyle(color: Colors.white),\n//                         ),\n//                         onPressed: () async {\n//                           if (_formKey.currentState.validate()) {\n//                             setState(() => loading = true);\n//                             dynamic result = await _auth\n//                                 .signInWithEmailAndPassword(email, password);\n//                             if (result == null) {\n//                               setState(() {\n//                                 loading = false;\n//                                 error =\n//                                     'Could not sign in with those credentials';\n//                               });\n//                             } else {\n//                               Navigator.pop(context);\n//                             }\n//                           }\n//                         }),\n//                     SizedBox(height: 12.0),\n//                     Text(\n//                       error,\n//                       style: TextStyle(color: Colors.red, fontSize: 14.0),\n//                     ),\n//                   ],\n//                 ),\n//               ),\n//             ),\n//           );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/auth_pages/sign_up.dart",
    "content": "// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n//\n// import '../../classes/textinput_decoration.dart';\n// import 'loading_page.dart';\n//\n// class SignUp extends StatefulWidget {\n//   @override\n//   _SignUpState createState() => _SignUpState();\n// }\n//\n// class _SignUpState extends State<SignUp> {\n//   final AuthService _auth = AuthService();\n//   final _formKey = GlobalKey<FormState>();\n//   String error = '';\n//   bool loading = false;\n//\n//   // text field state\n//   String email = '';\n//   String password = '';\n//\n//   @override\n//   Widget build(BuildContext context) {\n//     return loading\n//         ? Loading()\n//         : Scaffold(\n//             backgroundColor: Colors.brown[100],\n//             appBar: AppBar(\n//               backgroundColor: Colors.brown[400],\n//               elevation: 0.0,\n//               title: Text('Sign up to Brew Crew'),\n//               actions: <Widget>[\n//                 FlatButton.icon(\n//                   icon: Icon(Icons.person),\n//                   label: Text('Sign In'),\n//                   onPressed: () {},\n//                 ),\n//               ],\n//             ),\n//             body: Container(\n//               padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 50.0),\n//               child: Form(\n//                 key: _formKey,\n//                 child: Column(\n//                   children: <Widget>[\n//                     SizedBox(height: 20.0),\n//                     TextFormField(\n//                       decoration:\n//                           textInputDecoration.copyWith(hintText: 'email'),\n//                       validator: (val) => val.isEmpty ? 'Enter an email' : null,\n//                       onChanged: (val) {\n//                         setState(() => email = val);\n//                       },\n//                     ),\n//                     SizedBox(height: 20.0),\n//                     TextFormField(\n//                       decoration:\n//                           textInputDecoration.copyWith(hintText: 'password'),\n//                       obscureText: true,\n//                       validator: (val) => val.length < 6\n//                           ? 'Enter a password 6+ chars long'\n//                           : null,\n//                       onChanged: (val) {\n//                         setState(() => password = val);\n//                       },\n//                     ),\n//                     SizedBox(height: 20.0),\n//                     RaisedButton(\n//                         color: Colors.pink[400],\n//                         child: Text(\n//                           'Register',\n//                           style: TextStyle(color: Colors.white),\n//                         ),\n//                         onPressed: () async {\n//                           if (_formKey.currentState.validate()) {\n//                             setState(() => loading = true);\n//                             dynamic result = await _auth\n//                                 .registerWithEmailAndPassword(email, password);\n//\n//                             if (result == null) {\n//                               setState(() {\n//                                 loading = false;\n//                                 error = 'Please supply a valid email';\n//                               });\n//                             } else {\n//                               Navigator.pop(context);\n//                             }\n//                           }\n//                         }),\n//                     SizedBox(height: 12.0),\n//                     Text(\n//                       error,\n//                       style: TextStyle(color: Colors.red, fontSize: 14.0),\n//                     )\n//                   ],\n//                 ),\n//               ),\n//             ),\n//           );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/auth_pages/user_account.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\n\n\n// final AuthService _auth = AuthService();\n\nclass UserAccount extends StatefulWidget {\n  @override\n  _UserAccountState createState() => _UserAccountState();\n}\n\nclass _UserAccountState extends State<UserAccount> {\n  List<String> textList = [\n    \"Personal information\",\n    \"Account link\",\n    \"Change password\",\n    \"sign out\"\n  ];\n  List<IconData> iconList = [\n    Icons.person,\n    Icons.link_sharp,\n    Icons.admin_panel_settings_sharp,\n    Icons.logout\n  ];\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: PreferredSize(\n          preferredSize: Size.fromHeight(270.h),\n          child: Container(\n            height: 270,\n            child: Padding(\n              padding:  EdgeInsets.only(top: 40.h),\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Padding(\n                    padding:  EdgeInsets.only(left: 20.w),\n                    child: IconButton(\n                        icon: Icon(Icons.arrow_back_ios),\n                        onPressed: () {\n                          Navigator.pop(context);\n                        }),\n                  ),\n                  Center(\n                    child: CircleAvatar(\n                      child: CircleAvatar(\n                          radius: 30.r,\n                          backgroundColor: Color.fromRGBO(210, 234, 251, 1)),\n                      radius: 35.r,\n                      backgroundColor: Colors.grey,\n                    ),\n                  ),\n                  SizedBox(\n                    height: 10.h,\n                  ),\n                  Center(\n                      child: Text(\n                    \"User name\",\n                    style: TextStyle(fontSize: 25.sp, fontWeight: FontWeight.bold),\n                  )),\n                  SizedBox(\n                    height: 15.h,\n                  ),\n                  Center(\n                    child: Container(\n                      width: 100.w,\n                      height: 30.h,\n                      decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(40),\n                          border:\n                              Border.all(color: Colors.blueGrey, width: 0.5)),\n                      child: Row(\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: [\n                          Icon(Icons.crop_free),\n                          SizedBox(\n                            width: 3.w,\n                          ),\n                          Text(\n                            \"Free\",\n                            style: TextStyle(fontSize: 20.sp),\n                          )\n                        ],\n                      ),\n                    ),\n                  ),\n                  SizedBox(\n                    height: 20.h,\n                  ),\n                ],\n              ),\n            ),\n          )),\n      body: Column(\n        children: [\n          // Divider(\n          //   height: 0,\n          //   thickness: 0.8,\n          //   color: Colors.grey,\n          // ),\n          // Container(\n          //   height: 13,\n          //   color: Color.fromRGBO(210, 234, 251, 1),\n          // ),\n          Divider(\n            height: 0,\n            thickness: 0.8.w,\n            color: grey,\n          ),\n          Padding(\n            padding:  EdgeInsets.symmetric(horizontal: 10.w),\n            child: SizedBox(\n              height: 60.h,\n              child: Row(\n                children: [\n                  IconButton(\n                    icon: Icon(\n                      Icons.sports_golf,\n                      size: 30.sp,\n                    ),\n                    onPressed: () {},\n                  ),\n                  SizedBox(\n                    width: 10.w,\n                  ),\n                  Text(\n                    'Explore Premium',\n                    style: TextStyle(fontSize: 25.sp),\n                  )\n                ],\n              ),\n            ),\n          ),\n\n          Divider(\n            height: 0.h,\n            thickness: 0.8.w,\n            color: grey,\n          ),\n\n          Container(\n            height: 60.h,\n            color: Color.fromRGBO(237, 240, 243, 1),\n          ),\n          Divider(\n            height: 1.h,\n            thickness: 0.8.w,\n            color: grey,\n          ),\n\n          Expanded(\n            child: ListView.builder(\n                itemCount: iconList.length,\n                itemBuilder: (context, int) {\n                  return SizedBox(\n                    height: 60.h,\n                    child: Column(children: [\n                      Padding(\n                        padding:  EdgeInsets.symmetric(horizontal: 10.w),\n                        child: Row(\n                          crossAxisAlignment: CrossAxisAlignment.center,\n                          children: [\n                            IconButton(\n                              icon: Icon(\n                                iconList[int],\n                                size: 30.sp,\n                              ),\n                              onPressed: () async {\n                                // await _auth.signOut();\n                                // Navigator.pop(context);\n                              },\n                            ),\n                            SizedBox(\n                              width: 10.w,\n                            ),\n                            Text(\n                              textList[int],\n                              style: TextStyle(fontSize: 25.sp),\n                            ),\n                            Spacer(),\n                            Icon(\n                              Icons.arrow_forward_ios,\n                              size: 20.sp,\n                            ),\n                          ],\n                        ),\n                      ),\n                      Divider(\n                        height: 0,\n                        thickness: 0.8.w,\n                        color: grey,\n                      ),\n                    ]),\n                  );\n                }),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/auth_pages/welcome_page.dart",
    "content": "// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n//\n// import 'sign_in.dart';\n// import 'sign_up.dart';\n//\n// class WelcomePage extends StatefulWidget {\n//   @override\n//   _WelcomePageState createState() => _WelcomePageState();\n// }\n//\n// class _WelcomePageState extends State<WelcomePage> {\n//   @override\n//   Widget build(BuildContext context) {\n//     print('Welcome Page');\n//     return Scaffold(\n//       backgroundColor: Color.fromRGBO(139, 205, 254, 1),\n//       appBar: AppBar(\n//         backgroundColor: Colors.orange,\n//         title: Text(\n//           'Welcome Page',\n//           style: TextStyle(fontSize: 20),\n//         ),\n//       ),\n//       body: Center(\n//         child: Column(\n//           children: [\n//             Row(\n//               children: [\n//                 IconButton(\n//                   icon: Icon(\n//                     Icons.login,\n//                   ),\n//                   onPressed: () => Navigator.push(context,\n//                       MaterialPageRoute(builder: (context) => SignIn())),\n//                 ),\n//                 Text(\n//                   'Sign in',\n//                   style: TextStyle(fontSize: 20),\n//                 )\n//               ],\n//             ),\n//             Row(\n//               children: [\n//                 IconButton(\n//                   icon: Icon(\n//                     Icons.app_registration,\n//                   ),\n//                   onPressed: () => Navigator.push(context,\n//                       MaterialPageRoute(builder: (context) => SignUp())),\n//                 ),\n//                 Text(\n//                   'Sign up',\n//                   style: TextStyle(fontSize: 20),\n//                 )\n//               ],\n//             )\n//           ],\n//         ),\n//       ),\n//     );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/auth_pages/wrapper.dart",
    "content": "// import 'package:flutter/cupertino.dart';\n//\n// import '../app_pages/home.dart';\n// import 'welcome_page.dart';\n//\n// class Wrapper extends StatelessWidget {\n//   final UserUid userUid;\n//   const Wrapper(this.userUid);\n//   @override\n//   Widget build(BuildContext context) {\n//     print('${userUid.uid}');\n//     if (userUid.uid == '') {\n//       return WelcomePage();\n//     } else {\n//       return Home();\n//     }\n//   }\n// }\n"
  },
  {
    "path": "lib/project/auth_services/firebase_authentication.dart",
    "content": "import 'dart:async';\n\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'package:firebase_core/firebase_core.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:google_sign_in/google_sign_in.dart';\nimport 'package:money_assistant_2608/project/classes/custom_toast.dart';\n\n\nclass FirebaseAuthentication {\n  static Future<FirebaseApp> initializeFireBase() async {\n    FirebaseApp firebaseApp = await Firebase.initializeApp();\n    return firebaseApp;\n  }\n\n  static Future<User?> googleSignIn({required BuildContext context}) async{\n    User? user;\n    FirebaseAuth auth = FirebaseAuth.instance;\n    final GoogleSignIn googleSignIn = GoogleSignIn();\n    final GoogleSignInAccount? googleSignInAccount = await googleSignIn.signIn();\n\n    if(googleSignInAccount != null){\n      final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;\n      final AuthCredential credential = GoogleAuthProvider.credential(accessToken: googleSignInAuthentication.accessToken,\n          idToken: googleSignInAuthentication.idToken);\n      try {\n        final UserCredential userCredential = await auth.signInWithCredential(credential);\n        user = userCredential.user;\n      } on FirebaseException catch (e) {\n        if (e.code == 'account-exists-with-different-credentia') {\n          customToast(context,'The account already exists with a different credential.');\n        } else\n        if (e.code == 'invalid-credential') {\n          customToast(context,'Error occurred while accessing credentials. Try again.');\n        }\n      }catch(e){\n        customToast(context,'Error occurred using Google Sign-In. Try again.');\n      }\n    }\n    return user;\n  }\n\n  static Future<void> signOut({required BuildContext context})async{\nfinal  GoogleSignIn googleSignIn =  GoogleSignIn();\ntry{\n  await googleSignIn.signOut();\n} catch (e){\n  customToast(context, 'Error signing out. Try again.');\n}\n  }\n}\n// final FirebaseAuth _auth = FirebaseAuth.instance;\n//\n// UserUid _userUid(User user) {\n//   return user != null ? UserUid(uid: user.uid) : null;\n// }\n//\n// // what is get?\n// Stream<UserUid> get user {\n//   return _auth.authStateChanges().map((User user) => _userUid(user));\n//   // .map(_userUid);\n// }\n//\n// // sign in anon\n// Future signInAnon() async {\n//   try {\n//     UserCredential result = await _auth.signInAnonymously();\n//     User user = result.user;\n//     return _userUid(user);\n//   } catch (e) {\n//     print(e.toString());\n//     return null;\n//   }\n// }\n//\n// // sign in with email and password\n// Future signInWithEmailAndPassword(String email, String password) async {\n//   try {\n//     UserCredential result = await _auth.signInWithEmailAndPassword(\n//         email: email, password: password);\n//     User user = result.user;\n//     return user;\n//   } catch (error) {\n//     print(error.toString());\n//     return null;\n//   }\n// }\n//\n// // register with email and password\n// Future registerWithEmailAndPassword(String email, String password) async {\n//   try {\n//     UserCredential result = await _auth.createUserWithEmailAndPassword(\n//         email: email, password: password);\n//     User user = result.user;\n//     return _userUid(user);\n//   } catch (error) {\n//     print(error.toString());\n//     return null;\n//   }\n// }\n//\n// // sign out\n// Future signOut() async {\n//   try {\n//     return await _auth.signOut();\n//   } catch (error) {\n//     print(error.toString());\n//     return null;\n//   }\n// }\n// }\n\n// class UserUid {\n//   final String uid;\n//\n//   UserUid({this.uid});\n// }\n"
  },
  {
    "path": "lib/project/classes/alert_dialog.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\n\nFuture<void> iosDialog(BuildContext context, String content, String action,\n        Function onAction) =>\n    showCupertinoDialog(\n        context: context,\n        builder: (BuildContext context) {\n          return CupertinoAlertDialog(\n            title: Padding(\n              padding: EdgeInsets.only(\n                bottom: 8.h,\n              ),\n              child: Text(\n                getTranslated(context, 'Please Confirm') ?? 'Please Confirm',\n                style: TextStyle(fontSize: 21.sp),\n              ),\n            ),\n            content: Text(getTranslated(context, content) ?? content,\n                style: TextStyle(fontSize: 15.5.sp)),\n            actions: [\n              CupertinoDialogAction(\n                onPressed: () {\n                  Navigator.pop(context);\n                },\n                child: Padding(\n                  padding: EdgeInsets.symmetric(vertical: 6.h, horizontal: 3.w),\n                  child: Text(getTranslated(context, 'Cancel') ?? 'Cancel',\n                      style: TextStyle(\n                          fontSize: 19.5.sp, fontWeight: FontWeight.w600)),\n                ),\n                isDefaultAction: false,\n                isDestructiveAction: false,\n              ),\n              CupertinoDialogAction(\n                onPressed: () {\n                  onAction();\n                  Navigator.pop(context);\n                },\n                child: Padding(\n                  padding: EdgeInsets.symmetric(vertical: 6.h, horizontal: 3.w),\n                  child: Text(getTranslated(context, action) ?? action,\n                      style: TextStyle(\n                          fontSize: 19.5.sp, fontWeight: FontWeight.w600)),\n                ),\n                isDefaultAction: true,\n                isDestructiveAction: true,\n              )\n            ],\n          );\n        });\n\nFuture<void> androidDialog(BuildContext context, String content, String action,\n        Function onAction) =>\n    showDialog(\n        context: context,\n        builder: (BuildContext context) {\n          return AlertDialog(\n            title: Text(getTranslated(context, 'Please Confirm')!),\n            content: Text(\n                getTranslated(context, content) ?? content),\n            actions: [\n              TextButton(\n                  onPressed: () {\n                    onAction();\n                    Navigator.pop(context);\n                  },\n                  child: Text(getTranslated(context, 'Cancel') ?? 'Cancel')),\n              TextButton(\n                  onPressed: () {\n                    Navigator.pop(context);\n                  },\n                  child: Text(getTranslated(context, action) ?? action))\n            ],\n          );\n        });\n"
  },
  {
    "path": "lib/project/classes/app_bar.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/app_pages/input.dart';\n\nimport 'constants.dart';\n\n\nclass BasicAppBar extends StatelessWidget with PreferredSizeWidget {\n  final String title;\n  const BasicAppBar(this.title);\n\n  @override\n  Size get preferredSize => Size.fromHeight(kToolbarHeight);\n\n  @override\n  Widget build(BuildContext context) {\n    return AppBar(\n      backgroundColor: blue3,\n      title: Text(title, style: TextStyle(fontSize: 21.sp)),\n    );\n  }\n}\n\n\nclass InExAppBar extends StatelessWidget implements PreferredSizeWidget {\nfinal bool isInputPage;\nconst InExAppBar(this.isInputPage);\n  @override\n  Size get preferredSize => Size.fromHeight(kToolbarHeight);\n\n  @override\n  Widget build(BuildContext context) {\n    Tab appBarTab(String title) => Tab(\n      child: Container(\n        width: double.maxFinite,\n        height: double.maxFinite,\n        decoration: BoxDecoration(),\n        child: Align(\n            child: Text(\n              getTranslated(context, title)!,\n              style: TextStyle(fontSize: 19.sp),\n            )),\n      ),\n    );\n    return AppBar(\n      backgroundColor: blue2,\n      title: TabBar(\n        unselectedLabelColor: white,\n        indicatorSize: TabBarIndicatorSize.tab,\n        indicator: BoxDecoration(\n          borderRadius: BorderRadius.circular(50.r),\n          color: Color.fromRGBO(82, 179, 252, 1),\n        ),\n        tabs: [\n         appBarTab('EXPENSE'),\n          appBarTab('INCOME')\n        ],\n      ),\n      actions: isInputPage ? [\n        IconButton(\n          icon: Icon(Icons.check),\n          iconSize: 28,\n          onPressed: () {\n            saveInputFunc(context,true);\n          },\n        )\n      ] : null,\n    );\n  }\n}\n\n\nclass CategoryAppBar extends StatelessWidget implements PreferredSizeWidget {\n  final Widget editCategory;\n  const CategoryAppBar(this.editCategory);\n\n  @override\n  Size get preferredSize => Size.fromHeight(kToolbarHeight);\n\n  @override\n  Widget build(BuildContext context) {\n    return AppBar(\n      backgroundColor: blue3,\n      actions: [\n        Padding(\n          padding: EdgeInsets.only(\n            right: 20.w,\n          ),\n          child: GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTap: () {\n              Navigator.push(context,\n                  MaterialPageRoute(builder: (context) => editCategory));\n            },\n            child: Row(children: [\n              Icon(\n                Icons.edit,\n                size: 19.sp,\n              ),\n              SizedBox(width: 3.w),\n              Text(\n                getTranslated(context, 'Edit')!,\n                style: TextStyle(fontSize: 19.sp),\n              ),\n            ]),\n          ),\n          // child: Icon(Icons.edit),\n        ),\n      ],\n      title: Text(getTranslated(context, 'Category')!,\n          style: TextStyle(fontSize: 21.sp)),\n    );\n  }\n}\n\n\nclass EditCategoryAppBar extends StatelessWidget implements PreferredSizeWidget {\n  final Widget addCategory;\n  const EditCategoryAppBar(this.addCategory);\n\n  @override\n  Size get preferredSize => Size.fromHeight(kToolbarHeight);\n\n  @override\n  Widget build(BuildContext context) {\n    return AppBar(\n      backgroundColor: blue3,\n      actions: [\n        Padding(\n          padding: EdgeInsets.only(right: 5.w),\n          child: TextButton(\n            onPressed: () =>  Navigator.push(context,\n                MaterialPageRoute(builder: (context) => addCategory)),\n            child: Text(\n              getTranslated(context, 'Add')!,\n              style: TextStyle(fontSize: 18.5.sp,  color: white),\n            ),\n          ),\n          // child: Icon(Icons.edit),\n        ),\n      ],\n      title: Text(getTranslated(context, 'Edit Category')!,\n          style: TextStyle(fontSize: 21.sp)),\n    );\n  }\n}\n\n\n"
  },
  {
    "path": "lib/project/classes/category_item.dart",
    "content": "class CategoryItem {\n  int iconCodePoint;\n  String? iconFontPackage;\n  String? iconFontFamily;\n  String text;\n  String? description;\n  CategoryItem(this.iconCodePoint, this.iconFontPackage, this.iconFontFamily,\n      this.text, this.description);\n\n  factory CategoryItem.fromJson(Map<String, dynamic> json) {\n    return new CategoryItem(json['iconCodePoint'], json['iconFontPackage'],\n        json['iconFontFamily'], json['text'], json['description']);\n  }\n  Map<String, dynamic> toJson() {\n    return {\n      'iconCodePoint': this.iconCodePoint,\n      'iconFontPackage': this.iconFontPackage,\n      'iconFontFamily': this.iconFontFamily,\n      'text': this.text,\n      'description': this.description\n    };\n  }\n}\n"
  },
  {
    "path": "lib/project/classes/chart_pie.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:syncfusion_flutter_charts/charts.dart';\n\nimport 'input_model.dart';\n\nclass ChartPie extends StatelessWidget {\n  const ChartPie(this.transactionsSorted);\n  final List<InputModel> transactionsSorted;\n  @override\n  Widget build(BuildContext context) {\n    bool haveRecords;\n    String width;\n    String height;\n    double animationDuration;\n\n    if (this.transactionsSorted[0].category == '') {\n      haveRecords = false;\n      width = '67%';\n      height = '67%';\n      animationDuration = 0;\n    } else {\n      haveRecords = true;\n      width = '67%';\n      height = '67%';\n      animationDuration = 270;\n    }\n\n    return SfCircularChart(\n      tooltipBehavior: TooltipBehavior(enable: haveRecords),\n      annotations: <CircularChartAnnotation>[\n        CircularChartAnnotation(\n            width: width, height: height, widget: Annotations(haveRecords))\n      ],\n      series: <CircularSeries<InputModel, String>>[\n        DoughnutSeries<InputModel, String>(\n            startAngle: 90,\n            endAngle: 90,\n            animationDuration: animationDuration,\n            // enableSmartLabels: haveRecords,\n            sortingOrder: SortingOrder.descending,\n            sortFieldValueMapper: (InputModel data, _) => data.category,\n            enableTooltip: haveRecords,\n            dataSource: this.transactionsSorted,\n            pointColorMapper: (InputModel data, _) => data.color,\n            xValueMapper: (InputModel data, _) => getTranslated(context, data.category!) ?? data.category,\n            yValueMapper: (InputModel data, _) => data.amount,\n            dataLabelSettings: DataLabelSettings(\n              showZeroValue: true,\n              useSeriesColor: true,\n              labelPosition: ChartDataLabelPosition.outside,\n              isVisible: haveRecords,\n            ),\n            innerRadius: '50%',\n            radius: '67%'),\n      ],\n    );\n  }\n}\n\nclass Annotations extends StatelessWidget {\n  final bool haveRecords;\n  const Annotations(this.haveRecords);\n  @override\n  Widget build(BuildContext context) {\n    return PhysicalModel(\n        child: Container(\n          child: haveRecords == false\n              ? Center(\n                  child: Text(getTranslated(context, 'There is no data')!,\n                      textAlign: TextAlign.center,\n                      style: TextStyle(\n                          color: Color.fromRGBO(0, 0, 0, 0.5),\n                          fontSize: 23.5.sp,\n                          fontStyle: FontStyle.italic)),\n                )\n              : null,\n        ),\n        shape: BoxShape.circle,\n        elevation: 10,\n        shadowColor: Colors.black,\n        color: const Color.fromRGBO(230, 230, 230, 1));\n  }\n}\n"
  },
  {
    "path": "lib/project/classes/constants.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\n\nimport 'category_item.dart';\nimport 'input_model.dart';\n\nColor green = Color.fromRGBO(57, 157, 3, 1),\n    red = Color.fromRGBO(217, 89, 89, 1),\n    white = Color.fromRGBO(255, 255, 255, 1),\n    blue1 = Color.fromRGBO(210, 234, 251, 1),\n    blue2 = Color.fromRGBO(139, 205, 254, 1),\n    blue3 = Color.fromRGBO(89, 176, 222, 1),\n    grey = Colors.grey;\n\nList<Color> chartPieColors = [\n  //19\n  Color.fromRGBO(100, 202, 254, 1),\n  Color.fromRGBO(80, 157, 253, 1),\n  Color.fromRGBO(7, 156, 193, 1),\n  Color.fromRGBO(89, 129, 163, 1),\n  Color.fromRGBO(79, 94, 120, 1),\n  Color.fromRGBO(196, 199, 216, 1),\n  Color.fromRGBO(255, 206, 161, 1),\n  Color.fromRGBO(255, 183, 121, 1),\n  Color.fromRGBO(237, 156, 128, 1),\n  Color.fromRGBO(126, 180, 166, 1),\n  Color.fromRGBO(212, 216, 140, 1),\n  Color.fromRGBO(144, 192, 106, 1),\n  Color.fromRGBO(128, 186, 76, 1),\n  Color.fromRGBO(224, 217, 255, 1),\n  Color.fromRGBO(202, 164, 255, 1),\n  Color.fromRGBO(197, 156, 240, 1),\n  Color.fromRGBO(241, 197, 211, 1),\n  Color.fromRGBO(244, 151, 178, 1),\n  Color.fromRGBO(218, 145, 176, 1),\n  //20\n  Color.fromRGBO(141, 190, 255, 1),\n  Color.fromRGBO(160, 217, 254, 1),\n  Color.fromRGBO(117, 216, 228, 1),\n  Color.fromRGBO(120, 217, 192, 1),\n  Color.fromRGBO(172, 198, 152, 1),\n  Color.fromRGBO(162, 193, 115, 1),\n  Color.fromRGBO(112, 164, 112, 1),\n  Color.fromRGBO(65, 174, 223, 1),\n  Color.fromRGBO(71, 131, 192, 1),\n  Color.fromRGBO(32, 225, 188, 1),\n  Color.fromRGBO(53, 136, 143, 1),\n  Color.fromRGBO(139, 178, 193, 1),\n  Color.fromRGBO(125, 150, 191, 1),\n  Color.fromRGBO(119, 131, 148, 1),\n  Color.fromRGBO(243, 210, 122, 1),\n  Color.fromRGBO(254, 203, 94, 1),\n  Color.fromRGBO(244, 186, 106, 1),\n  Color.fromRGBO(217, 165, 105, 1),\n  Color.fromRGBO(214, 142, 96, 1),\n  Color.fromRGBO(190, 119, 112, 1),\n  Color.fromRGBO(194, 94, 78, 1),\n  Color.fromRGBO(192, 72, 42, 1),\n  Color.fromRGBO(176, 29, 51, 1),\n//18\n  Color.fromRGBO(198, 180, 251, 1),\n  Color.fromRGBO(155, 128, 217, 1),\n  Color.fromRGBO(112, 130, 212, 1),\n  Color.fromRGBO(78, 123, 216, 1),\n  Color.fromRGBO(139, 205, 254, 1),\n  Color.fromRGBO(89, 176, 222, 1),\n  Color.fromRGBO(81, 155, 194, 1),\n  Color.fromRGBO(4, 135, 192, 1),\n  Color.fromRGBO(50, 128, 171, 1),\n  Color.fromRGBO(44, 110, 119, 1),\n  Color.fromRGBO(41, 147, 134, 1),\n  Color.fromRGBO(95, 155, 71, 1),\n  Color.fromRGBO(179, 217, 37, 1),\n  Color.fromRGBO(237, 178, 135, 1),\n  Color.fromRGBO(198, 157, 100, 1),\n  Color.fromRGBO(194, 140, 112, 1),\n  Color.fromRGBO(214, 138, 88, 1),\n  Color.fromRGBO(225, 123, 66, 1),\n];\n\nString format(double number) =>\n    NumberFormat(\"#,###,###,###,###,###.##\", \"en_US\").format(number);\n\nIconData iconData(CategoryItem item) => IconData(item.iconCodePoint,\n    fontPackage: item.iconFontPackage, fontFamily: item.iconFontFamily);\n\n//should description be '' or null?\nCategoryItem categoryItem(IconData icon, String name) =>\n    CategoryItem(icon.codePoint, icon.fontPackage, icon.fontFamily, name, '');\n\nWidget? connectionUI(AsyncSnapshot<List<InputModel>> snapshot) {\n  if (snapshot.connectionState == ConnectionState.none) {\n    return Center(\n      child: CircularProgressIndicator(),\n    );\n  }\n  if (snapshot.hasError) {\n    print('${snapshot.error}');\n    return Center(\n      child: CircularProgressIndicator(),\n    );\n  }\n}\n\nList<CategoryItem> createItemList({\n  List<InputModel>? transactions,\n  required bool forAnalysisPage,\n  isIncomeType,\n  forSelectIconPage,\n}) {\n  List<CategoryItem> itemList = [], items = [], expenseItems = [];\n  sharedPrefs.getAllExpenseItemsLists().forEach((parentExpenseItem) =>\n      parentExpenseItem\n          .forEach((expenseItem) => expenseItems.add(expenseItem)));\n\n  if (forAnalysisPage) {\n    items = isIncomeType ? incomeItems : expenseItems;\n  } else {\n    items = [...incomeItems, ...expenseItems];\n  }\n  if (forSelectIconPage) {\n    return items;\n  } else {\n    for (InputModel transaction in transactions!) {\n      for (int i = 0; i < items.length; i++) {\n        if (transaction.category == items[i].text) {\n          itemList.add(items[i]);\n          break;\n        }\n        if (i == items.length - 1) {\n          CategoryItem itemElse = CategoryItem(\n              Icons.category_outlined.codePoint,\n              Icons.category_outlined.fontPackage,\n              Icons.category_outlined.fontFamily,\n              transaction.category!,\n              transaction.description);\n          itemList.add(itemElse);\n        }\n      }\n    }\n    return itemList;\n  }\n}\n\n//for analysis, report\n\nfinal DateTime now = DateTime.now(),\n    todayDT = DateTime(now.year, now.month, now.day),\n    startOfThisWeek = todayDT.subtract(Duration(days: todayDT.weekday - 1)),\n    startOfThisMonth = DateTime(todayDT.year, todayDT.month, 1),\n    startOfThisYear = DateTime(todayDT.year, 1, 1),\n    startOfThisQuarter = DateTime(todayDT.year, quarterStartMonth, 1);\n\nfinal int thisQuarter = (todayDT.month + 2) ~/ 3,\n    quarterStartMonth = 3 * thisQuarter - 2;\nfinal List<String> timeline = [\n  'Today',\n  'This week',\n  'This month',\n  'This quarter',\n  'This year',\n  'All'\n];\n\nInputModel inputModel(data) => InputModel(\n    id: data.id,\n    type: data.type,\n    amount: data.amount!,\n    category: data.category!,\n    description: data.description!,\n    date: data.date,\n    time: data.time);\n\nList<InputModel> filterData(\n    BuildContext context, List<InputModel> data, String selectedDate) {\n  // filter data based on user's selected day\n  return (data\n          .map((data) {\n            DateTime dateSelectedDT =\n                DateFormat('dd/MM/yyyy').parse(data.date!);\n\n            if (selectedDate == 'Today') {\n              if (dateSelectedDT.isAfter(todayDT.subtract(Duration(days: 1))) &&\n                  dateSelectedDT.isBefore(todayDT.add(Duration(days: 1)))) {\n                return inputModel(data);\n              }\n            } else if (selectedDate == 'This week') {\n              if (dateSelectedDT\n                      .isAfter(startOfThisWeek.subtract(Duration(days: 1))) &&\n                  dateSelectedDT\n                      .isBefore(startOfThisWeek.add(Duration(days: 7)))) {\n                return inputModel(data);\n              }\n            } else if (selectedDate == 'This month') {\n              if (dateSelectedDT\n                      .isAfter(startOfThisMonth.subtract(Duration(days: 1))) &&\n                  dateSelectedDT\n                      .isBefore(DateTime(todayDT.year, todayDT.month + 1, 1))) {\n                return inputModel(data);\n              }\n            } else if (selectedDate == 'This quarter') {\n              if (dateSelectedDT.isAfter(\n                      startOfThisQuarter.subtract(Duration(days: 1))) &&\n                  dateSelectedDT.isBefore(DateTime(startOfThisQuarter.year,\n                      startOfThisQuarter.month + 3, 1))) {\n                return inputModel(data);\n              }\n            } else if (selectedDate == 'This year') {\n              if (dateSelectedDT\n                      .isAfter(startOfThisYear.subtract(Duration(days: 1))) &&\n                  dateSelectedDT.isBefore(DateTime(todayDT.year + 1, 1, 1))) {\n                return inputModel(data);\n              }\n            } else {\n              return inputModel(data);\n            }\n          })\n          .where((element) => element != null)\n          .toList())\n      .cast<InputModel>();\n}\n\n// //3\n// Color.fromRGBO(97, 162, 195, 1),\n// Color.fromRGBO(107, 203, 253, 1),\n// //2\n// Color.fromRGBO(241, 187, 140, 1),\n// Color.fromRGBO(242, 193, 145, 1),\n// Color.fromRGBO(241, 197, 161, 1),\n// Color.fromRGBO(227, 191, 145, 1),\n// Color.fromRGBO(241, 207, 170, 1),\n// Color.fromRGBO(151, 209, 255, 1),\n// Color.fromRGBO(238, 161, 130, 1),\n// Color.fromRGBO(253, 152, 67, 1),\n// Color.fromRGBO(11, 153, 178, 1),\n// Color.fromRGBO(5, 168, 192, 1),\n// //\n// Color.fromRGBO( 35, 115, 217, 1),\n// Color.fromRGBO(6, 104, 189, 1),\n// Color.fromRGBO( 45, 99, 186, 1),\n// Color.fromRGBO( 61, 122, 135, 1),\n// Color.fromRGBO( 42, 65, 88, 1),\n// Color.fromRGBO(36, 85, 120, 1),\n// Color.fromRGBO(57, 63, 71, 1),\n// Color.fromRGBO(20, 44, 90, 1),\n// Color.fromRGBO(27, 114, 181, 1),\n// Color.fromRGBO(72, 102, 164, 1),\n// Color.fromRGBO( 24, 47, 66, 1),\n// Color.fromRGBO(56, 78, 116, 1),\n// Color.fromRGBO(101, 70, 163, 1),\n// Color.fromRGBO(78, 45, 127, 1),\n// Color.fromRGBO(116, 13, 64, 1),\n// Color.fromRGBO(83, 92, 112, 1),\n// Color.fromRGBO(79, 168, 169, 1),\n// Color.fromRGBO(60, 186, 177, 1),\n// Color.fromRGBO( 47, 178, 196, 1),\n// Color.fromRGBO( 68, 165, 193, 1),\n// Color.fromRGBO(50, 101, 114, 1),\n// Color.fromRGBO(2, 67, 107, 1),\n// Color.fromRGBO(57, 68, 99, 1),\n// Color.fromRGBO(65, 96, 142, 1),\n// Color.fromRGBO(78, 123, 165, 1),\n// Color.fromRGBO(95, 114, 138, 1),\n// Color.fromRGBO(218, 60, 81, 1),\n// Color.fromRGBO(52, 92, 67, 1),\n// Color.fromRGBO(69, 91, 50, 1),\n// Color.fromRGBO(71, 90, 44, 1),\n// Color.fromRGBO(252, 182, 35, 1),\n// Color.fromRGBO(255, 201, 0, 1),\n// Color.fromRGBO(254, 190, 48, 1),\n// Color.fromRGBO(241, 87, 33, 1),\n// Color.fromRGBO(255, 122, 0, 1),\n// Color.fromRGBO(215, 122, 2, 1),\n// Color.fromRGBO(176, 99, 52, 1),\n// Color.fromRGBO(190, 100, 42, 1),\n// Color.fromRGBO(166, 120, 73, 1),\n// Color.fromRGBO(165, 116, 81, 1),\n// Color.fromRGBO(161, 85, 244, 1),\n// Color.fromRGBO(162, 74, 125, 1),\n// Color.fromRGBO(156, 41, 134, 1),\n// Color.fromRGBO(153, 51, 178, 1),\n// Color.fromRGBO(233, 114, 228, 1),\n// Color.fromRGBO(158, 20, 24, 1),\n// Color.fromRGBO(203, 71, 242, 1),\n// Color.fromRGBO(218, 91, 160, 1),\n// Color.fromRGBO(181, 89, 171, 1),\n// Color.fromRGBO(208, 80, 135, 1),\n// Color.fromRGBO(2, 157, 193, 1),\n// Color.fromRGBO(34, 146, 212, 1),\n// Color.fromRGBO(2, 205, 209, 1),\n// Color.fromRGBO(85, 16, 9, 1),\n// Color.fromRGBO(196, 238, 236, 1),\n// Color.fromRGBO(192, 243, 247, 1),\n// Color.fromRGBO(164, 255, 242, 1),\n// Color.fromRGBO(248, 233, 193, 1),\n// Color.fromRGBO(244, 231, 203, 1),\n// Color.fromRGBO(212, 228, 244, 1),\n// Color.fromRGBO(188, 235, 239, 1),\n// Color.fromRGBO(246, 192, 142, 1),\n// Color.fromRGBO(233, 242, 235, 1),\n// Color.fromRGBO(227, 191, 145, 1),\n// Color.fromRGBO(189, 79, 0, 1),\n// Color.fromRGBO(214, 89, 43, 1),\n// Color.fromRGBO(240, 105, 85, 1),\n// Color.fromRGBO(231, 116, 46, 1),\n// Color.fromRGBO(156, 89, 98, 1),\n// Color.fromRGBO(208, 151, 99, 1),\n// Color.fromRGBO(189, 124, 66, 1),\n// Color.fromRGBO(181, 116, 67, 1),\n// Color.fromRGBO(242, 135, 36, 1),\n// Color.fromRGBO(243, 129, 61, 1),\n// Color.fromRGBO(240, 131, 36, 1),\n// Color.fromRGBO(245, 139, 46, 1),\n// Color.fromRGBO(254, 160, 51, 1),\n// Color.fromRGBO(239, 156, 71, 1),\n// Color.fromRGBO(245, 166, 76, 1),\n// Color.fromRGBO(245, 164, 52, 1),\n// Color.fromRGBO(243, 170, 48, 1),\n// Color.fromRGBO(164, 148, 126, 1),\n// Color.fromRGBO(190, 157, 116, 1),\n// Color.fromRGBO(191, 164, 131, 1),\n// Color.fromRGBO(192, 176, 160, 1),\n// Color.fromRGBO(193, 177, 164, 1),\n// Color.fromRGBO(214, 193, 165, 1),\n// Color.fromRGBO(255, 221, 206, 1),\n// Color.fromRGBO(242, 217, 203, 1),\n// Color.fromRGBO(245, 236, 224, 1),\n// Color.fromRGBO(255, 232, 204, 1),\n// Color.fromRGBO(255, 246, 216, 1),\n// Color.fromRGBO(157, 245, 255, 1),\n// Color.fromRGBO(235, 128, 209, 1),\n// Color.fromRGBO(194, 212, 241, 1),\n// Color.fromRGBO(196, 222, 235, 1),\n// Color.fromRGBO(160, 224, 239, 1),\n// Color.fromRGBO(157, 231, 244, 1),\n// Color.fromRGBO(127, 191, 239, 1),\n// Color.fromRGBO(214, 213, 155, 1),\n// Color.fromRGBO(229, 217, 147, 1),\n// Color.fromRGBO(208, 185, 240, 1),\n// Color.fromRGBO(204, 217, 224, 1),\n// Color.fromRGBO(168, 196, 187, 1),\n// Color.fromRGBO(198, 219, 207, 1),\n// Color.fromRGBO(203, 214, 189, 1),\n// Color.fromRGBO(213, 245, 206, 1),\n// Color.fromRGBO(186, 183, 168, 1),\n// Color.fromRGBO(218, 214, 211, 1),\n// Color.fromRGBO(218, 200, 182, 1),\n// Color.fromRGBO(182, 168, 165, 1),\n// Color.fromRGBO(214, 193, 165, 1),\n// Color.fromRGBO(183, 205, 164, 1),\n// Color.fromRGBO(159, 198, 127, 1),\n// Color.fromRGBO(143, 165, 124, 1),\n// Color.fromRGBO(126, 165, 147, 1),\n// Color.fromRGBO(124, 188, 49, 1),\n// Color.fromRGBO(148, 245, 183, 1),\n// Color.fromRGBO(110, 145, 80, 1),\n// Color.fromRGBO(115, 137, 78, 1),\n// Color.fromRGBO(122, 138, 3, 1),\n// Color.fromRGBO(209, 182, 73, 1),\n// Color.fromRGBO(90, 138, 11, 1),\n// Color.fromRGBO(54, 167, 92, 1),\n// Color.fromRGBO(137, 224, 208, 1),\n// Color.fromRGBO(150, 166, 191, 1),\n// Color.fromRGBO(153, 168, 177, 1),\n// Color.fromRGBO(160, 174, 179, 1),\n// Color.fromRGBO(25, 200, 255, 1),\n// Color.fromRGBO(0, 234, 245, 1),\n// Color.fromRGBO(141, 7, 0, 1),\n// Color.fromRGBO(104, 15, 28, 1),\n// Color.fromRGBO(237, 254, 243, 1),\n// Color.fromRGBO(22, 207, 152, 1),\n"
  },
  {
    "path": "lib/project/classes/custom_toast.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:fluttertoast/fluttertoast.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\n\nclass CustomToast extends StatelessWidget {\nfinal String message;\nCustomToast(this.message);\n  @override\n  Widget build(BuildContext context) {\n    return  Container(\n      padding:  EdgeInsets.symmetric(horizontal: 20.w, vertical: 12.h),\n      decoration: BoxDecoration(\n        boxShadow: [BoxShadow()],\n        borderRadius: BorderRadius.circular(25.r),\n        color: Color.fromRGBO(239, 247, 253, 1),\n      ),\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Icon(Icons.check, color: blue3,),\n          SizedBox(\n            width: 12.w,\n          ),\n      Text(getTranslated(context, message) ??\n              message,\n        style: TextStyle(fontWeight: FontWeight.w500),\n      ),\n        ],\n      ),\n    );\n  }\n}\n\nvoid customToast(BuildContext context, String message){\n  var fToast = FToast();\n  fToast.init(context);\n  fToast.showToast(\n    child: CustomToast(message),\n    gravity: ToastGravity.TOP,\n    toastDuration: Duration(seconds: 2),\n  );\n}\n"
  },
  {
    "path": "lib/project/classes/dropdown_box.dart",
    "content": "import 'dart:ui';\nimport 'package:provider/provider.dart';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\n\nimport 'constants.dart';\n\n\n\nclass DropDownBox extends StatelessWidget {\n  final bool forAnalysis;\n  final String selectedDate;\n  const DropDownBox(this.forAnalysis, this.selectedDate);\n  @override\n  Widget build(BuildContext context) {\n    return  DecoratedBox(\n      decoration: ShapeDecoration(\n        shadows: [BoxShadow()],\n        color: blue2,\n        shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.all(Radius.circular(15.r))),\n      ),\n      child: SizedBox(\n        height:  35.h,\n        child: Padding(\n          padding: EdgeInsets.symmetric(horizontal: 10.w),\n          child: DropdownButtonHideUnderline(\n            child: DropdownButton(\n              dropdownColor: blue2,\n              value: selectedDate,\n              elevation: 10,\n              icon: Icon(\n                Icons.arrow_drop_down_outlined,\n                size: 28.sp,\n              ),\n              onChanged: (value) {\n                if (this.forAnalysis) {\n                  context\n                      .read<ChangeSelectedDate>()\n                      .changeSelectedAnalysisDate(\n                      newSelectedDate: value.toString());\n                  sharedPrefs.selectedDate = value.toString();\n                } else {\n                  context\n                      .read<ChangeSelectedDate>()\n                      .changeSelectedReportDate(\n                      newSelectedDate: value.toString());\n                }\n              },\n              items: timeline\n                  .map((time) => DropdownMenuItem(\n                value: time,\n                child: Text(\n                  getTranslated(context, time)!,\n                  style: TextStyle(\n                      fontSize: 18.5.sp),\n                  textAlign: TextAlign.center,\n                ),\n              ))\n                  .toList(),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n\n"
  },
  {
    "path": "lib/project/classes/icons.dart",
    "content": "// //for select_icon\n// import 'package:eva_icons_flutter/eva_icons_flutter.dart';\n// import 'package:flutter/material.dart';\n// import 'package:flutter_boxicons/flutter_boxicons.dart';\n// import 'package:font_awesome_flutter/font_awesome_flutter.dart';\n// import 'package:icofont_flutter/icofont_flutter.dart';\n// import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n// import 'package:outline_material_icons/outline_material_icons.dart';\n//\n// import 'category_item.dart';\n// import 'constants.dart';\n//\n//\n// // [\n// // categoryItem(Icons.business_center_rounded, ''),\n// // categoryItem(IcoFontIcons.moneyBag, ''),\n// // categoryItem(IcoFontIcons.searchJob, ''),\n// // categoryItem(IcoFontIcons.gift, ''),\n// // categoryItem(MdiIcons.cashPlus, ''),\n// // categoryItem(MdiIcons.food, ''),\n// // categoryItem(MdiIcons.foodDrumstick, ''),\n// // categoryItem(Icons.local_bar, ''),\n// // categoryItem(Icons.add_shopping_cart, ''),\n// // categoryItem(OMIcons.commute, ''),\n// // categoryItem(Icons.local_gas_station, ''),\n// // categoryItem(Icons.local_parking, ''),\n// // categoryItem(IcoFontIcons.toolsBag, ''),\n// // categoryItem(Icons.local_taxi_outlined, ''),\n// // categoryItem(IcoFontIcons.businessman, ''),\n// // categoryItem(IcoFontIcons.education, ''),\n// // categoryItem(Icons.business, ''),\n// // categoryItem(IcoFontIcons.bagAlt, ''),\n// // categoryItem(IcoFontIcons.shoppingCart, ''),\n// // categoryItem(Boxicons.bxs_t_shirt, ''),\n// // categoryItem(Boxicons.bxs_binoculars, ''),\n// // categoryItem(Boxicons.bxs_devices, ''),\n// // categoryItem(Icons.add_photo_alternate_outlined, ''),\n// // categoryItem(Icons.movie_filter, ''),\n// // categoryItem(IcoFontIcons.gameController, ''),\n// // categoryItem(Icons.library_music, ''),\n// // categoryItem(Icons.airplanemode_active, ''),\n// // categoryItem(MdiIcons.homeHeart, ''),\n// // categoryItem(MdiIcons.homeCurrencyUsd, ''),\n// // categoryItem(MdiIcons.tableChair, ''),\n// // categoryItem(MdiIcons.autoFix, ''),\n// // categoryItem(MdiIcons.dogService, ''),\n// // categoryItem(Icons.emoji_transportation, ''),\n// // categoryItem(IcoFontIcons.lightBulb, ''),\n// // categoryItem(IcoFontIcons.globe, ''),\n// // categoryItem(IcoFontIcons.stockMobile, ''),\n// // categoryItem(IcoFontIcons.waterDrop, ''),\n// // categoryItem(FontAwesomeIcons.handHoldingMedical, ''),\n// // categoryItem(MdiIcons.soccer, ''),\n// // categoryItem(MdiIcons.fileDocumentMultipleOutline, ''),\n// // categoryItem(MdiIcons.doctor, ''),\n// // categoryItem(MdiIcons.medicalBag, ''),\n// // categoryItem(Boxicons.bxs_donate_heart, ''),\n// // categoryItem(IcoFontIcons.gift, ''),\n// // categoryItem(IcoFontIcons.love, ''),\n// // categoryItem(IcoFontIcons.worried, ''),\n// // categoryItem(IcoFontIcons.usersSocial, ''),\n// // categoryItem(Icons.child_care, ''),\n// // categoryItem(MdiIcons.cashCheck, ''),\n// // categoryItem(MdiIcons.babyBottle, ''),\n// // categoryItem(MdiIcons.humanBabyChangingTable, ''),\n// // categoryItem(MdiIcons.bookCheck, ''),\n// // categoryItem(EvaIcons.options, ''),\n// // ];\n"
  },
  {
    "path": "lib/project/classes/input_model.dart",
    "content": "import 'dart:ui';\n\nclass\nInputModel {\n  int? id;\n  String? type;\n  double? amount;\n  String? category;\n  String? description;\n  String? date;\n  String? time;\n  Color? color;\n\n  InputModel(\n      {this.id,\n      this.type,\n      this.amount,\n      this.category,\n      this.description,\n      this.date,\n      this.time,\n      this.color});\n\n  Map<String, dynamic> toMap() {\n    Map<String, dynamic> map = {\n      'id': id,\n      'type': type,\n      'amount': amount,\n      'category': category,\n      'description': description,\n      'date': date,\n      'time': time\n    };\n    // use for updating - not necessary?\n    if (id != null) {\n      map['id'] = id;\n    }\n    return map;\n  }\n\n  static InputModel fromMap(Map<String, dynamic> map) {\n    return InputModel(\n      id: map['id'],\n      type: map['type'],\n      amount: map['amount'],\n      category: map['category'],\n      description: map['description'],\n      date: map['date'],\n      time: map['time'],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/classes/keyboard.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:sliding_up_panel/sliding_up_panel.dart';\n\nclass CustomKeyboard extends StatelessWidget {\n  CustomKeyboard(\n      {required this.panelController,\n       this.mainFocus,\n       this.nextFocus,\n      required this.onTextInput,\n      required this.onBackspace,\n      required this.page});\n  final PanelController panelController;\n  final FocusNode? mainFocus;\n  final FocusNode? nextFocus;\n  final VoidCallback onBackspace;\n  final ValueSetter<String> onTextInput;\n  final Widget page;\n  List<TextKey> generatedKeys() {\n    List<TextKey> keys = [];\n    for (String i in [\n      '1',\n      '2',\n      '3',\n      '4',\n      '5',\n      '6',\n      '7',\n      '8',\n      '9',\n      '.',\n      '0',\n      ''\n    ]) {\n      keys.add(\n        TextKey(\n          text: i,\n          onTextInput: this.onTextInput,\n          onBackspace: this.onBackspace,\n        ),\n      );\n    }\n    return keys;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      color: white,\n      child: Padding(\n          padding: EdgeInsets.only(bottom: 25.h),\n          child: Column(children: [\n            SizedBox(\n              height: 52.h,\n              child: Padding(\n                padding: EdgeInsets.only(left: 5.w, right: 20.w),\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                  children: [\n                    GestureDetector(\n                      onTap: () {\n                        panelController.close();\n                        FocusScope.of(context).requestFocus(nextFocus);\n                      },\n                      child: SizedBox(\n                        height: 35.h,\n                        width:60.w,\n                        child: Icon(Icons.keyboard_arrow_down,\n                            size: 25.sp, color: Colors.blueGrey),\n                      ),\n                    ),\n                    // GestureDetector(\n                    //   onTap: () {\n                    //     panelController.close();\n                    //     Navigator.push(\n                    //         context,\n                    //         MaterialPageRoute(\n                    //           builder: (context) => this.page,\n                    //         ));\n                    //   },\n                    //   child: Text(\n                    //     'Choose Category',\n                    //     style: TextStyle(\n                    //         fontSize: 16.sp,\n                    //         fontWeight: FontWeight.bold,\n                    //         color: Colors.blueGrey),\n                    //   ),\n                    // ),\n                    GestureDetector(\n                      onTap: () {\n                        panelController.close();\n                        this.mainFocus!.unfocus();\n                      },\n                      child: Text(\n                        getTranslated(context, \"Done\")!,\n                        style: TextStyle(\n                            fontSize: 16.sp,\n                            fontWeight: FontWeight.bold,\n                            color: Colors.blue),\n                      ),\n                    )\n                  ],\n                ),\n              ),\n            ),\n            Wrap(\n              children: generatedKeys(),\n            ),\n          ])),\n    );\n  }\n}\n\nclass TextKey extends StatelessWidget {\n  const TextKey({\n    required this.text,\n    this.onBackspace,\n    this.onTextInput,\n  });\n  final VoidCallback? onBackspace;\n  final String text;\n  final ValueSetter<String>? onTextInput;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      color: white,\n      width: 1.sw / 3,\n      height: 55.h,\n      child: Material(\n        child: InkWell(\n          onTap: () {\n            this.text.isEmpty\n                ? this.onBackspace?.call()\n                : this.onTextInput?.call(this.text);\n          },\n          child: Center(\n              child: this.text.isEmpty\n                  ? Icon(\n                      Icons.backspace_outlined,\n                      color: red,\n                    )\n                  : Text(\n                      this.text,\n                      style:\n                          TextStyle(fontSize: 20, fontWeight: FontWeight.bold),\n                    )),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/classes/lockscreen.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_app_lock/flutter_app_lock.dart';\nimport 'package:flutter_screen_lock/configurations/input_button_config.dart';\nimport 'package:flutter_screen_lock/configurations/screen_lock_config.dart';\nimport 'package:flutter_screen_lock/configurations/secret_config.dart';\nimport 'package:flutter_screen_lock/configurations/secrets_config.dart';\nimport 'package:flutter_screen_lock/input_controller.dart';\nimport 'package:flutter_screen_lock/screen_lock.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:provider/provider.dart';\n\nimport '../provider.dart';\nimport 'custom_toast.dart';\n\nclass MainLockScreen extends StatelessWidget {\n  const MainLockScreen({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ScreenLock(\n      correctString: sharedPrefs.passcodeScreenLock,\n      canCancel: false,\n      didUnlocked: () => AppLock.of(context)!.didUnlock(),\n      deleteButton:\n          const Icon(Icons.close, color: Color.fromRGBO(89, 129, 163, 1)),\n      title: Padding(\n        padding: const EdgeInsets.only(bottom: 10),\n        child: Text(\n          getTranslated(\n                context,\n                'Please Enter Passcode',\n              ) ??\n              'Please Enter Passcode',\n          style: TextStyle(\n              color: Color.fromRGBO(71, 131, 192, 1),\n              fontWeight: FontWeight.w500,\n              fontSize: 20),\n        ),\n      ),\n      screenLockConfig: const ScreenLockConfig(\n        backgroundColor: Color.fromRGBO(210, 234, 251, 1),\n      ),\n      secretsConfig: SecretsConfig(\n          secretConfig: SecretConfig(\n        borderColor: Color.fromRGBO(79, 94, 120, 1),\n        enabledColor: Color.fromRGBO(89, 129, 163, 1),\n      )),\n      inputButtonConfig: InputButtonConfig(\n        buttonStyle: OutlinedButton.styleFrom(\n          backgroundColor: Color.fromRGBO(71, 131, 192, 1),\n          //  Color.fromRGBO(89, 129, 163, 1)\n        ),\n      ),\n    );\n  }\n}\n\nclass OtherLockScreen extends StatelessWidget {\n  final BuildContext providerContext;\n  const OtherLockScreen({required this.providerContext});\n\n  @override\n  Widget build(BuildContext context) {\n    final inputController = InputController();\n    print(getTranslated(\n      context,\n      'Please Enter Passcode',\n    ));\n    return ScreenLock(\n      correctString: '',\n      title: Padding(\n        padding: EdgeInsets.only(bottom: 10.h),\n        child: Text(\n          getTranslated(\n                context,\n                'Please Enter Passcode',\n              ) ??\n              'Please Enter Passcode',\n          style: TextStyle(\n              color: Color.fromRGBO(71, 131, 192, 1),\n              fontWeight: FontWeight.w500,\n              fontSize: 20.sp),\n        ),\n      ),\n      confirmTitle: Text(\n        getTranslated(\n              context,\n              'Please Re-enter Passcode',\n            ) ??\n            'Please Re-enter Passcode',\n        style: TextStyle(\n            color: Color.fromRGBO(71, 131, 192, 1),\n            fontWeight: FontWeight.w500,\n            fontSize: 20.sp),\n      ),\n      confirmation: true,\n      inputController: inputController,\n      deleteButton:\n          const Icon(Icons.close, color: Color.fromRGBO(71, 131, 192, 1)),\n      screenLockConfig: const ScreenLockConfig(\n        backgroundColor: Color.fromRGBO(210, 234, 251, 1),\n      ),\n      secretsConfig: SecretsConfig(\n          secretConfig: SecretConfig(\n        borderColor: Color.fromRGBO(79, 94, 120, 1),\n        enabledColor: Color.fromRGBO(89, 129, 163, 1),\n      )),\n      inputButtonConfig: InputButtonConfig(\n        buttonStyle: OutlinedButton.styleFrom(\n          backgroundColor: Color.fromRGBO(71, 131, 192, 1),\n          //  Color.fromRGBO(89, 129, 163, 1)\n        ),\n      ),\n      didConfirmed: (passCode) {\n        sharedPrefs.passcodeScreenLock = passCode;\n        Navigator.pop(context);\n      customToast(context,'Passcode has been enabled');\n      },\n      cancelButton: TextButton(\n          onPressed: () {\n            this.providerContext.read<OnSwitch>().onSwitch();\n            Navigator.pop(context);\n          },\n          child: Text(getTranslated(context, 'Cancel') ?? 'Cancel',\n              style: TextStyle(\n                  fontSize: 16.sp,\n                  fontWeight: FontWeight.w500,\n                  color: Color.fromRGBO(71, 131, 192, 1)))),\n      // footer:  TextButton(\n      //   onPressed: () => inputController.unsetConfirmed(),\n      //   child: Padding(\n      //     padding:  EdgeInsets.only(top: 20.h),\n      //     child: Text(\n      //         getTranslated(\n      //               context,\n      //               'Return',\n      //             ) ??\n      //             'Return',\n      //         style: TextStyle(\n      //             color: Color.fromRGBO(71, 131, 192, 1),\n      //             fontWeight: FontWeight.w500,\n      //             fontSize: 20.sp)),\n      //   ),\n      // ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/project/classes/saveOrSaveAndDeleteButtons.dart",
    "content": "import 'dart:io' show Platform;\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/alert_dialog.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\nimport 'package:money_assistant_2608/project/app_pages/input.dart';\nimport 'package:money_assistant_2608/project/provider.dart';\nimport 'package:provider/provider.dart';\n\nimport 'category_item.dart';\nimport 'constants.dart';\nimport 'custom_toast.dart';\n\nclass SaveButton extends StatefulWidget {\n  final bool saveInput;\n  final Function? saveCategoryFunc;\n  final bool? saveFunction;\n  const SaveButton(this.saveInput, this.saveCategoryFunc, this.saveFunction);\n\n  @override\n  _SaveButtonState createState() => _SaveButtonState();\n}\n\nclass _SaveButtonState extends State<SaveButton> {\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: ElevatedButton.icon(\n        onPressed: () {\n          if (widget.saveInput) {\n            saveInputFunc(context, widget.saveFunction!);\n          } else {\n            widget.saveCategoryFunc!();\n          }\n        },\n        style: ElevatedButton.styleFrom(\n          padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.w),\n          primary: Color.fromRGBO(236, 158, 66, 1),\n          onPrimary: white,\n          onSurface: grey,\n          elevation: 10,\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(18.0.r),\n          ),\n        ),\n        label: Text(\n          getTranslated(context, 'Save')!,\n          style: TextStyle(fontSize: 25.sp),\n        ),\n        icon: Icon(\n          Icons.save,\n          size: 25.sp,\n        ),\n      ),\n    );\n  }\n}\n\nclass SaveAndDeleteButton extends StatelessWidget {\n  final bool saveAndDeleteInput;\n  final Function? saveCategory;\n  final String? parentExpenseItem, categoryName;\n  final BuildContext? contextEx, contextExEdit, contextIn, contextInEdit;\n  final GlobalKey<FormState>? formKey;\n  const SaveAndDeleteButton({\n    required this.saveAndDeleteInput,\n    this.saveCategory,\n    this.categoryName,\n    this.parentExpenseItem,\n    this.contextEx,\n    this.contextExEdit,\n    this.contextIn,\n    this.contextInEdit,\n    this.formKey,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Row(\n      mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n      children: [\n        ElevatedButton.icon(\n            onPressed: () {\n              if (this.saveAndDeleteInput) {\n                deleteInputFunction(\n                  context,\n                );\n              } else {\n                deleteCategoryFunction(\n                  context: context,\n                  categoryName: this.categoryName!,\n                  parentExpenseItem: this.parentExpenseItem,\n                  contextEx: this.contextEx,\n                  contextExEdit: this.contextExEdit,\n                  contextIn: this.contextIn,\n                  contextInEdit: this.contextInEdit,\n                );\n              }\n            },\n            style: ElevatedButton.styleFrom(\n                padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.w),\n                primary: white,\n                onPrimary: red,\n                onSurface: grey,\n                side: BorderSide(\n                  color: red,\n                  width: 2.h,\n                ),\n                elevation: 10,\n                shape: RoundedRectangleBorder(\n                  borderRadius: BorderRadius.circular(18.0.r),\n                )),\n            icon: Icon(\n              Icons.delete,\n              size: 25.sp,\n            ),\n            label: Text(\n              getTranslated(context, 'Delete')!,\n              style: TextStyle(fontSize: 25.sp),\n            )),\n        SaveButton(saveAndDeleteInput, this.saveCategory, false),\n      ],\n    );\n  }\n}\n\nFuture<void> deleteCategoryFunction(\n    {required BuildContext context,\n    required String categoryName,\n    String? parentExpenseItem,\n    BuildContext? contextEx,\n    contextExEdit,\n    contextIn,\n    contextInEdit}) async {\n  void onDeletion() {\n    if (contextInEdit != null) {\n      List<CategoryItem> incomeItems = sharedPrefs.getItems('income items');\n      incomeItems.removeWhere((item) => item.text == categoryName);\n      sharedPrefs.saveItems('income items', incomeItems);\n      Provider.of<ChangeIncomeItemEdit>(contextInEdit, listen: false)\n          .getIncomeItems();\n      if (contextIn != null) {\n        Provider.of<ChangeIncomeItem>(contextIn, listen: false)\n            .getIncomeItems();\n      }\n    } else {\n      if (parentExpenseItem == null) {\n        sharedPrefs.removeItem(categoryName);\n        var parentExpenseItemNames = sharedPrefs.parentExpenseItemNames;\n        parentExpenseItemNames.removeWhere(\n            (parentExpenseItemName) => categoryName == parentExpenseItemName);\n        sharedPrefs.parentExpenseItemNames = parentExpenseItemNames;\n      } else {\n        List<CategoryItem> expenseItems =\n            sharedPrefs.getItems(parentExpenseItem);\n        expenseItems.removeWhere((item) => item.text == categoryName);\n        sharedPrefs.saveItems(parentExpenseItem, expenseItems);\n      }\n      Provider.of<ChangeExpenseItem>(contextEx!, listen: false)\n          .getAllExpenseItems();\n      Provider.of<ChangeExpenseItemEdit>(contextExEdit!, listen: false)\n          .getAllExpenseItems();\n    }\n    Navigator.pop(context);\n    customToast(context,'Category has been deleted');\n  }\n\n  Platform.isIOS\n      ? await iosDialog(\n          context,\n              'Are you sure you want to delete this category?', 'Delete',\n          onDeletion)\n      : await androidDialog(context,  'Are you sure you want to delete this category?', 'Delete',onDeletion);\n}\n"
  },
  {
    "path": "lib/project/database_management/database.dart",
    "content": "// import 'package:cloud_firestore/cloud_firestore.dart';\n// import 'package:firebase_auth/firebase_auth.dart';\n//\n// class DatabaseService {\n//   static final usersCollection = FirebaseFirestore.instance.collection(\"users\");\n//   static final firebaseUser = FirebaseAuth.instance.currentUser;\n//\n//   static final Future<Map<String, dynamic>> userData = FirebaseFirestore\n//       .instance\n//       .collection(\"users\")\n//       .doc(FirebaseAuth.instance.currentUser.uid)\n//       .get()\n//       .then((data) => data.data());\n//\n//   Future<void> setUserData(\n//     String type,\n//     double amount,\n//     String category,\n//     String description,\n//     String actualDateTime,\n//     String dateSelected,\n//     String timeSelected, {\n//     bool premiumAccount,\n//     String name = 'null',\n//   }) async {\n//     print('save');\n//     return await usersCollection.doc(firebaseUser.uid).set({\n//       \"name\": name,\n//       \"premiumAccount\": premiumAccount,\n//       \"transactionInfo\": FieldValue.arrayUnion([\n//         { \"type\": type,\n//           \"amount\": amount,\n//           \"category\": category,\n//           \"description\": description,\n//           \"dateSelected\": dateSelected,\n//           \"timeSelected\": timeSelected,\n//           \"actualDateTime\": actualDateTime\n//         }\n//       ])\n//     }, SetOptions(merge: true));\n//   }\n//\n//   Future<void> updateUserData(String name, String type, int amount,\n//       String category, String description, String date, String time) async {\n//     return await usersCollection.doc(firebaseUser.uid).update({\n//       \"type\": type,\n//       \"name\": name,\n//       \"amount\": amount,\n//       \"category\": category,\n//       \"description\": description,\n//       \"date\": date,\n//       \"time\": time\n//     });\n//   }\n//\n//   Future<void> deleteUserData() async {\n//     return await usersCollection.doc(firebaseUser.uid).delete();\n//   }\n// }\n"
  },
  {
    "path": "lib/project/database_management/shared_preferences_services.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_boxicons/flutter_boxicons.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n// ignore: import_of_legacy_library_into_null_safe\nimport 'package:icofont_flutter/icofont_flutter.dart';\nimport 'package:intl/intl.dart';\n// ignore: import_of_legacy_library_into_null_safe\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/localization/methods.dart';\n// ignore: import_of_legacy_library_into_null_safe\nimport 'package:outline_material_icons/outline_material_icons.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\n\nfinal sharedPrefs = SharedPrefs();\n// constants/strings.dart\n// const String appCurrency = 'app_currency';\nlate String currency;\nvar incomeItems = sharedPrefs.getItems('income items');\n\nclass SharedPrefs {\n  static SharedPreferences? _sharedPrefs;\n\n  sharePrefsInit() async {\n    if (_sharedPrefs == null) {\n      _sharedPrefs = await SharedPreferences.getInstance();\n    }\n  }\n\n  String get selectedDate => _sharedPrefs!.getString('selectedDate')!;\n\n  set selectedDate(String value) {\n    _sharedPrefs!.setString('selectedDate', value);\n  }\n\n  String get appCurrency =>\n      _sharedPrefs!.getString('appCurrency') ?? Platform.localeName;\n\n  set appCurrency(String appCurrency) =>\n      _sharedPrefs!.setString('appCurrency', appCurrency);\n\n  String get dateFormat =>\n      _sharedPrefs!.getString('dateFormat') ?? 'dd/MM/yyyy';\n\n  set dateFormat(String dateFormat) =>\n      _sharedPrefs!.setString('dateFormat', dateFormat);\n\n\n  bool get isPasscodeOn => _sharedPrefs!.getBool('isPasscodeOn') ?? false;\n\n  set isPasscodeOn(bool value) => _sharedPrefs!.setBool('isPasscodeOn', value);\n\n  String get passcodeScreenLock =>\n      _sharedPrefs!.getString('passcodeScreenLock')!;\n\n  set passcodeScreenLock(String value) =>\n      _sharedPrefs!.setString('passcodeScreenLock', value);\n\n  List<String> get parentExpenseItemNames =>\n      _sharedPrefs!.getStringList('parent expense item names')!;\n\n  // not yet use this set method\n  set parentExpenseItemNames(List<String> parentExpenseItemNames) =>\n      _sharedPrefs!\n          .setStringList('parent expense item names', parentExpenseItemNames);\n\n  Locale setLocale(String languageCode) {\n    _sharedPrefs!.setString('languageCode', languageCode);\n    return locale(languageCode);\n  }\n\n  Locale getLocale() {\n    String languageCode = _sharedPrefs!.getString('languageCode') ?? \"en\";\n    return locale(languageCode);\n  }\n\n  void getCurrency() {\n    if (_sharedPrefs!.containsKey('appCurrency')) {\n      var format = NumberFormat.simpleCurrency(locale: sharedPrefs.appCurrency);\n      currency = format.currencySymbol;\n    } else {\n      var format = NumberFormat.simpleCurrency(locale: Platform.localeName);\n      currency = format.currencySymbol;\n    }\n  }\n\n  //jsonEncode turns a Map<String, dynamic> into a json string,\n  //jsonDecode turns a json string into a Map<String, dynamic>\n  List<CategoryItem> getItems(String parentItemName) {\n    List<String> itemsEncoded = _sharedPrefs!.getStringList(parentItemName)!;\n    List<CategoryItem> items = itemsEncoded\n        .map((item) => CategoryItem.fromJson(jsonDecode(item)))\n        .toList();\n    return items;\n  }\n\n  void saveItems(String parentItemName, List<CategoryItem> items) {\n    List<String> itemsEncoded =\n        items.map((item) => jsonEncode(item.toJson())).toList();\n\n    _sharedPrefs!.setStringList(parentItemName, itemsEncoded);\n  }\n\n  List<List<CategoryItem>> getAllExpenseItemsLists() {\n    List<List<CategoryItem>> expenseItemsLists = [];\n    for (int i = 0; i < this.parentExpenseItemNames.length; i++) {\n      var parentExpenseItem =\n          sharedPrefs.getItems(this.parentExpenseItemNames[i]);\n      expenseItemsLists.add(parentExpenseItem);\n    }\n    return expenseItemsLists;\n  }\n\n  void removeItem(String itemName) {\n    _sharedPrefs!.remove(itemName);\n  }\n\n  void setItems({required bool setCategoriesToDefault}) {\n    // _sharedPrefs!.clear();\n\n    if (!_sharedPrefs!.containsKey('parent expense item names') ||\n        setCategoriesToDefault) {\n      _sharedPrefs!.setStringList('parent expense item names', [\n        'Food & Beverages',\n        'Transport',\n        'Personal Development',\n        'Shopping',\n        'Entertainment',\n        'Home',\n        'Utility Bills',\n        'Health',\n        'Gifts & Donations',\n        'Kids',\n        'OtherExpense'\n      ]);\n\n      saveItems('income items', [\n        categoryItem(MdiIcons.accountCash, 'Salary'),\n        categoryItem(Icons.business_center_rounded, 'InvestmentIncome'),\n        categoryItem(IcoFontIcons.moneyBag, 'Bonus'),\n        categoryItem(IcoFontIcons.searchJob, 'Side job'),\n        categoryItem(IcoFontIcons.gift, 'GiftsIncome'),\n        categoryItem(MdiIcons.cashPlus, 'OtherIncome'),\n      ]);\n\n      saveItems('Food & Beverages', [\n        categoryItem(MdiIcons.food, 'Food & Beverages'),\n        categoryItem(MdiIcons.foodDrumstick, 'Food'),\n        categoryItem(Icons.local_bar, 'Beverages'),\n        categoryItem(Icons.add_shopping_cart, 'Daily Necessities'),\n      ]);\n\n      saveItems('Transport', [\n        categoryItem(OMIcons.commute, 'Transport'),\n        categoryItem(Icons.local_gas_station, 'Fuel'),\n        categoryItem(Icons.local_parking, 'Parking'),\n        categoryItem(IcoFontIcons.toolsBag, 'Services & Maintenance'),\n        categoryItem(Icons.local_taxi_outlined, 'Taxi'),\n      ]);\n\n      saveItems('Personal Development', [\n        categoryItem(IcoFontIcons.businessman, 'Personal Development'),\n        categoryItem(Icons.business, 'Business'),\n        categoryItem(IcoFontIcons.education, 'Education'),\n        categoryItem(IcoFontIcons.bagAlt, 'InvestmentExpense'),\n      ]);\n\n      saveItems('Shopping', [\n        categoryItem(IcoFontIcons.shoppingCart, 'Shopping'),\n        categoryItem(Boxicons.bxs_t_shirt, 'Clothes'),\n        categoryItem(Boxicons.bxs_binoculars, 'Accessories'),\n        categoryItem(Boxicons.bxs_devices, 'Electronic Devices'),\n      ]);\n\n      saveItems('Entertainment', [\n        categoryItem(Icons.add_photo_alternate_outlined, 'Entertainment'),\n        categoryItem(Icons.movie_filter, 'Movies'),\n        categoryItem(IcoFontIcons.gameController, 'Games'),\n        categoryItem(Icons.library_music, 'Music'),\n        categoryItem(Icons.airplanemode_active, 'Travel'),\n      ]);\n\n      saveItems('Home', [\n        categoryItem(MdiIcons.homeHeart, 'Home'),\n        categoryItem(MdiIcons.dogService, 'Pets'),\n        categoryItem(MdiIcons.tableChair, 'Furnishings'),\n        categoryItem(MdiIcons.autoFix, 'Home Services'),\n        categoryItem(MdiIcons.homeCurrencyUsd, 'Mortgage & Rent'),\n      ]);\n\n      saveItems('Utility Bills', [\n        categoryItem(FontAwesomeIcons.fileInvoiceDollar, 'Utility Bills'),\n        categoryItem(IcoFontIcons.lightBulb, 'Electricity'),\n        categoryItem(IcoFontIcons.globe, 'Internet'),\n        categoryItem(IcoFontIcons.stockMobile, 'Mobile Phone'),\n        categoryItem(IcoFontIcons.waterDrop, 'Water'),\n      ]);\n\n      saveItems('Health', [\n        categoryItem(FontAwesomeIcons.handHoldingMedical, 'Health'),\n        categoryItem(MdiIcons.soccer, 'Sports'),\n        categoryItem(MdiIcons.fileDocumentMultipleOutline, 'Health Insurance'),\n        categoryItem(MdiIcons.doctor, 'Doctor'),\n        categoryItem(MdiIcons.medicalBag, 'Medicine'),\n      ]);\n\n      saveItems('Gifts & Donations', [\n        categoryItem(Boxicons.bxs_donate_heart, 'Gifts & Donations'),\n        categoryItem(IcoFontIcons.gift, 'GiftsExpense'),\n        categoryItem(IcoFontIcons.love, 'Wedding'),\n        categoryItem(IcoFontIcons.worried, 'Funeral'),\n        categoryItem(IcoFontIcons.usersSocial, 'Charity'),\n      ]);\n\n      saveItems('Kids', [\n        categoryItem(Icons.child_care, 'Kids'),\n        categoryItem(MdiIcons.cashCheck, 'Pocket Money'),\n        categoryItem(MdiIcons.babyBottle, 'Baby Products'),\n        categoryItem(MdiIcons.humanBabyChangingTable, 'Babysitter & Daycare'),\n        categoryItem(MdiIcons.bookCheck, 'Tuition'),\n      ]);\n      saveItems('OtherExpense', [\n        categoryItem(MdiIcons.cashPlus, 'OtherExpense'),\n      ]);\n      if (!setCategoriesToDefault) {\n        _sharedPrefs!.setString('selectedDate', 'Today');\n        _sharedPrefs!.setBool('isPasscodeOn', false);\n        _sharedPrefs!.setString('passcodeScreenLock', '');\n        _sharedPrefs!.setString('dateFormat', 'dd/MM/yyyy');\n      }\n    }\n    if (_sharedPrefs!.containsKey('parent expense item names') == false) {\n      print('didnt save successfully');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/project/database_management/sqflite_services.dart",
    "content": "import 'dart:async';\n\nimport 'package:path/path.dart' as p;\nimport 'package:sqflite/sqflite.dart';\n\nimport '../classes/input_model.dart';\n\nabstract class DB {\n  static Database? _db;\n  static int get _version => 1;\n\n  static Future<void> init() async {\n    if (_db != null) {\n      return;\n    }\n    try {\n      var databasesPath = await getDatabasesPath();\n      String _path = p.join(databasesPath, 'money_crud.db');\n      _db = await openDatabase(_path, version: _version, onCreate: onCreate);\n    } catch (ex) {\n      print(ex);\n    }\n  }\n\n  static onCreate(Database db, int version) {\n    return db.execute(\n        'CREATE TABLE input (id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT, amount REAL, category TEXT, description TEXT, date TEXT, time TEXT)');\n  }\n\n  //why in Git uses Future<int>?\n  // static Future<List<Map<String, dynamic>>> query() async =>\n  //     await _db.query('input');\n\n  static Future<List<InputModel>> inputModelList() async {\n    List<Map<String, dynamic>> inputList = await _db!.query('input');\n    return inputList.map((item) => InputModel.fromMap(item)).toList();\n  }\n\n  static Future<int> insert(InputModel model) async => await _db!.insert(\n        'input',\n        model.toMap(),\n        conflictAlgorithm: ConflictAlgorithm.replace,\n      );\n\n  static Future<int> update(InputModel model) async => await _db!.update(\n        'input',\n        model.toMap(),\n        where: 'id = ?',\n        whereArgs: [model.id],\n      );\n\n  static Future<int> delete(int id) async =>\n      await _db!.delete('input', where: 'id = ?', whereArgs: [id]);\n\n  static Future<int> deleteAll () async =>\n      await _db!.delete('input');\n}\n"
  },
  {
    "path": "lib/project/draft1.dart",
    "content": "// import 'dart:collection';\n//\n// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n// import 'package:flutter_screenutil/flutter_screenutil.dart';\n// import 'package:google_fonts/google_fonts.dart';\n// import 'package:intl/intl.dart';\n// import 'package:money_assistant_2608/project/classes/app_bar.dart';\n// import 'package:money_assistant_2608/project/classes/category_item.dart';\n// import 'package:money_assistant_2608/project/classes/constants.dart';\n// import 'package:money_assistant_2608/project/classes/input_model.dart';\n// import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\n// import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\n// import 'package:money_assistant_2608/project/localization/methods.dart';\n// import 'package:table_calendar/table_calendar.dart';\n//\n// import '../classes/input_model.dart';\n// import 'edit.dart';\n//\n// class Calendar extends StatelessWidget {\n//   @override\n//   Widget build(BuildContext context) {\n//     return Scaffold(\n//         backgroundColor: blue1,\n//         appBar: BasicAppBar(getTranslated(context, 'Calendar')!),\n//         body: CalendarBody());\n//   }\n// }\n//\n// class CalendarBody extends StatefulWidget {\n//   @override\n//   _CalendarBodyState createState() => _CalendarBodyState();\n// }\n//\n// class _CalendarBodyState extends State<CalendarBody> {\n//   CalendarFormat _calendarFormat = CalendarFormat.month;\n//   RangeSelectionMode _rangeSelectionMode = RangeSelectionMode\n//       .toggledOff; // Can be toggled on/off by longpressing a date\n//   DateTime _focusedDay = DateTime.now(),\n//       today = DateTime(\n//           DateTime.now().year, DateTime.now().month, DateTime.now().day);\n//   DateTime? _selectedDay, _rangeStart, _rangeEnd;\n//   late Map<DateTime, List<InputModel>> transactions = {};\n//   late ValueNotifier<List<InputModel>> _selectedEvents;\n//\n//   @override\n//   void initState() {\n//     super.initState();\n//     _selectedDay = _focusedDay;\n//   }\n//\n//   @override\n//   void dispose() {\n//     // _calendarController.dispose();\n//     super.dispose();\n//   }\n//\n//   int getHashCode(DateTime key) {\n//     return key.day * 1000000 + key.month * 10000 + key.year;\n//   }\n//\n//   /// Returns a list of [DateTime] objects from [first] to [last], inclusive.\n//   List<DateTime> daysInRange(DateTime first, DateTime last) {\n//     final dayCount = last.difference(first).inDays + 1;\n//     return List.generate(\n//       dayCount,\n//           (index) => DateTime.utc(first.year, first.month, first.day + index),\n//     );\n//   }\n//\n//   Widget buildEvents(List<InputModel>? transactions) {\n//     Color colorCategory;\n//     if (transactions == null) {\n//       return Container();\n//     }\n//     List<CategoryItem> itemList = createItemList(\n//       transactions: transactions,\n//       forAnalysisPage: false,\n//       forSelectIconPage: false,\n//       isIncomeType: false,\n//     );\n//     return ListView.builder(\n//         shrinkWrap: true,\n//         itemCount: itemList.length,\n//         itemBuilder: (context, int) {\n//           colorCategory =\n//           transactions[int].type == 'Income' ? Colors.lightGreen : red;\n//           return GestureDetector(\n//               onTap: () {\n//                 Navigator.push(\n//                     context,\n//                     MaterialPageRoute(\n//                         builder: (context) => Edit(\n//                           inputModel: transactions[int],\n//                           categoryIcon: iconData(itemList[int]),\n//                         ))).then((value) => setState(() {}));\n//               },\n//               child: Column(\n//                 children: [\n//                   Container(\n//                     color: white,\n//                     child: Padding(\n//                       padding: EdgeInsets.symmetric(\n//                           horizontal: 15.w, vertical: 15.h),\n//                       child: Row(\n//                         mainAxisAlignment: MainAxisAlignment.spaceBetween,\n//                         children: [\n//                           Icon(\n//                             iconData(itemList[int]),\n//                             color: colorCategory,\n//                           ),\n//                           SizedBox(\n//                             width: 150.w,\n//                             child: Padding(\n//                               padding: EdgeInsets.only(left: 15.w, right: 10.w),\n//                               child: Text(\n//                                   getTranslated(context, itemList[int].text) ??\n//                                       itemList[int].text,\n//                                   style: TextStyle(\n//                                     fontSize: 18.sp,\n//                                   ),\n//                                   overflow: TextOverflow.ellipsis),\n//                             ),\n//                           ),\n//                           Expanded(\n//                             child: Text('(${transactions[int].description})',\n//                                 style: TextStyle(\n//                                     fontSize: 14.sp,\n//                                     fontStyle: FontStyle.italic),\n//                                 overflow: TextOverflow.fade),\n//                           ),\n//                           //this widget will never overflow\n//                           Flexible(\n//                             flex: 0,\n//                             child: Padding(\n//                               padding: EdgeInsets.only(right: 10.w, left: 7.w),\n//                               child: Text(\n//                                   format(transactions[int].amount!) +\n//                                       ' ' +\n//                                       currency,\n//                                   style: GoogleFonts.aBeeZee(\n//                                     fontSize: format(transactions[int].amount!)\n//                                         .length >\n//                                         15\n//                                         ? 16.sp\n//                                         : 17.sp,\n//                                   ),\n//                                   overflow: TextOverflow.ellipsis),\n//                             ),\n//                           ),\n//                           Icon(\n//                             Icons.arrow_forward_ios,\n//                             size: 15.5.sp,\n//                           ),\n//                         ],\n//                       ),\n//                     ),\n//                   ),\n//                   Divider(\n//                     height: 0,\n//                     thickness: 0.25.h,\n//                     indent: 20.w,\n//                     color: grey,\n//                     // color: Color.fromRGBO(213, 215, 217, 1),\n//                   ),\n//                 ],\n//               ));\n//         });\n//   }\n//\n//   @override\n//   Widget build(BuildContext context) {\n//     return FutureBuilder<List<InputModel>>(\n//         initialData: [],\n//         future: DB.inputModelList(),\n//         builder: (context, snapshot) {\n//           connectionUI(snapshot);\n//           Map<String, List<InputModel>> map = {};\n//           if (snapshot.data != null) {\n//             for (int i = 0; i < snapshot.data!.length; i++) {\n//               String description = snapshot.data![i].description!;\n//               InputModel map1 = InputModel(\n//                   id: snapshot.data![i].id,\n//                   type: snapshot.data![i].type,\n//                   amount: snapshot.data![i].amount,\n//                   category: snapshot.data![i].category,\n//                   description: description,\n//                   date: snapshot.data![i].date,\n//                   time: snapshot.data![i].time);\n//\n//               void updateMapValue<K, V>(Map<K, List<V>> map, K key, V value) =>\n//                   map.update(key, (list) => list..add(value),\n//                       ifAbsent: () => [value]);\n//\n//               updateMapValue(\n//                 map,\n//                 '${snapshot.data![i].date}',\n//                 map1,\n//               );\n//             }\n//             transactions = map.map((key, value) =>\n//                 MapEntry(DateFormat('dd/MM/yyyy').parse(key), value));\n//           }\n//\n//           late LinkedHashMap linkedHashedMapTransactions =\n//           LinkedHashMap<DateTime, List<InputModel>>(\n//             equals: isSameDay,\n//             hashCode: getHashCode,\n//           )..addAll(transactions);\n//\n//           List<InputModel> transactionsForDay(DateTime? day) =>\n//               linkedHashedMapTransactions[day] ?? [];\n//\n//           if (_selectedDay != null) {\n//             _selectedEvents = ValueNotifier(transactionsForDay(_selectedDay));\n//           }\n//\n//           List<InputModel> _getEventsForRange(DateTime start, DateTime end) {\n//             final days = daysInRange(start, end);\n//\n//             return [\n//               for (final d in days) ...transactionsForDay(d),\n//             ];\n//           }\n//\n//           void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {\n//             if (!isSameDay(_selectedDay, selectedDay)) {\n//               setState(() {\n//                 _selectedDay = selectedDay;\n//                 _focusedDay = focusedDay;\n//                 _rangeStart = null; // Important to clean those\n//                 _rangeEnd = null;\n//                 _rangeSelectionMode = RangeSelectionMode.toggledOff;\n//               });\n//               _selectedEvents.value = transactionsForDay(selectedDay);\n//             }\n//           }\n//\n//           void _onRangeSelected(\n//               DateTime? start, DateTime? end, DateTime focusedDay) {\n//             setState(() {\n//               _selectedDay = null;\n//               _focusedDay = focusedDay;\n//               _rangeStart = start;\n//               _rangeEnd = end;\n//               _rangeSelectionMode = RangeSelectionMode.toggledOn;\n//               if (start != null && end != null) {\n//                 _selectedEvents = ValueNotifier(_getEventsForRange(start, end));\n//               } else if (start != null) {\n//                 _selectedEvents = ValueNotifier(transactionsForDay(start));\n//               } else if (end != null) {\n//                 _selectedEvents = ValueNotifier(transactionsForDay(end));\n//               }\n//             });\n//           }\n//\n//           return Column(children: [\n//             TableCalendar<InputModel>(\n//               availableCalendarFormats: {\n//                 CalendarFormat.month: getTranslated(context, 'Month')!,\n//                 CalendarFormat.twoWeeks: getTranslated(context, '2 weeks')!,\n//                 CalendarFormat.week: getTranslated(context, 'Week')!\n//               },\n//               locale: Localizations.localeOf(context).languageCode,\n//               // sixWeekMonthsEnforced: true,\n//               // shouldFillViewport: true,\n//               rowHeight: 52.h,\n//               daysOfWeekHeight: 22.h,\n//               firstDay: DateTime.utc(2000, 01, 01),\n//               lastDay: DateTime.utc(2050, 01, 01),\n//               focusedDay: _focusedDay,\n//               calendarFormat: _calendarFormat,\n//               selectedDayPredicate: (day) => isSameDay(_selectedDay, day),\n//               rangeStartDay: _rangeStart,\n//               rangeEndDay: _rangeEnd,\n//               rangeSelectionMode: _rangeSelectionMode,\n//               eventLoader: transactionsForDay,\n//               startingDayOfWeek: StartingDayOfWeek.monday,\n//               calendarStyle: CalendarStyle(\n//                 // weekendTextStyle:\n//                 // TextStyle().copyWith(color: Colors.blue[800]),\n//               ),\n//\n//               headerStyle: HeaderStyle(\n//                 formatButtonTextStyle: TextStyle(fontSize: 18.sp),\n//                 formatButtonDecoration: BoxDecoration(\n//                     boxShadow: [BoxShadow()],\n//                     color: blue2,\n//                     borderRadius: BorderRadius.circular(25.r)),\n//               ),\n//               calendarBuilders: CalendarBuilders(\n//                 selectedBuilder: (context, date, _) {\n//                   return Container(\n//                     //see difference between margin and padding below: Margin: Out (for itself), padding: In (for its child)\n//                     // margin: EdgeInsets.all(4.0.w),\n//                     padding: EdgeInsets.only(top: 6.0.h, left: 6.0.w),\n//                     color: Color.fromRGBO(255, 168, 68, 1),\n//                     width: 46.w,\n//                     height: 46.h,\n//                     child: Text(\n//                       '${date.day}',\n//                       style: TextStyle().copyWith(fontSize: 17.0.sp),\n//                     ),\n//                   );\n//                 },\n//                 todayBuilder: (context, date, _) {\n//                   return Container(\n//                     padding: EdgeInsets.only(top: 6.0.w, left: 6.0.w),\n//                     color: blue2,\n//                     width: 46.w,\n//                     height: 46.h,\n//                     child: Text(\n//                       '${date.day}',\n//                       style: TextStyle().copyWith(fontSize: 17.0.sp),\n//                     ),\n//                   );\n//                 },\n//                 markerBuilder: (context, date, events) {\n//                   if (events.isNotEmpty) {\n//                     return Positioned(\n//                       right: 1.w,\n//                       bottom: 1.h,\n//                       child: _buildEventsMarker(date, events),\n//                     );\n//                   }\n//                 },\n//               ),\n//\n//               onDaySelected: _onDaySelected,\n//               onRangeSelected: _onRangeSelected,\n//               onFormatChanged: (format) {\n//                 if (_calendarFormat != format) {\n//                   setState(() {\n//                     _calendarFormat = format;\n//                   });\n//                 }\n//               },\n//               onPageChanged: (focusedDay) {\n//                 _focusedDay = focusedDay;\n//               },\n//               pageJumpingEnabled: true,\n//             ),\n//             SizedBox(height: 8.0.h),\n//             Expanded(\n//               child: ValueListenableBuilder<List<InputModel>>(\n//                 valueListenable: _selectedEvents,\n//                 builder: (context, value, _) {\n//                   return Column(children: [\n//                     Balance(value),\n//                     Expanded(child: buildEvents(value))\n//                   ]);\n//                 },\n//               ),\n//             )\n//           ]);\n//         });\n//   }\n// }\n//\n// Widget _buildEventsMarker(DateTime date, List events) {\n//   double width = events.length < 100 ? 18.w : 28.w;\n//   return AnimatedContainer(\n//     duration: const Duration(milliseconds: 300),\n//     decoration: BoxDecoration(\n//       shape: BoxShape.rectangle,\n//       color: Color.fromRGBO(67, 125, 229, 1),\n//     ),\n//     width: width,\n//     height: 18.0.h,\n//     child: Center(\n//       child: Text(\n//         '${events.length}',\n//         style: TextStyle().copyWith(\n//           color: white,\n//           fontSize: 13.0.sp,\n//         ),\n//       ),\n//     ),\n//   );\n// }\n//\n// class Balance extends StatefulWidget {\n//   final List? events;\n//   Balance(this.events);\n//   @override\n//   _BalanceState createState() => _BalanceState();\n// }\n//\n// class _BalanceState extends State<Balance> {\n//   @override\n//   Widget build(BuildContext context) {\n//     double income = 0, expense = 0, balance = 0;\n//     if (widget.events != null) {\n//       for (int i = 0; i < widget.events!.length; i++) {\n//         if (widget.events![i].type == 'Income') {\n//           income = income + widget.events![i].amount;\n//         } else {\n//           expense = expense + widget.events![i].amount;\n//         }\n//         balance = income - expense;\n//       }\n//     }\n//     Widget summaryFrame(String type, double amount, color) => Column(\n//       mainAxisAlignment: MainAxisAlignment.spaceBetween,\n//       crossAxisAlignment: CrossAxisAlignment.center,\n//       children: [\n//         // this widget will never overflow\n//         Text(\n//           getTranslated(context, type)!,\n//           style: TextStyle(\n//               color: color,\n//               fontSize: 15.sp,\n//               fontStyle: FontStyle.italic,\n//               fontWeight: FontWeight.bold),\n//         ),\n//         Text(format(amount.toDouble()) + ' ' + currency,\n//             style: GoogleFonts.aBeeZee(\n//                 color: color,\n//                 fontSize: (format(amount.toDouble()).length > 19)\n//                     ? 11.5.sp\n//                     : format(amount.toDouble()).length > 14\n//                     ? 14.sp\n//                     : 18.sp,\n//                 fontStyle: FontStyle.italic,\n//                 fontWeight: FontWeight.bold),\n//             overflow: TextOverflow.ellipsis)\n//       ],\n//     );\n//     return Container(\n//       color: Colors.white54,\n//       height: 69.h,\n//       child: Padding(\n//         padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.h),\n//         child: Row(\n//           mainAxisAlignment: MainAxisAlignment.spaceBetween,\n//           children: [\n//             summaryFrame(\n//               'INCOME',\n//               income,\n//               Colors.lightGreen,\n//             ),\n//             Padding(\n//                 padding: EdgeInsets.symmetric(horizontal: 5.w),\n//                 child: summaryFrame('EXPENSE', expense, red)),\n//             Flexible(\n//                 child: summaryFrame('TOTAL BALANCE', balance, Colors.black)),\n//           ],\n//         ),\n//       ),\n//     );\n//   }\n// }\n"
  },
  {
    "path": "lib/project/home.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/painting.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/classes/constants.dart';\nimport 'package:money_assistant_2608/project/database_management/sqflite_services.dart';\nimport 'package:rate_my_app/rate_my_app.dart';\nimport 'dart:io' show Platform;\nimport 'app_pages/analysis.dart';\nimport 'app_pages/input.dart';\nimport 'localization/methods.dart';\nimport 'app_pages/calendar.dart';\nimport 'app_pages/others.dart';\n\nclass Home extends StatefulWidget {\n  @override\n  _HomeState createState() => _HomeState();\n}\n\nclass _HomeState extends State<Home> {\n  int _selectedIndex = 0;\n  List<Widget> myBody = [\n    AddInput(),\n    Analysis(),\n    Calendar(),\n    Other(),\n  ];\n  BottomNavigationBarItem bottomNavigationBarItem(\n          IconData iconData, String label) =>\n      BottomNavigationBarItem(\n        icon: Padding(\n          padding: EdgeInsets.only(bottom: 0.h),\n          child: Icon(\n            iconData,\n          ),\n        ),\n        label: getTranslated(context, label),\n      );\n\n  @override\n  void initState() {\n    super.initState();\n    DB.init();\n    var rateMyApp = RateMyApp(\n      minDays: 0,\n      // Will pop up the first time users launch the app\n      minLaunches: 1,\n      remindDays: 4,\n      remindLaunches: 15,\n      googlePlayIdentifier: 'com.mmas.money_assistant_2608',\n      appStoreIdentifier: '1582638369',\n    );\n\n    WidgetsBinding.instance?.addPostFrameCallback((_) async {\n\n      await rateMyApp.init();\n      rateMyApp.conditions.forEach((condition) {\n        if (condition is DebuggableCondition) {\n          print(condition.valuesAsString);\n          // condition.reset();\n        }\n      });\n      if (mounted && rateMyApp.shouldOpenDialog) {\n        rateMyApp.showRateDialog(\n          context,\n          // title: 'Rate this app', // The dialog title.\n          // message:\n          //     'If you like this app, please take a little bit of your time to review it!\\nYour support means the world to us ^^', // The dialog message.\n          // rateButton: 'RATE', // The dialog \"rate\" button text.\n          // noButton: 'NO THANKS', // The dialog \"no\" button text.\n          // laterButton: 'MAYBE LATER', // The dialog \"later\" button text.\n          // listener: (button) {\n          //   // The button click listener (useful if you want to cancel the click event).\n          //   switch (button) {\n          //     case RateMyAppDialogButton.rate:\n          //       print('Clicked on \"Rate\".');\n          //       break;\n          //     case RateMyAppDialogButton.later:\n          //       print('Clicked on \"Later\".');\n          //       break;\n          //     case RateMyAppDialogButton.no:\n          //       print('Clicked on \"No\".');\n          //       break;\n          //   }\n          //   return true; // Return false if you want to cancel the click event.\n          // },\n          ignoreNativeDialog: Platform\n              .isAndroid, // Set to false if you want to show the Apple's native app rating dialog on iOS or Google's native app rating dialog (depends on the current Platform).\n          onDismissed: () => rateMyApp.callEvent(RateMyAppEventType\n              .laterButtonPressed), // Called when the user dismissed the dialog (either by taping outside or by pressing the \"back\" button).\n          // contentBuilder: (context, defaultContent) => Text('ok'), // This one allows you to change the default dialog content.\n          // actionsBuilder: (context) => [], // This one allows you to use your own buttons.\n        );\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<BottomNavigationBarItem> bottomItems = <BottomNavigationBarItem>[\n      bottomNavigationBarItem(Icons.add, 'Input'),\n      bottomNavigationBarItem(Icons.analytics_outlined, 'Analysis'),\n      bottomNavigationBarItem(Icons.calendar_today, 'Calendar'),\n      bottomNavigationBarItem(Icons.account_circle, 'Other'),\n    ];\n\n    return Scaffold(\n        bottomNavigationBar: Container(\n          decoration: BoxDecoration(\n            boxShadow: [\n              BoxShadow(\n                color: grey,\n              ),\n            ],\n          ),\n          child: BottomNavigationBar(\n            iconSize: 27.sp,\n            selectedFontSize: 16.sp,\n            unselectedFontSize: 14.sp,\n            backgroundColor: white,\n            selectedItemColor: Colors.amber[800],\n            unselectedItemColor: Colors.black87,\n            type: BottomNavigationBarType.fixed,\n            items: bottomItems,\n            currentIndex: _selectedIndex,\n            onTap: (int index) {\n              setState(() {\n                _selectedIndex = index;\n              });\n            },\n          ),\n        ),\n        body: myBody[_selectedIndex]);\n  }\n}\n"
  },
  {
    "path": "lib/project/localization/app_localization.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass AppLocalization {\n  final Locale locale;\n  AppLocalization(this.locale);\n  late Map<String, String> _localizedMap;\n\n  static AppLocalization? of(BuildContext context) {\n    return Localizations.of<AppLocalization>(context, AppLocalization);\n  }\n\n  Future<void> load() async {\n    String jsonStringValues = await rootBundle.loadString(\n        'lib/project/localization/lang/${locale.languageCode}.json');\n    Map<String, dynamic> mappedJson = json.decode(jsonStringValues);\n    _localizedMap =\n        mappedJson.map((key, value) => MapEntry(key, value.toString()));\n  }\n\n  String? translate(String key) {\n    return _localizedMap[key];\n  }\n\n  Map<String, String> localizedMap() => _localizedMap;\n\n// static member to have simple access to the delegate from Material App\n  static const LocalizationsDelegate<AppLocalization> delegate =\n      _DemoLocalizationsDelegate();\n}\n\nclass _DemoLocalizationsDelegate\n    extends LocalizationsDelegate<AppLocalization> {\n  const _DemoLocalizationsDelegate();\n\n  @override\n  bool isSupported(Locale locale) {\n    return [\n      'en',\n      // 'ar',\n      'de',\n      'es',\n      'fr',\n      'hi',\n      'ja',\n      'ko',\n      'pt',\n      'ru',\n      'tr',\n      'vi',\n      'zh',\n      'ne'\n    ].contains(locale.languageCode);\n  }\n\n  @override\n  Future<AppLocalization> load(Locale locale) async {\n    AppLocalization localization = new AppLocalization(locale);\n    await localization.load();\n    return localization;\n  }\n\n  @override\n  bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false;\n}\n"
  },
  {
    "path": "lib/project/localization/lang/ar.json",
    "content": "{\n  \"Input\": \"\",\n  \"Analysis\": \"\",\n  \"Calendar\": \"\",\n  \"Other\": \"\",\n  \"OtherIncome\": \"\",\n  \"OtherExpense\": \"\",\n  \"INCOME\": \"\",\n  \"EXPENSE\": \"\",\n  \"Amount\": \"\",\n  \"Description\": \"\",\n  \"Save\": \"\",\n  \"Edit Category\": \"\",\n  \"Enter Category Name\": \"\",\n  \"Transport\": \"\",\n  \"Fuel\": \"\",\n  \"Parking\": \"\",\n  \"Services & Maintenance\": \"\",\n  \"Taxi\": \"\",\n  \"Shopping\": \"\",\n  \"Accessories\": \"\",\n  \"Electronic Devices\": \"\",\n  \"Clothes\": \"\",\n  \"Footwear\": \"\",\n  \"Entertainment\": \"\",\n  \"Movies\": \"\",\n  \"Games\": \"\",\n  \"Music\": \"\",\n  \"Travel\": \"\",\n  \"Food & Beverages\": \"\",\n  \"Beverages\": \"\",\n  \"Food\": \"\",\n  \"Daily Necessities\": \"\",\n  \"Groceries\": \"\",\n  \"Restaurant\": \"\",\n  \"Gifts & Donations\": \"\",\n  \"Charity\": \"\",\n  \"GiftsExpense\": \"\",\n  \"Funeral\": \"\",\n  \"Wedding\": \"\",\n  \"Health\": \"\",\n  \"Doctor\": \"\",\n  \"Health Insurance\": \"\",\n  \"Medicine\": \"\",\n  \"Sports\": \"\",\n  \"Home\": \"\",\n  \"Furnishings\": \"\",\n  \"Home Services\": \"\",\n  \"Pets\": \"\",\n  \"Mortgage & Rent\": \"\",\n  \"Kids\": \"\",\n  \"Pocket Money\": \"\",\n  \"Baby Products\": \"\",\n  \"Babysitter & Daycare\": \"\",\n  \"Tuition\": \"\",\n  \"Personal Development\": \"\",\n  \"Education\": \"\",\n  \"Business\": \"\",\n  \"InvestmentExpense\": \"\",\n  \"Utility Bills\": \"\",\n  \"Electricity\": \"\",\n  \"Internet\": \"\",\n  \"Mobile Phone\": \"\",\n  \"Water\": \"\",\n  \"Salary\": \"\",\n  \"Bonus\": \"\",\n  \"Side job\": \"\",\n  \"GiftsIncome\": \"\",\n  \"InvestmentIncome\": \"\",\n  \"Income\": \"\",\n  \"Expense\": \"\",\n  \"Balance\": \"\",\n  \"Today\": \"\",\n  \"This week\": \"\",\n  \"This month\": \"\",\n  \"This year\": \"\",\n  \"This quarter\": \"\",\n  \"Category\": \"\",\n  \"TOTAL BALANCE\": \"\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\":\"\",\n  \"My Account\": \"\",\n  \"General Settings\": \"\",\n  \"Language\": \"\",\n  \"Currency\": \"\",\n  \"Share Friends\": \"\",\n  \"Rate App\": \"\",\n  \"Feedback\": \"\",\n  \"Add Expense Category\": \"\",\n  \"Add Income Category\": \"\",\n  \"Category name\": \"\",\n  \"Parent category\": \"\",\n  \"Add\": \"\",\n  \"Game\": \"\",\n  \"Edit\": \"\",\n  \"Select a date\": \"\",\n  \"CANCEL\": \"\",\n  \"OK\": \"\",\n  \"There is no data\": \"\",\n  \"Select a language\": \"\",\n  \"Please fill a category name\": \"\",\n  \"Delete\": \"\",\n  \"Total Year Amount\": \"\",\n  \"Report\": \"\",\n  \"Hi you\": \"\",\n  \"All\": \"\",\n  \"Category already exists\": \"\",\n  \"Month\": \"\",\n  \"2 weeks\": \"\",\n  \"Week\": \"\",\n  \"Since\": \"\",\n  \"Data has been saved\": \"\",\n  \"Choose Category\": \"\",\n  \"Done\": \"\",\n  \"Icons\": \"\",\n  \"Please Confirm\": \"\",\n  \"Yes\": \"\",\n  \"No\": \"\",\n  \"Cancel\": \"\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"\",\n  \"Reset\": \"\",\n  \"Reset All Categories\": \"\",\n  \"Categories have been reset\": \"\",\n  \"Enable Passcode\": \"\",\n  \"Please Enter Passcode\": \"\",\n  \"Please Re-enter Passcode\": \"\",\n  \"Passcode has been disabled\": \"\",\n  \"Passcode has been enabled\": \"\",\n  \"Category has been deleted\": \"\",\n  \"Are you sure you want to delete this category?\": \"\",\n  \"Delete All Data\": \"\",\n  \"All data has been deleted\": \"\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"\",\n  \"Select a currency\": \"\",\n  \"Category has been updated\": \"\",\n  \"Are you sure you want to delete this transaction?\": \"\",\n  \"Transaction has been deleted\": \"\",\n  \"Transaction has been updated\": \"\",\n  \"Select a date format\": \"\",\n  \"Date format\": \"\",\n  \"Date format has been updated\": \"\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/de.json",
    "content": "{\n  \"Input\": \"Eingang\",\n  \"Analysis\": \"Analyse\",\n  \"Calendar\": \"Kalender\",\n  \"Other\": \"Andere\",\n  \"OtherIncome\": \"Andere\",\n  \"OtherExpense\": \"Andere\",\n  \"INCOME\": \"EINKOMMEN\",\n  \"EXPENSE\": \"AUSGABEN\",\n  \"Amount\": \"Betrag\",\n  \"Description\": \"Beschreibung\",\n  \"Save\": \"Sparen\",\n  \"Edit Category\": \"Kategorie bearbeiten\",\n  \"Enter Category Name\": \"Geben Sie den Kategoriennamen ein\",\n  \"Transport\": \"Transport\",\n  \"Fuel\": \"Treibstoff\",\n  \"Parking\": \"Parken\",\n  \"Services & Maintenance\": \"Service & Wartung\",\n  \"Taxi\": \"Taxi\",\n  \"Shopping\": \"Einkaufen\",\n  \"Accessories\": \"Zubehör\",\n  \"Electronic Devices\": \"Elektronik\",\n  \"Clothes\": \"Kleider\",\n  \"Footwear\": \"Schuhwerk\",\n  \"Entertainment\": \"Unterhaltung\",\n  \"Movies\": \"Filme\",\n  \"Games\": \"Spiele\",\n  \"Music\": \"Musik\",\n  \"Travel\": \"Reise\",\n  \"Food & Beverages\": \"Essen & Trinken\",\n  \"Beverages\": \"Getränke\",\n  \"Food\": \"Essen\",\n  \"Daily Necessities\": \"Täglicher Bedarf\",\n  \"Groceries\": \"Täglicher Bedarf\",\n  \"Restaurant\": \"Restaurant\",\n  \"Gifts & Donations\": \"Geschenke & Spenden\",\n  \"Charity\": \"Nächstenliebe\",\n  \"GiftsExpense\": \"Geschenke\",\n  \"Funeral\": \"Beerdigung\",\n  \"Wedding\": \"Hochzeit\",\n  \"Health\": \"Gesundheit\",\n  \"Doctor\": \"Arzt\",\n  \"Health Insurance\": \"Krankenkasse\",\n  \"Medicine\": \"Medizin\",\n  \"Sports\": \"Sport\",\n  \"Home\": \"Zuhause\",\n  \"Furnishings\": \"Einrichtung\",\n  \"Home Services\": \"Heimdienste\",\n  \"Pets\": \"Haustiere\",\n  \"Mortgage & Rent\": \"Hypothek & Miete\",\n  \"Kids\": \"Kinder\",\n  \"Pocket Money\": \"Taschengeld\",\n  \"Baby Products\": \"Baby-Produkte\",\n  \"Babysitter & Daycare\": \"Babysitter\",\n  \"Tuition\": \"Schulgeld\",\n  \"Personal Development\": \"Personalentwicklung\",\n  \"Education\": \"Bildung\",\n  \"Business\": \"Geschäft\",\n  \"InvestmentExpense\": \"Investition\",\n  \"Utility Bills\": \"Rechnungen\",\n  \"Electricity\": \"Elektrizität\",\n  \"Internet\": \"Internet\",\n  \"Mobile Phone\": \"Mobiltelefon\",\n  \"Water\": \"Wasser\",\n  \"Salary\": \"Gehalt\",\n  \"Bonus\": \"Bonus\",\n  \"Side job\": \"Nebenjob\",\n  \"GiftsIncome\": \"Geschenke\",\n  \"InvestmentIncome\": \"Investition\",\n  \"Income\": \"Einkommen\",\n  \"Expense\": \"Ausgaben\",\n  \"Balance\": \"Gesamtsaldo\",\n  \"Today\": \"Heute\",\n  \"This week\": \"Diese Woche\",\n  \"This month\": \"Diesen Monat\",\n  \"This year\": \"Dieses Jahr\",\n  \"This quarter\": \"Dieses Quartal\",\n  \"Category\": \"Kategorie\",\n  \"TOTAL BALANCE\": \"GESAMTSALDO\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"UPGRADE-OPTIONEN ANZEIGEN\",\n  \"My Account\": \"Mein Konto\",\n  \"General Settings\":  \"Allgemeine Einstellungen\",\n  \"Language\": \"Sprache\",\n  \"Currency\": \"Währung\",\n  \"Share Friends\": \"Teilen Sie Freunde\",\n  \"Rate App\": \"Bewertungs App\",\n  \"Feedback\": \"Feedback\",\n  \"Add Expense Category\": \"Ausgabenkategorie hinzufügen\",\n  \"Add Income Category\": \"Einkommenskategorie hinzufügen\",\n  \"Category name\": \"Kategorie-Name\",\n  \"Parent category\": \"Übergeordnete Kategorie\",\n  \"Add\": \"Hinzufügen\",\n  \"Game\": \"Spiel\",\n  \"Edit\": \"Bearbeiten\",\n  \"Select a date\": \"Wählen Sie ein Datum\",\n  \"CANCEL\": \"ABBRECHEN\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"Es sind keine Daten vorhanden\",\n  \"Select a language\": \"Wählen Sie eine Sprache\",\n  \"Please fill a category name\": \"Bitte geben Sie einen Kategorienamen ein\",\n  \"Delete\": \"Löschen\",\n  \"Total Year Amount\": \"Gesamtjahresbetrag\",\n  \"Report\": \"Bericht\",\n  \"Hi you\": \"Hallo Du\",\n  \"All\": \"Alle\",\n  \"Category already exists\": \"Kategorie existiert bereits\",\n  \"Month\": \"Monat\",\n  \"2 weeks\": \"2 Wochen\",\n  \"Week\": \"Woche\",\n  \"Since\": \"Seit\",\n  \"Data has been saved\": \"Die Daten wurden gespeichert\",\n  \"Choose Category\": \"Kategorie wählen\",\n  \"Done\": \"Erledigt\",\n  \"Icons\": \"Icons\",\n  \"Please Confirm\": \"Bestätigen Sie\",\n  \"Yes\": \"Ja\",\n  \"No\": \"Nein\",\n  \"Cancel\": \"Abbrechen\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie sicher, dass Sie alle Kategorien zurücksetzen wollen?\",\n  \"Reset\": \"Zurücksetzen\",\n  \"Reset All Categories\": \"Alle Kategorien zurücksetzen\",\n  \"Categories have been reset\": \"Die Kategorien wurden zurückgesetzt\",\n  \"Enable Passcode\": \"Aktivieren Sie den Passcode\",\n  \"Please Enter Passcode\": \"Bitte Passcode eingeben\",\n  \"Please Re-enter Passcode\": \"Bitte geben Sie den Passcode erneut ein\",\n  \"Passcode has been disabled\": \"Der Passcode wurde deaktiviert\",\n  \"Passcode has been enabled\": \"Der Passcode wurde aktiviert\",\n  \"Category has been deleted\": \"Kategorie wurde gelöscht\",\n  \"Are you sure you want to delete this category?\": \"Sind Sie sicher, dass Sie diese Kategorie löschen möchten?\",\n  \"Delete All Data\": \"Alle Daten löschen\",\n  \"All data has been deleted\": \"Alle Daten wurden gelöscht\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Gelöschte Daten können nicht wiederhergestellt werden. Sind Sie sicher, dass Sie alle Daten löschen möchten?\",\n  \"Select a currency\": \"Wählen Sie eine Währung\",\n  \"Category has been updated\": \"Die Kategorie wurde aktualisiert\",\n  \"Are you sure you want to delete this transaction?\": \"Sind Sie sicher, dass Sie diese Transaktion löschen möchten?\",\n  \"Transaction has been deleted\": \"Die Transaktion wurde gelöscht\",\n  \"Transaction has been updated\": \"Die Transaktion wurde aktualisiert\",\n  \"Select a date format\": \"Wählen Sie ein Datumsformat\",\n  \"Date format\": \"Datumsformat\",\n  \"Date format has been updated\": \"Datumsformat wurde aktualisiert\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/en.json",
    "content": "{\n  \"Input\": \"Add\",\n  \"Analysis\": \"Analysis\",\n  \"Calendar\": \"Calendar\",\n  \"Other\": \"Other\",\n  \"OtherIncome\": \"Other\",\n  \"OtherExpense\": \"Other\",\n  \"INCOME\": \"INCOME\",\n  \"EXPENSE\": \"EXPENSE\",\n  \"Amount\": \"Amount\",\n  \"Description\": \"Description\",\n  \"Save\": \"Save\",\n  \"Edit Category\": \"Edit Categories\",\n  \"Enter Category Name\": \"Enter A Category Name\",\n  \"Transport\": \"Transport\",\n  \"Fuel\": \"Fuel\",\n  \"Parking\":\"Parking\",\n  \"Services & Maintenance\": \"Services & Maintenance\",\n  \"Taxi\": \"Taxi\",\n  \"Shopping\": \"Shopping\",\n  \"Accessories\": \"Accessories\",\n  \"Electronic Devices\": \"Electronic Devices\",\n  \"Clothes\": \"Clothes\",\n  \"Footwear\": \"Footwear\",\n  \"Entertainment\": \"Entertainment\",\n  \"Movies\": \"Movies\",\n  \"Games\": \"Games\",\n  \"Music\": \"Music\",\n  \"Travel\": \"Travel\",\n  \"Food & Beverages\": \"Food & Beverages\",\n  \"Beverages\": \"Beverages\",\n  \"Food\": \"Food\",\n  \"Daily Necessities\": \"Groceries\",\n  \"Groceries\": \"Groceries\",\n  \"Restaurant\": \"Restaurant\",\n  \"Gifts & Donations\": \"Gifts & Donations\",\n  \"Charity\": \"Charity\",\n  \"GiftsExpense\": \"Gifts\",\n  \"Funeral\": \"Funeral\",\n  \"Wedding\": \"Wedding\",\n  \"Health\": \"Health\",\n  \"Doctor\": \"Doctor\",\n  \"Health Insurance\": \"Health Insurance\",\n  \"Medicine\": \"Medicine\",\n  \"Sports\": \"Sports\",\n  \"Home\": \"Home\",\n  \"Furnishings\": \"Furnishings\",\n  \"Home Services\": \"Home Services\",\n  \"Pets\": \"Pets\",\n\"Mortgage & Rent\": \"Mortgage & Rent\",\n  \"Kids\": \"Kids\",\n  \"Pocket Money\": \"Pocket Money\",\n  \"Baby Products\": \"Baby Products\",\n  \"Babysitter & Daycare\": \"Babysitter & Daycare\",\n  \"Tuition\":\"Tuition\",\n  \"Personal Development\": \"Personal Development\",\n  \"Education\": \"Education\",\n  \"Business\": \"Business\",\n  \"InvestmentExpense\": \"Investment\",\n  \"Utility Bills\": \"Utility Bills\",\n  \"Electricity\": \"Electricity\",\n  \"Internet\": \"Internet\",\n  \"Mobile Phone\": \"Mobile Phone\",\n  \"Water\": \"Water\",\n  \"Salary\": \"Salary\",\n  \"Bonus\": \"Bonus\",\n  \"Side job\": \"Side job\",\n  \"GiftsIncome\": \"Gifts\",\n  \"InvestmentIncome\": \"Investment\",\n  \"Income\": \"Income\",\n  \"Expense\": \"Expense\",\n  \"Balance\": \"Balance\",\n  \"Today\": \"Today\",\n  \"This week\": \"This week\",\n  \"This month\": \"This month\",\n  \"This year\": \"This year\",\n  \"This quarter\": \"This quarter\",\n  \"Category\": \"Category\",\n  \"TOTAL BALANCE\": \"BALANCE\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\":   \"VIEW UPGRADE OPTIONS\",\n  \"My Account\": \"My Account\",\n  \"General Settings\":  \"Settings\",\n  \"Language\": \"Language\",\n  \"Currency\": \"Currency\",\n  \"Share Friends\": \"Share Friends\",\n  \"Rate App\": \"Rate App\",\n\"Feedback\": \"Feedback\",\n  \"Add Expense Category\": \"Add An Expense Category\",\n  \"Category name\": \"Category name\",\n  \"Parent category\": \"Parent category\",\n  \"Add\": \"Add\",\n  \"Game\": \"Game\",\n  \"Edit\": \"Edit\",\n  \"Select a date\": \"Select a date\",\n  \"CANCEL\": \"CANCEL\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"There is no data\",\n  \"Select a language\": \"Select a language\",\n  \"Please fill a category name\": \"Please fill a category name\",\n  \"Delete\": \"Delete\",\n  \"Total Year Amount\": \"Total Year Amount\",\n  \"Report\": \"Report\",\n  \"Add Income Category\": \"Add Income Category\",\n  \"Hi you\": \"Hi you\",\n  \"All\": \"All\",\n  \"Category already exists\": \"Category already exists\",\n  \"Month\": \"Month\",\n  \"2 weeks\": \"2 weeks\",\n  \"Week\": \"Week\",\n  \"Since\": \"Since\",\n  \"Data has been saved\": \"Data has been saved\",\n  \"Choose Category\": \"Choose Category\",\n  \"Done\": \"Done\",\n  \"Icons\": \"Icons\",\n  \"Please Confirm\": \"Please Confirm\",\n  \"Yes\": \"Yes\",\n  \"No\": \"No\",\n  \"Cancel\": \"Cancel\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"This action cannot be undone. Are you sure you want to reset all categories?\",\n  \"Reset\": \"Reset\",\n  \"Reset All Categories\": \"Reset All Categories\",\n  \"Categories have been reset\": \"Categories have been reset\",\n  \"Enable Passcode\": \"Enable Passcode\",\n  \"Please Enter Passcode\": \"Please Enter Passcode\",\n  \"Please Re-enter Passcode\": \"Please Re-enter passcode\",\n  \"Passcode has been disabled\": \"Passcode has been disabled\",\n  \"Passcode has been enabled\": \"Passcode has been enabled\",\n  \"Category has been deleted\": \"Category has been deleted\",\n  \"Are you sure you want to delete this category?\": \"Are you sure you want to delete this category?\",\n  \"Delete All Data\": \"Delete All Data\",\n  \"All data has been deleted\": \"All data has been deleted\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Deleted data can not be recovered. Are you sure you want to delete all data?\",\n  \"Select a currency\": \"Select a currency\",\n  \"Category has been updated\": \"Category has been updated\",\n  \"Are you sure you want to delete this transaction?\": \"Are you sure you want to delete this transaction?\",\n  \"Transaction has been deleted\": \"Transaction has been deleted\",\n  \"Transaction has been updated\": \"Transaction has been updated\",\n  \"Select a date format\": \"Select a date format\",\n  \"Date format\": \"Date format\",\n  \"Date format has been updated\": \"Date format has been updated\"\n}"
  },
  {
    "path": "lib/project/localization/lang/es.json",
    "content": "{\n  \"Input\": \"Aporte\",\n  \"Analysis\": \"Análisis\",\n  \"Calendar\": \"Calendario\",\n  \"Other\": \"Otro\",\n  \"OtherIncome\": \"Otro\",\n  \"OtherExpense\": \"Otro\",\n  \"INCOME\": \"INGRESO\",\n  \"EXPENSE\": \"GASTOS\",\n  \"Amount\": \"Cantidad\",\n  \"Description\": \"Descripción\",\n  \"Save\": \"Salvar\",\n  \"Edit Category\": \"Editar categoria\",\n  \"Enter Category Name\": \"Ingrese el nombre de la categoría\",\n  \"Transport\": \"transporte\",\n  \"Fuel\": \"Combustible\",\n  \"Parking\": \"Parking\",\n  \"Services & Maintenance\": \"Servicios\",\n  \"Taxi\": \"Taxi\",\n  \"Shopping\": \"Compras\",\n  \"Accessories\": \"Accesorios\",\n  \"Electronic Devices\": \"Dispositivos electrónicos\",\n  \"Clothes\": \"Ropa\",\n  \"Footwear\": \"Calzado\",\n  \"Entertainment\": \"Entretenimiento\",\n  \"Movies\": \"Películas\",\n  \"Games\": \"Juegos\",\n  \"Music\": \"Música\",\n  \"Travel\": \"Viajar\",\n  \"Food & Beverages\": \"Alimentos y bebidas\",\n  \"Beverages\": \"bebidas\",\n  \"Food\": \"Comida\",\n  \"Daily Necessities\": \"Comestibles\",\n  \"Groceries\": \"Épicerie\",\n  \"Restaurant\": \"Restaurante\",\n  \"Gifts & Donations\": \"Regalos y Donaciones\",\n  \"Charity\": \"Caridad\",\n  \"GiftsExpense\": \"Regalos\",\n  \"Funeral\": \"Funeral\",\n  \"Wedding\": \"Boda\",\n  \"Health\": \"Salud\",\n  \"Doctor\": \"Doctor\",\n  \"Health Insurance\": \"Seguro de salud\",\n  \"Medicine\": \"Medicina\",\n  \"Sports\": \"Deportes\",\n  \"Home\": \"Hogar\",\n  \"Furnishings\": \"Mobiliario\",\n  \"Home Services\": \"Servicios a domicilio\",\n  \"Pets\": \"Mascotas\",\n  \"Mortgage & Rent\": \"Hipoteca y alquiler\",\n  \"Kids\": \"Niños\",\n  \"Pocket Money\": \"dinero de bolsillo\",\n  \"Baby Products\": \"productos para bebés\",\n  \"Babysitter & Daycare\": \"Niñera y guardería\",\n  \"Tuition\": \"Matrícula\",\n  \"Personal Development\": \"Desarrollo personal\",\n  \"Education\": \"Educación\",\n  \"Business\": \"Negocios\",\n  \"InvestmentExpense\": \"Inversión\",\n  \"Utility Bills\": \"Facturas de servicios\",\n  \"Electricity\": \"Electricidad\",\n  \"Internet\": \"Internet\",\n  \"Mobile Phone\": \"Teléfono móvil\",\n  \"Water\": \"Agua\",\n  \"Salary\": \"Salario\",\n  \"Bonus\": \"Bonificación\",\n  \"Side job\": \"Trabajo secundario\",\n  \"GiftsIncome\": \"Regalos\",\n  \"InvestmentIncome\": \"Inversión\",\n  \"Income\": \"Ingreso\",\n  \"Expense\": \"Gastos\",\n  \"Balance\": \"Saldo\",\n  \"Today\": \"Hoy dia\",\n  \"This week\": \"Esta semana\",\n  \"This month\": \"Este mes\",\n  \"This year\": \"Este año\",\n  \"This quarter\": \"Este trimestre\",\n  \"Category\": \"Categoría\",\n  \"TOTAL BALANCE\": \"SALDO TOTAL\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"VER OPCIONES DE ACTUALIZACIÓN\",\n  \"My Account\": \"Mi cuenta\",\n  \"General Settings\":  \"Configuración general\",\n  \"Language\": \"Idioma\",\n  \"Currency\": \"Moneda\",\n  \"Share Friends\": \"Comparte amigos\",\n  \"Rate App\": \"Tarifa de la aplicación\",\n  \"Feedback\": \"Realimentación\",\n  \"Add Expense Category\": \"Añadir categoría de gastos\",\n  \"Add Income Category\": \"Añadir categoría de ingresos\",\n  \"Category name\": \"Nombre de la categoría\",\n  \"Parent category\": \"Categoría padre\",\n  \"Add\": \"Añadir\",\n  \"Game\": \"Juego\",\n  \"Edit\": \"Editar\",\n  \"Select a date\": \"Seleccionar una fecha\",\n  \"CANCEL\": \"CANCELAR\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"No hay datos\",\n  \"Select a language\": \"Seleccione un idioma\",\n  \"Please fill a category name\": \"Por favor complete un nombre de categoría\",\n  \"Delete\": \"Borrar\",\n  \"Total Year Amount\": \"Importe total del año\",\n  \"Report\": \"Informe\",\n  \"Hi you\": \"Hola\",\n  \"All\": \"Todo\",\n  \"Category already exists\": \"La categoría ya existe\",\n  \"Month\": \"Mes\",\n  \"2 weeks\": \"2 semanas\",\n  \"Week\": \"Semana\",\n  \"Since\": \"Desde\",\n  \"Data has been saved\": \"Los datos se han guardado\",\n  \"Choose Category\": \"Elija la categoría\",\n  \"Done\": \"Hecho\",\n  \"Icons\": \"Iconos\",\n  \"Please Confirm\": \"Confirmar\",\n  \"Yes\": \"Sí\",\n  \"No\": \"No\",\n  \"Cancel\": \"Cancelar\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Esta acción no se puede deshacer. ¿Está seguro de que quiere restablecer todas las categorías?\",\n  \"Reset\": \"Restablecer\",\n  \"Reset All Categories\": \"Restablecer todas las categorías\",\n  \"Categories have been reset\": \"Las categorías se han restablecido\",\n  \"Enable Passcode\": \"Habilitar código de acceso\",\n  \"Please Enter Passcode\": \"Por favor, introduzca el código de acceso\",\n  \"Please Re-enter Passcode\": \"Por favor, vuelva a introducir el código de acceso\",\n  \"Passcode has been disabled\": \"El código de acceso ha sido desactivado\",\n  \"Passcode has been enabled\": \"Se ha habilitado el código de acceso\",\n  \"Category has been deleted\": \"Se ha eliminado la categoría\",\n  \"Are you sure you want to delete this category?\": \"¿Está seguro de que desea eliminar esta categoría?\",\n  \"Delete All Data\": \"Borrar todos los datos\",\n  \"All data has been deleted\": \"Se han borrado todos los datos\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Los datos borrados no se pueden recuperar. ¿Está seguro de que quiere borrar todos los datos?\",\n  \"Select a currency\": \"Seleccione una moneda\",\n  \"Category has been updated\": \"La categoría ha sido actualizada\",\n  \"Are you sure you want to delete this transaction?\": \"¿Está seguro de que quiere borrar esta transacción?\",\n  \"Transaction has been deleted\": \"La transacción ha sido eliminada\",\n  \"Transaction has been updated\": \"La transacción ha sido actualizada\",\n  \"Select a date format\": \"Seleccione un formato de fecha\",\n  \"Date format\": \"Formato de fecha\",\n  \"Date format has been updated\": \"Se ha actualizado el formato de fecha\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/fr.json",
    "content": "{\n  \"Input\": \"Intrant\",\n  \"Analysis\": \"Analyse\",\n  \"Calendar\": \"Calendrier\",\n  \"Other\": \"Autre\",\n  \"OtherIncome\": \"Autre\",\n  \"OtherExpense\": \"Autre\",\n  \"INCOME\": \"REVENU\",\n  \"EXPENSE\": \"DÉPENSES\",\n  \"Amount\": \"Quantité\",\n  \"Description\": \"Description\",\n  \"Save\": \"Sauvez\",\n  \"Edit Category\": \"Éditer la catégorie\",\n  \"Enter Category Name\": \"Entrez le nom de la catégorie\",\n  \"Transport\": \"transport\",\n  \"Fuel\": \"Le carburant\",\n  \"Parking\": \"Parking\",\n  \"Services & Maintenance\": \"Services et maintenance\",\n  \"Taxi\": \"Taxi\",\n  \"Shopping\": \"Shopping\",\n  \"Accessories\": \"Accessoires\",\n  \"Electronic Devices\": \"Dispositifs\",\n  \"Clothes\": \"Vêtements\",\n  \"Footwear\": \"Chaussures\",\n  \"Entertainment\": \"Divertissement\",\n  \"Movies\": \"Films\",\n  \"Games\": \"Jeux\",\n  \"Music\": \"Musique\",\n  \"Travel\": \"Voyage\",\n  \"Food & Beverages\": \"Aliments et boissons\",\n  \"Beverages\": \"breuvages\",\n  \"Food\": \"Aliments\",\n  \"Daily Necessities\": \"Épicerie\",\n  \"Groceries\": \"Épicerie\",\n  \"Restaurant\": \"Le restaurant\",\n  \"Gifts & Donations\": \"Cadeaux et dons\",\n  \"Charity\": \"Charité\",\n  \"GiftsExpense\": \"Cadeaux\",\n  \"Funeral\": \"Funéraire\",\n  \"Wedding\": \"Mariage\",\n  \"Health\": \"Santé\",\n  \"Doctor\": \"Médecin\",\n  \"Health Insurance\": \"Assurance santé\",\n  \"Medicine\": \"Médicament\",\n  \"Sports\": \"Des sports\",\n  \"Home\": \"Maison\",\n  \"Furnishings\": \"Mobilier\",\n  \"Home Services\": \"Services à domicile\",\n  \"Pets\": \"Animal domestique\",\n  \"Mortgage & Rent\": \"Hypothèque et loyer\",\n  \"Kids\": \"Enfants\",\n  \"Pocket Money\": \"Argent de poche\",\n  \"Baby Products\": \"Produits pour bébés\",\n  \"Babysitter & Daycare\": \"Baby-sitter et garderie\",\n  \"Tuition\": \"Frais de scolarité\",\n  \"Personal Development\": \"Développement\",\n  \"Education\": \"Éducation\",\n  \"Business\": \"Entreprise\",\n  \"InvestmentExpense\": \"Investissement\",\n  \"Utility Bills\": \"Factures\",\n  \"Electricity\": \"Électricité\",\n  \"Internet\": \"L'Internet\",\n  \"Mobile Phone\": \"Téléphone mobile\",\n  \"Water\": \"L'eau\",\n  \"Salary\": \"Un salaire\",\n  \"Bonus\": \"Bonus\",\n  \"Side job\": \"Travail d'appoint\",\n  \"GiftsIncome\": \"Cadeaux\",\n  \"InvestmentIncome\": \"Investissement\",\n  \"Income\": \"Revenu\",\n  \"Expense\": \"Dépenses\",\n  \"Balance\": \"Solde\",\n  \"Today\": \"Aujourd'hui\",\n  \"This week\": \"Cette semaine\",\n  \"This month\": \"Ce mois-ci\",\n  \"This year\": \"Cette année\",\n  \"This quarter\": \"Ce trimestre\",\n  \"Category\": \"Catégorie\",\n  \"TOTAL BALANCE\": \"SOLDE TOTAL\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"VOIR LES OPTIONS DE MISE À NIVEAU\",\n  \"My Account\": \"Mon compte\",\n  \"General Settings\":  \"Réglages généraux\",\n  \"Language\": \"Langue\",\n  \"Currency\": \"Devise\",\n  \"Share Friends\": \"Partager des amis\",\n  \"Rate App\": \"Application de taux\",\n  \"Feedback\": \"Retour d'information\",\n  \"Add Expense Category\": \"Ajouter une catégorie de dépenses\",\n  \"Add Income Category\": \"Ajouter une catégorie de revenu\",\n  \"Category name\": \"Nom de la catégorie\",\n  \"Parent category\": \"Catégorie mère\",\n  \"Add\": \"Ajouter\",\n  \"Game\": \"Jeu\",\n  \"Edit\": \"Editer\",\n  \"Select a date\": \"Sélectionner une date\",\n  \"CANCEL\": \"ANNULER\",\n  \"OK\": \"D'ACCORD\",\n  \"There is no data\": \"Il n'y a pas de données\",\n  \"Select a language\": \"Sélectionnez une langue\",\n  \"Please fill a category name\": \"Veuillez remplir un nom de catégorie\",\n  \"Delete\": \"Supprimer\",\n  \"Total Year Amount\": \"Montant total de l'année\",\n  \"Report\": \"Rapport\",\n  \"Hi you\": \"Salut toi\",\n  \"All\": \"Tout\",\n  \"Category already exists\": \"La catégorie existe déjà\",\n  \"Month\": \"Mois\",\n  \"2 weeks\": \"2 semaines\",\n  \"Week\": \"Semaine\",\n  \"Since\": \"Depuis\",\n  \"Data has been saved\": \"Les données ont été sauvegardées\",\n  \"Choose Category\": \"Choisissez la catégorie\",\n  \"Done\": \"Terminé\",\n  \"Icons\": \"Icônes\",\n  \"Please Confirm\": \"Confirmez\",\n  \"Yes\": \"Oui\",\n  \"No\": \"Non\",\n  \"Cancel\": \"Annuler\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Cette action ne peut pas être annulée. Êtes-vous sûr de vouloir réinitialiser toutes les catégories ?\",\n  \"Reset\": \"Réinitialiser\",\n  \"Reset All Categories\": \"Réinitialiser toutes les catégories\",\n  \"Categories have been reset\": \"Les catégories ont été réinitialisées\",\n  \"Enable Passcode\": \"Activer le code d'accès\",\n  \"Please Enter Passcode\": \"Veuillez entrer le code d'accès\",\n  \"Please Re-enter Passcode\": \"Veuillez saisir à nouveau le code d'accès\",\n  \"Passcode has been disabled\": \"Le code d'accès a été désactivé\",\n  \"Passcode has been enabled\": \"Le code d'accès a été activé\",\n  \"Category has been deleted\": \"La catégorie a été supprimée\",\n  \"Are you sure you want to delete this category?\": \"Êtes-vous sûr de vouloir supprimer cette catégorie ?\",\n  \"Delete All Data\": \"Supprimer toutes les données\",\n  \"All data has been deleted\": \"Toutes les données ont été supprimées\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Les données supprimées ne peuvent pas être récupérées. Êtes-vous sûr de vouloir supprimer toutes les données ?\",\n  \"Select a currency\": \"Sélectionnez une devise\",\n  \"Category has been updated\": \"La catégorie a été mise à jour\",\n  \"Are you sure you want to delete this transaction?\": \"Êtes-vous sûr de vouloir supprimer cette transaction ?\",\n  \"Transaction has been deleted\": \"La transaction a été supprimée\",\n  \"Transaction has been updated\": \"La transaction a été mise à jour\",\n  \"Select a date format\": \"Sélectionnez un format de date\",\n  \"Date format\": \"Format de date\",\n  \"Date format has been updated\": \"Le format de date a été mis à jour\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/hi.json",
    "content": "{\n  \"Input\": \"इनपुट\",\n  \"Analysis\": \"विश्लेषण\",\n  \"Calendar\": \"कैलेंडर\",\n  \"Other\": \"अन्य\",\n  \"OtherIncome\": \"अन्य\",\n  \"OtherExpense\": \"अन्य\",\n  \"INCOME\": \"आय\",\n  \"EXPENSE\": \"व्यय\",\n  \"Amount\": \"पैसे की राशि\",\n  \"Description\": \"विवरण\",\n  \"Save\": \"सहेजें\",\n  \"Edit Category\": \"श्रेणी संपादित करें\",\n  \"Enter Category Name\": \"श्रेणी नाम दर्ज करें\",\n  \"Transport\": \"परिवहन\",\n  \"Fuel\": \"ईंधन\",\n  \"Parking\": \"पार्किंग\",\n  \"Services & Maintenance\": \"भरण पोषण\",\n  \"Taxi\": \"टैक्सी\",\n  \"Shopping\": \"खरीदारी\",\n  \"Accessories\": \"सामान\",\n  \"Electronic Devices\": \"उपकरण\",\n  \"Clothes\": \"वस्त्र\",\n  \"Footwear\": \"जूते\",\n  \"Entertainment\": \"मनोरंजन\",\n  \"Movies\": \"चलचित्र\",\n  \"Games\": \"खेल\",\n  \"Music\": \"संगीत\",\n  \"Travel\": \"यात्रा\",\n  \"Food & Beverages\": \"खाद्य और पेय पदार्थ\",\n  \"Beverages\": \"पेय\",\n  \"Food\": \"खाना\",\n  \"Daily Necessities\": \"परचून\",\n  \"Groceries\": \"परचून\",\n  \"Restaurant\": \"खाने की दुकान\",\n  \"Gifts & Donations\": \"उपहार और दान\",\n  \"Charity\": \"दान पुण्य\",\n  \"GiftsExpense\": \"उपहार\",\n  \"Funeral\": \"अंतिम संस्कार\",\n  \"Wedding\": \"शादी\",\n  \"Health\": \"स्वास्थ्य\",\n  \"Doctor\": \"चिकित्सक\",\n  \"Health Insurance\": \"स्वास्थ्य बीमा\",\n  \"Medicine\": \"दवा\",\n  \"Sports\": \"खेल\",\n  \"Home\": \"घर\",\n  \"Furnishings\": \"असबाब\",\n  \"Home Services\": \"होम सर्विसेज\",\n  \"Pets\": \"पालतू पशु\",\n  \"Mortgage & Rent\": \"किराया\",\n  \"Kids\": \"बच्चे\",\n  \"Pocket Money\": \"जेब खर्च\",\n  \"Baby Products\": \"छोटे उत्पाद\",\n  \"Babysitter & Daycare\": \"दाई और डे केयर\",\n  \"Tuition\": \"ट्यूशन\",\n  \"Personal Development\": \"व्यक्तिगत विकास\",\n  \"Education\": \"शिक्षा\",\n  \"Business\": \"व्यापार\",\n  \"InvestmentExpense\": \"निवेश\",\n  \"Utility Bills\": \"उपयोगिता बिल\",\n  \"Electricity\": \"बिजली\",\n  \"Internet\": \"इंटरनेट\",\n  \"Mobile Phone\": \"चल दूरभाष\",\n  \"Water\": \"पानी\",\n  \"Salary\": \"वेतन\",\n  \"Bonus\": \"बोनस\",\n  \"Side job\": \"अन्य नौकरी\",\n  \"GiftsIncome\": \"उपहार\",\n  \"InvestmentIncome\": \"निवेश\",\n  \"Income\": \"आय\",\n  \"Expense\": \"व्यय\",\n  \"Balance\": \"शेष\",\n  \"Today\": \"आज\",\n  \"This week\": \"इस सप्ताह\",\n  \"This month\": \"इस महीने\",\n  \"This year\": \"इस साल\",\n  \"This quarter\": \"इस तिमाही\",\n  \"Category\": \"वर्ग\",\n  \"TOTAL BALANCE\": \"कुल शेष\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\":   \"उन्नयन के विकल्प देखें\",\n  \"My Account\": \"मेरा खाता\",\n  \"General Settings\":  \"सामान्य सेटिंग्स\",\n  \"Language\": \"भाषा\",\n  \"Currency\": \"मुद्रा\",\n  \"Share Friends\": \"मित्र साझा करें\",\n  \"Rate App\": \"एप्प का मूल्यांकन\",\n  \"Feedback\": \"प्रतिपुष्टि\",\n  \"Add Expense Category\": \"व्यय श्रेणी जोड़ें\",\n  \"Add Income Category\": \"आय श्रेणी जोड़ें\",\n  \"Category name\": \"श्रेणी नाम\",\n  \"Parent category\": \"अभिभावक श्रेणी\",\n  \"Add\": \"जोड़ें\",\n  \"Game\": \"खेल\",\n  \"Edit\": \"संपादित करें\",\n  \"Select a date\": \"एक तारीख चुनें\",\n  \"CANCEL\": \"रद्द करना\",\n  \"OK\": \"ठीक है\",\n  \"There is no data\": \"कोई डेटा नहीं है\",\n  \"Select a language\": \"भाषा चुनें\",\n  \"Please fill a category name\": \"कृपया एक श्रेणी का नाम भरें\",\n  \"Delete\": \"हटाएं\",\n  \"Total Year Amount\": \"कुल वर्ष राशि\",\n  \"Report\": \"रिपोर्ट\",\n  \"Hi you\": \"हाय आप\",\n  \"All\": \"सब\",\n  \"Category already exists\": \"श्रेणी पहले से मौजूद है\",\n  \"Month\": \"महीना\",\n  \"2 weeks\": \"2 सप्ताह\",\n  \"Week\": \"सप्ताह\",\n  \"Since\": \"जबसे\",\n  \"Data has been saved\": \"डेटा सहेजा गया है\",\n  \"Choose Category\": \"श्रेणी का चयन करें\",\n  \"Done\": \"किया हुआ\",\n  \"Icons\": \"माउस\",\n  \"Please Confirm\": \"पुष्टि करना\",\n  \"Yes\": \"हां\",\n  \"No\": \"नहीं\",\n  \"Cancel\": \"रद्द करें\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"इस क्रिया को पूर्ववत नहीं किया जा सकता है। क्या आप वाकई सभी श्रेणियों को रीसेट करना चाहते हैं?\",\n  \"Reset\": \"रीसेट\",\n  \"Reset All Categories\": \"सभी श्रेणियों को रीसेट करें\",\n  \"Categories have been reset\": \"श्रेणियाँ रीसेट कर दी गई हैं\",\n  \"Enable Passcode\": \"पासकोड सक्षम करें\",\n  \"Please Enter Passcode\": \"कृपया पासकोड दर्ज करें\",\n  \"Please Re-enter Passcode\": \"कृपया पासकोड पुनः दर्ज करें\",\n  \"Passcode has been disabled\": \"पासकोड अक्षम कर दिया गया है\",\n  \"Passcode has been enabled\": \"पासकोड सक्षम किया गया है\",\n  \"Category has been deleted\": \"श्रेणी हटा दी गई है\",\n  \"Are you sure you want to delete this category?\": \"क्या आप वाकई इस श्रेणी को हटाना चाहते हैं?\",\n  \"Delete All Data\": \"सभी डेटा हटाएँ\",\n  \"All data has been deleted\": \"सभी डेटा हटा दिया गया है\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"हटाए गए डेटा को पुनर्प्राप्त नहीं किया जा सकता है। क्या आप वाकई सभी डेटा हटाना चाहते हैं?\",\n  \"Select a currency\": \"एक मुद्रा चुनें\",\n  \"Category has been updated\": \"श्रेणी अपडेट कर दी गई है\",\n  \"Are you sure you want to delete this transaction?\": \"क्या आप वाकई इस लेन-देन को हटाना चाहते हैं?\",\n  \"Transaction has been deleted\": \"लेन-देन हटा दिया गया है\",\n  \"Transaction has been updated\": \"लेन-देन अद्यतन किया गया है\",\n  \"Select a date format\": \"दिनांक प्रारूप का चयन करें\",\n  \"Date format\": \"डेटा प्रारूप\",\n  \"Date format has been updated\": \"दिनांक प्रारूप अपडेट किया गया है\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/ja.json",
    "content": "{\n  \"Input\": \"入力\",\n  \"Analysis\": \"分析\",\n  \"Calendar\": \"カレンダー\",\n  \"Other\": \"その他\",\n  \"OtherIncome\": \"その他\",\n  \"OtherExpense\": \"その他\",\n  \"INCOME\": \"所得\",\n  \"EXPENSE\": \"エクスペンス\",\n  \"Amount\": \"量\",\n  \"Description\": \"説明\",\n  \"Save\": \"セーブ\",\n  \"Edit Category\": \"カテゴリの編集\",\n  \"Enter Category Name\": \"カテゴリー名の入力\",\n  \"Transport\": \"交通手段\",\n  \"Fuel\": \"燃料\",\n  \"Parking\": \"パーキング\",\n  \"Services & Maintenance\": \"メンテナンス\",\n  \"Taxi\": \"タクシー\",\n  \"Shopping\": \" ショッピング\",\n  \"Accessories\": \"アクセサリー\",\n  \"Electronic Devices\": \"デバイス\",\n  \"Clothes\": \"服\",\n  \"Footwear\": \"履物\",\n  \"Entertainment\": \"エンターテインメント\",\n  \"Movies\": \"映画\",\n  \"Games\": \"ゲーム\",\n  \"Music\": \"音楽\",\n  \"Travel\": \"トラベル\",\n  \"Food & Beverages\": \"フード＆ビバレッジ\",\n  \"Beverages\": \"飲料\",\n  \"Food\": \"食物\",\n  \"Daily Necessities\": \"日用品\",\n  \"Groceries\": \"日用品\",\n  \"Restaurant\": \"レストラン\",\n  \"Gifts & Donations\": \"  ギフトと寄付\",\n  \"Charity\": \"チャリティー\",\n  \"GiftsExpense\": \"ギフト\",\n  \"Funeral\": \"葬儀\",\n  \"Wedding\": \"結婚式\",\n  \"Health\": \"健康\",\n  \"Doctor\": \"医師\",\n  \"Health Insurance\": \"健康保険\",\n  \"Medicine\": \"薬\",\n  \"Sports\": \"スポーツ\",\n  \"Home\": \"ホーム\",\n  \"Furnishings\": \"什器備品\",\n  \"Home Services\": \"サービス\",\n  \"Pets\": \"ペット\",\n  \"Mortgage & Rent\": \"レンタル\",\n  \"Kids\": \"キッズ\",\n  \"Pocket Money\": \"引当金\",\n  \"Baby Products\": \"ベビー製品\",\n  \"Babysitter & Daycare\": \"デイケア\",\n  \"Tuition\": \"授業料\",\n  \"Personal Development\": \"個人的な開発\",\n  \"Education\": \"教育\",\n  \"Business\": \"ビジネス\",\n  \"InvestmentExpense\": \"投資\",\n  \"Utility Bills\": \"水道光熱費\",\n  \"Electricity\": \"電気\",\n  \"Internet\": \"ネット\",\n  \"Mobile Phone\": \"携帯電話\",\n  \"Water\": \"水\",\n  \"Salary\": \"給料\",\n  \"Bonus\": \"ボーナス\",\n  \"Side job\": \"サイドジョブ\",\n  \"GiftsIncome\": \"ギフト\",\n  \"InvestmentIncome\": \"投資\",\n  \"Income\": \"所得\",\n  \"Expense\": \"エクスペンス\",\n  \"Balance\": \"残高\",\n  \"Today\": \"今日\",\n  \"This week\": \"今週\",\n  \"This month\": \"今月\",\n  \"This year\": \"今年\",\n  \"This quarter\": \"この四半期\",\n  \"Category\": \"カテゴリー\",\n  \"TOTAL BALANCE\": \"合計残高\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"アップグレードオプションを見る\",\n  \"My Account\": \"マイアカウント\",\n  \"General Settings\": \"設定\",\n  \"Language\": \"言語\",\n  \"Currency\": \"通貨\",\n  \"Share Friends\": \"友達を共有し\",\n  \"Rate App\": \"アプリの評価\",\n  \"Feedback\": \"フィードバック\",\n  \"Add Expense Category\": \"経費カテゴリを追加し\",\n  \"Add Income Category\": \"収入カテゴリーの追加\",\n  \"Category name\": \"種別名\",\n  \"Parent category\": \"親カテゴリ\",\n  \"Add\": \"追加\",\n  \"Game\": \"ゲーム\",\n  \"Edit\": \"編集\",\n  \"Select a date\": \"日付を選択し\",\n  \"CANCEL\": \"キャンセル\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"データが存在しません\",\n  \"Select a language\": \"言語を選択し\",\n  \"Please fill a category name\": \"カテゴリー名を入力してください\",\n  \"Delete\": \"削除\",\n  \"Total Year Amount\": \"合計年額\",\n  \"Report\": \"報告書\",\n  \"Hi you\": \"こんにちは\",\n  \"All\": \"すべて\",\n  \"Category already exists\": \"カテゴリーはすでに存在しています\",\n  \"Month\": \"月の話\",\n  \"2 weeks\": \"2週間\",\n  \"Week\": \"週\",\n  \"Since\": \"以来\",\n  \"Data has been saved\": \"データが保存されている\",\n  \"Choose Category\": \"カテゴリを選択し\",\n  \"Done\": \"終わり\",\n  \"Icons\": \"アイコン\",\n  \"Please Confirm\": \"確認\",\n  \"Yes\": \"はい\",\n  \"No\": \"番号\",\n  \"Cancel\": \"キャンセル\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"このアクションは元に戻せません。 すべてのカテゴリをリセットしてもよろしいですか？\",\n  \"Reset\": \"リセット\",\n  \"Reset All Categories\": \"すべてのカテゴリをリセット\",\n  \"Categories have been reset\": \"カテゴリがリセットされました\",\n  \"Enable Passcode\": \"パスコードを有効にし\",\n  \"Please Enter Passcode\": \"パスコードを入力してください\",\n  \"Please Re-enter Passcode\": \"パスコードを再入力してください\",\n  \"Passcode has been disabled\": \"パスコードが無効になっています\",\n  \"Passcode has been enabled\": \"パスコードが有効になっています\",\n  \"Category has been deleted\": \"カテゴリが削除されました\",\n  \"Are you sure you want to delete this category?\": \"このカテゴリを削除してもよろしいですか？\",\n  \"Delete All Data\": \"すべてのデータを削除し\",\n  \"All data has been deleted\": \"すべてのデータが削除されました\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"削除したデータは復元できません。 すべてのデータを削除してもよろしいですか？\",\n  \"Select a currency\": \"通貨を選択してください\",\n  \"Category has been updated\": \"カテゴリーが更新されました\",\n  \"Are you sure you want to delete this transaction?\": \"このトランザクションを削除してよろしいですか？\",\n  \"Transaction has been deleted\": \"トランザクションが削除されました\",\n  \"Transaction has been updated\": \"トランザクションが更新されました\",\n  \"Select a date format\": \"日付形式を選択します\",\n  \"Date format\": \"日付形式を選択します\",\n  \"Date format has been updated\": \"日付形式が更新されました\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/ko.json",
    "content": "{\n  \"Input\": \"입력\",\n  \"Analysis\": \"분석\",\n  \"Calendar\": \"달력\",\n  \"Other\": \"다른\",\n  \"OtherIncome\": \"다른\",\n  \"OtherExpense\": \"다른\",\n  \"INCOME\": \"수입\",\n  \"EXPENSE\": \"비용\",\n  \"Amount\": \"양\",\n  \"Description\": \"노트\",\n  \"Save\": \"저장\",\n  \"Edit Category\": \"카테고리 편집\",\n  \"Enter Category Name\": \" 카테고리 이름 입력\",\n  \"Transport\": \"수송\",\n  \"Fuel\": \"연료\",\n  \"Parking\": \"주차\",\n  \"Services & Maintenance\": \"서비스 및 유지 관리\",\n  \"Taxi\": \"택시\",\n  \"Shopping\": \"쇼핑\",\n  \"Accessories\": \"부속품\",\n  \"Electronic Devices\": \"전자 장치\",\n  \"Clothes\": \"천\",\n  \"Footwear\": \"신발류\",\n  \"Entertainment\": \"환대\",\n  \"Movies\": \"영화 산업\",\n  \"Games\": \"경기\",\n  \"Music\": \"음악\",\n  \"Travel\": \"여행\",\n  \"Food & Beverages\": \"식음료\",\n  \"Beverages\": \"음료수\",\n  \"Food\": \"음식\",\n  \"Daily Necessities\": \"일 용품\",\n  \"Groceries\": \"일 용품\",\n  \"Restaurant\": \"레스토랑\",\n  \"Gifts & Donations\": \" 선물 및 기부\",\n  \"Charity\": \"자선 단체\",\n  \"GiftsExpense\": \"선물\",\n  \"Funeral\": \"장례\",\n  \"Wedding\": \"혼례\",\n  \"Health\": \"건강\",\n  \"Doctor\": \"박사님\",\n  \"Health Insurance\": \"건강 보험\",\n  \"Medicine\": \"약\",\n  \"Sports\": \"스포츠\",\n  \"Home\": \"집\",\n  \"Furnishings\": \"가구\",\n  \"Home Services\": \"홈 서비스\",\n  \"Pets\": \"애완 동물\",\n  \"Mortgage & Rent\": \"모기지 및 렌탈\",\n  \"Kids\": \"키즈\",\n  \"Pocket Money\": \"포켓 돈\",\n  \"Baby Products\": \"아기 제품\",\n  \"Babysitter & Daycare\": \"베이비 시터 및 보육\",\n  \"Tuition\": \"수업료\",\n  \"Personal Development\": \" 개인 개발\",\n  \"Education\": \"교육\",\n  \"Business\": \"사업\",\n  \"InvestmentExpense\": \"투자\",\n  \"Utility Bills\": \"공공 요금\",\n  \"Electricity\": \"전기\",\n  \"Internet\": \"인터넷\",\n  \"Mobile Phone\": \"휴대폰\",\n  \"Water\": \"물\",\n  \"Salary\": \"봉급\",\n  \"Bonus\": \"보너스\",\n  \"Side job\": \"부업\",\n  \"GiftsIncome\": \"선물\",\n  \"InvestmentIncome\": \"투자\",\n  \"Income\": \"수입\",\n  \"Expense\": \"비용\",\n  \"Balance\": \"균형\",\n  \"Today\": \"오늘\",\n  \"This week\": \"이번 주\",\n  \"This month\": \"이번 달\",\n  \"This year\": \"올해\",\n  \"This quarter\": \"이번 분기에\",\n  \"Category\": \"범주\",\n  \"TOTAL BALANCE\": \"전체 균형\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"업그레이드 옵션보기\",\n  \"My Account\": \"내 계정\",\n  \"General Settings\": \"설정\",\n  \"Language\": \"언어\",\n  \"Currency\": \"통화\",\n  \"Share Friends\": \"친구 공유\",\n  \"Rate App\": \"앱 평가\",\n  \"Feedback\": \"피드백\",\n  \"Add Expense Category\": \"비용 범주 추가\",\n  \"Add Income Category\": \"소득 범주 추가\",\n  \"Category name\": \"카테고리 이름\",\n  \"Parent category\": \"상위 카테고리\",\n  \"Add\": \"더하다\",\n  \"Game\": \"경기\",\n  \"Edit\": \"편집하다\",\n  \"Select a date\": \"날짜를 선택하고\",\n  \"CANCEL\": \"취소\",\n  \"OK\": \"확인\",\n  \"There is no data\": \"데이터가 없습니다\",\n  \"Select a language\": \"언어를 선택하고\",\n  \"Please fill a category name\": \"카테고리 이름을 입력하세요\",\n  \"Delete\": \"지우다\",\n  \"Total Year Amount\": \"총 연도 금액\",\n  \"Report\": \"신고\",\n  \"Hi you\": \"안녕하세요\",\n  \"All\": \"모두\",\n  \"Category already exists\": \"카테고리가 이미 존재합니다\",\n  \"Month\": \"달\",\n  \"2 weeks\": \"이주\",\n  \"Week\": \"주\",\n  \"Since\": \"이후\",\n  \"Data has been saved\": \"데이터가 저장되었습니다\",\n  \"Choose Category\": \"카테고리를 선택하고\",\n  \"Done\": \"완료\",\n  \"Icons\": \"아이콘\",\n  \"Please Confirm\": \"확인하다\",\n  \"Yes\": \"예\",\n  \"No\": \"아니요\",\n  \"Cancel\": \"취소\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"이 작업은 취소할 수 없습니다. 모든 카테고리를 재설정하시겠습니까?\",\n  \"Reset\": \"초기화\",\n  \"Reset All Categories\": \"모든 카테고리 재설정\",\n  \"Categories have been reset\": \"카테고리가 재설정되었습니다\",\n  \"Enable Passcode\": \"암호 활성화\",\n  \"Please Enter Passcode\": \"비밀번호를 입력하세요\",\n  \"Please Re-enter Passcode\": \"비밀번호를 다시 입력하세요\",\n  \"Passcode has been disabled\": \"비밀번호가 비활성화되었습니다\",\n  \"Passcode has been enabled\": \"암호가 활성화되었습니다\",\n  \"Category has been deleted\": \"카테고리가 삭제되었습니다\",\n  \"Are you sure you want to delete this category?\": \"이 카테고리를 삭제하시겠습니까?\",\n  \"Delete All Data\": \"모든 데이터 삭제\",\n  \"All data has been deleted\": \"모든 데이터가 삭제되었으며\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"삭제된 데이터는 복구할 수 없습니다. 모든 데이터를 삭제하시겠습니까?\",\n  \"Select a currency\": \"통화 선택\",\n  \"Category has been updated\": \"카테고리가 업데이트되었습니다\",\n  \"Are you sure you want to delete this transaction?\": \"이 거래를 삭제하시겠습니까?\",\n  \"Transaction has been deleted\": \"거래가 삭제되었습니다\",\n  \"Transaction has been updated\": \"거래가 업데이트되었습니다\",\n  \"Select a date format\": \"날짜 형식을 선택하고\",\n  \"Date format\": \"날짜 형식\",\n  \"Date format has been updated\": \"날짜 형식이 업데이트되었습니다\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/ne.json",
    "content": "{\n  \"Input\": \"थप्नुहोस्\",\n  \"Analysis\": \"विश्लेषण\",\n  \"Calendar\": \"पात्रो\",\n  \"Other\": \"अन्य\",\n  \"OtherIncome\": \"अन्य\",\n  \"OtherExpense\": \"अन्य\",\n  \"INCOME\": \"आम्दान\",\n  \"EXPENSE\": \"खर्च\",\n  \"Amount\": \"रकम\",\n  \"Description\": \"विवरण\",\n  \"Save\": \"सुरक्षित गर्नुहोस्\",\n  \"Edit Category\": \"कोटीहरू सम्पादन गर्नुहोस्\",\n  \"Enter Category Name\": \"कोटीको नाम प्रविष्ट गर्नुहोस्\",\n  \"Transport\": \"यातायात\",\n  \"Fuel\": \"ईंधन\",\n  \"Parking\": \"पार्किङ\",\n  \"Services & Maintenance\": \"सेवा र रखरखाव\",\n  \"Taxi\": \"ट्याक्सी\",\n  \"Shopping\": \"खरीददारी\",\n  \"Accessories\": \"सामानहरू\",\n  \"Electronic Devices\": \"इलेक्ट्रोनिक यन्त्रहरू\",\n  \"Clothes\": \"कपडा\",\n  \"Footwear\": \"पर्खा\",\n  \"Entertainment\": \"मनोरञ्जन\",\n  \"Movies\": \"चलचित्र\",\n  \"Games\": \"खेलहरू\",\n  \"Music\": \"सङ्गीत\",\n  \"Travel\": \"यात्रा\",\n  \"Food & Beverages\": \"खाद्य र पेयपन\",\n  \"Beverages\": \"पेयपनहरू\",\n  \"Food\": \"खाद्य\",\n  \"Daily Necessities\": \"दैनिक आवश्यकता\",\n  \"Groceries\": \"किराना\",\n  \"Restaurant\": \"भोजनगृह\",\n  \"Gifts & Donations\": \"उपहार र दान\",\n  \"Charity\": \"चारिटी\",\n  \"GiftsExpense\": \"उपहार\",\n  \"Funeral\": \"अन्त्येष्टि\",\n  \"Wedding\": \"बिवाह\",\n  \"Health\": \"स्वास्थ्य\",\n  \"Doctor\": \"डाक्टर\",\n  \"Health Insurance\": \"स्वास्थ्य बीमा\",\n  \"Medicine\": \"औषधि\",\n  \"Sports\": \"खेलकुद\",\n  \"Home\": \"घर\",\n  \"Furnishings\": \"फर्निचर\",\n  \"Home Services\": \"घर सेवा\",\n  \"Pets\": \"पाल्टु\",\n  \"Mortgage & Rent\": \"मोर्ट्गेज र ठेगाना\",\n  \"Kids\": \"बच्चाहरू\",\n  \"Pocket Money\": \"किस्ता\",\n  \"Baby Products\": \"बच्चाका सामानहरू\",\n  \"Babysitter & Daycare\": \"बेबीसिटर र डेकेयर\",\n  \"Tuition\": \"पढाइ\",\n  \"Personal Development\": \"व्यक्तिगत विकास\",\n  \"Education\": \"शिक्षा\",\n  \"Business\": \"व्यापार\",\n  \"InvestmentExpense\": \"बिनिवेस्टमेन्ट\",\n  \"Utility Bills\": \"यूटिलिटी बिल\",\n  \"Electricity\": \"बिजुली\",\n  \"Internet\": \"इन्टरनेट\",\n  \"Mobile Phone\": \"मोबाइल फोन\",\n  \"Water\": \"पानी\",\n  \"Salary\": \"तलब\",\n  \"Bonus\": \"बोनस\",\n  \"Side job\": \"पर्खाउ काम\",\n  \"GiftsIncome\": \"उपहार\",\n  \"InvestmentIncome\": \"बिनिवेस्टमेन्ट\",\n  \"Income\": \"आम्दान\",\n  \"Expense\": \"खर्च\",\n  \"Balance\": \"तलब\",\n  \"Today\": \"आज\",\n  \"This week\": \"यो हप्ता\",\n  \"This month\": \"यो महिना\",\n  \"This year\": \"यो वर्ष\",\n  \"This quarter\": \"यो तिमाही\",\n  \"Category\": \"कोटी\",\n  \"TOTAL BALANCE\": \"कुल तलब\",\n  \"Nguyen Hoa\": \"न्गुयेन होआ\",\n  \"VIEW UPGRADE OPTIONS\": \"अपग्रेड विकल्पहरू हेर्नुहोस्\",\n  \"My Account\": \"मेरो खाता\",\n  \"General Settings\": \"सामान्य सेटिङ\",\n  \"Language\": \"भाषा\",\n  \"Currency\": \"मुद्रा\",\n  \"Share Friends\": \"साथीहरूसँग साझा गर्नुहोस्\",\n  \"Rate App\": \"एप्लिकेशन मूल्यांकन गर्नुहोस्\",\n  \"Feedback\": \"प्रतिक्रिया\",\n  \"Add Expense Category\": \"खर्च कोटी थप्नुहोस्\",\n  \"Category name\": \"कोटीको नाम\",\n  \"Parent category\": \"मुख्य कोटी\",\n  \"Add\": \"थप्नुहोस्\",\n  \"Game\": \"खेल\",\n  \"Edit\": \"सम्पादन गर्नुहोस्\",\n  \"Select a date\": \"मिति चयन गर्नुहोस्\",\n  \"CANCEL\": \"रद्द गर्नुहोस्\",\n  \"OK\": \"ठिक छ\",\n  \"There is no data\": \"डेटा छैन\",\n  \"Select a language\": \"भाषा चयन गर्नुहोस्\",\n  \"Please fill a category name\": \"कृपया कोटीको नाम भर्नुहोस्\",\n  \"Delete\": \"मेटाउनुहोस्\",\n  \"Total Year Amount\": \"कुल वर्ष रकम\",\n  \"Report\": \"प्रतिवेदन\",\n  \"Add Income Category\": \"आम्दान कोटी थप्नुहोस्\",\n  \"Hi you\": \"नमस्ते तपाईं\",\n  \"All\": \"सबै\",\n  \"Category already exists\": \"कोटी पहिले नै अवस्थित छ\",\n  \"Month\": \"महिना\",\n  \"2 weeks\": \"2 हप्ता\",\n  \"Week\": \"हप्ता\",\n  \"Since\": \"बाट\",\n  \"Data has been saved\": \"डेटा सुरक्षित गरिएको छ\",\n  \"Choose Category\": \"कोटी छनौट गर्नुहोस्\",\n  \"Done\": \"गरिएको\",\n  \"Icons\": \"प्रतिष्ठानहरू\",\n  \"Please Confirm\": \"कृपया पुष्टि गर्नुहोस्\",\n  \"Yes\": \"हो\",\n  \"No\": \"होइन\",\n  \"Cancel\": \"रद्द गर्नुहोस्\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"यस क्रियालाई पूर्वनिर्धारण गर्न सकिन्छैन। के तपाईं सबै कोटीहरू रिसेट गर्न चाहनुहुन्छ?\",\n  \"Reset\": \"रिसेट गर्नुहोस्\",\n  \"Reset All Categories\": \"सबै कोटीहरू रिसेट गर्नुहोस्\",\n  \"Categories have been reset\": \"कोटीहरू रिसेट भएका छन्\",\n  \"Enable Passcode\": \"पासकोड सक्षम गर्नुहोस्\",\n  \"Please Enter Passcode\": \"कृपया पासकोड प्रविष्ट गर्नुहोस्\",\n  \"Please Re-enter Passcode\": \"कृपया पासकोड पुन: प्रविष्ट गर्नुहोस्\",\n  \"Passcode has been disabled\": \"पासकोड अक्षम भएको छ\",\n  \"Passcode has been enabled\": \"पासकोड सक्षम भएको छ\",\n  \"Category has been deleted\": \"कोटी मेटाईएको छ\",\n  \"Are you sure you want to delete this category?\": \"के तपाईं यो कोटी मेटाउन चाहनुहुन्छ?\",\n  \"Delete All Data\": \"सबै डेटा मेटाउनुहोस्\",\n  \"All data has been deleted\": \"सबै डेटा मेटाईएको छ\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"मेटिएको डेटा पुनःप्राप्त गर्न सकिन्छैन। के तपाईं सबै डेटा मेटाउन चाहनुहुन्छ?\",\n  \"Select a currency\": \"मुद्रा चयन गर्नुहोस्\",\n  \"Category has been updated\": \"कोटी अद्यावधिक गरिएको छ\",\n  \"Are you sure you want to delete this transaction?\": \"के तपाईं यो लेनदेन मेटाउन चाहनुहुन्छ?\",\n  \"Transaction has been deleted\": \"लेनदेन मेटाईएको छ\",\n  \"Transaction has been updated\": \"लेनदेन अद्यावधिक गरिएको छ\",\n  \"Select a date format\": \"मिति ढाँचा चयन गर्नुहोस्\",\n  \"Date format\": \"मिति ढाँचा\",\n  \"Date format has been updated\": \"मिति ढाँचा अद्यावधिक गरिएको छ\"\n}"
  },
  {
    "path": "lib/project/localization/lang/pt.json",
    "content": "{\n  \"Input\": \"Entrada\",\n  \"Analysis\": \"Análise\",\n  \"Calendar\": \"Calendário\",\n  \"Other\": \"Outro\",\n  \"OtherIncome\": \"Outro\",\n  \"OtherExpense\": \"Outro\",\n  \"INCOME\": \"RENDA\",\n  \"EXPENSE\": \"DESPESA\",\n  \"Amount\": \"Quantia\",\n  \"Description\": \"Descrição\",\n  \"Save\": \"Salve\",\n  \"Edit Category\": \"Editar categoria\",\n  \"Enter Category Name\": \"Digite o nome da categoria\",\n  \"Transport\": \"transporte\",\n  \"Fuel\": \"Combustível\",\n  \"Parking\": \"Estacionamento\",\n  \"Services & Maintenance\": \"Serviços e manutenção\",\n  \"Taxi\": \"Táxi\",\n  \"Shopping\": \"Compras\",\n  \"Accessories\": \"Acessórios\",\n  \"Electronic Devices\": \"Dispositivos eletrônicos\",\n  \"Clothes\": \"Roupas\",\n  \"Footwear\": \"Calçados\",\n  \"Entertainment\": \"Entretenimento\",\n  \"Movies\": \"Filmes\",\n  \"Games\": \"Jogos\",\n  \"Music\": \"Música\",\n  \"Travel\": \"Viagem\",\n  \"Food & Beverages\": \"Alimentos e bebidas\",\n  \"Beverages\": \"bebidas\",\n  \"Food\": \"Comida\",\n  \"Daily Necessities\": \"Necessividades diárias\",\n  \"Groceries\": \"Necessividades diárias\",\n  \"Restaurant\": \"Restaurante\",\n  \"Gifts & Donations\": \"Presentes e doações\",\n  \"Charity\": \"Caridade\",\n  \"GiftsExpense\": \"Presentes\",\n  \"Funeral\": \"Funeral\",\n  \"Wedding\": \"Casamento\",\n  \"Health\": \"Saúde\",\n  \"Doctor\": \"Doutora\",\n  \"Health Insurance\": \"Seguros de saúde\",\n  \"Medicine\": \"medicina\",\n  \"Sports\": \"Esportes\",\n  \"Home\": \"Casa\",\n  \"Furnishings\": \"Mobiliário\",\n  \"Home Services\": \"Serviços ao domicílio\",\n  \"Pets\": \"Animais de estimação\",\n  \"Mortgage & Rent\": \"Hipoteca e aluguel\",\n  \"Kids\": \"Crianças\",\n  \"Pocket Money\": \"Mesada\",\n  \"Baby Products\": \"Produtos para bebés\",\n  \"Babysitter & Daycare\": \"Babá e creche\",\n  \"Tuition\": \"Aulas\",\n  \"Personal Development\": \"crescimento pessoal\",\n  \"Education\": \"Educação\",\n  \"Business\": \"Negócios\",\n  \"InvestmentExpense\": \"Investimento\",\n  \"Utility Bills\": \"Facturas de utilidade\",\n  \"Electricity\": \"Eletricidade\",\n  \"Internet\": \"Internet\",\n  \"Mobile Phone\": \"Celular\",\n  \"Water\": \"Água\",\n  \"Salary\": \"Salário\",\n  \"Bonus\": \"Bônus\",\n  \"Side job\": \"Trabalho lateral\",\n  \"GiftsIncome\": \"Presentes\",\n  \"InvestmentIncome\": \"Investimento\",\n  \"Income\": \"Renda\",\n  \"Expense\": \"Despesa\",\n  \"Balance\": \"Balanço\",\n  \"Today\": \"Hoje\",\n  \"This week\": \"Essa semana\",\n  \"This month\": \"Este mês\",\n  \"This year\": \"Este ano\",\n  \"This quarter\": \"Este trimestre\",\n  \"Category\": \"Categoria\",\n  \"TOTAL BALANCE\": \"BALANÇO TOTAL\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"VER OPÇÕES DE UPGRADE\",\n  \"My Account\": \"Minha conta\",\n  \"General Settings\": \"Configurações Gerais\",\n  \"Language\": \"Idioma\",\n  \"Currency\": \"Moeda\",\n  \"Share Friends\": \"Compartilhar amigos\",\n  \"Rate App\": \"Aplicativo de taxa\",\n  \"Feedback\": \"Feedback\",\n  \"Add Expense Category\": \"Adicionar categoria de despesas\",\n  \"Add Income Category\": \"Adicionar categoria de rendimentos\",\n  \"Category name\": \"Nome da categoria\",\n  \"Parent category\": \"Categoria dos pais\",\n  \"Add\": \"Acrescentar\",\n  \"Game\": \"Jogo\",\n  \"Edit\": \"Editar\",\n  \"Select a date\": \"Seleccione uma data\",\n  \"CANCEL\": \"CANCELAM\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"Não há dados\",\n  \"Select a language\": \"Seleccione uma língu\",\n  \"Please fill a category name\": \"Por favor, preencha um nome de categoria\",\n  \"Delete\": \"Eliminar\",\n  \"Total Year Amount\": \"Montante Total do Ano\",\n  \"Report\": \"Relatório\",\n  \"Hi you\": \"Oi vc\",\n  \"All\": \"Tudo\",\n  \"Category already exists\": \"A categoria já existe\",\n  \"Month\": \"Mês\",\n  \"2 weeks\": \"2 semanas\",\n  \"Week\": \"Semana\",\n  \"Since\": \"Desde\",\n  \"Data has been saved\": \"Os dados foram guardados\",\n  \"Choose Category\": \"Escolha a Categoria\",\n  \"Done\": \"Feito\",\n  \"Icons\": \"Ícones\",\n  \"Please Confirm\": \"Confirmar\",\n  \"Yes\": \"Sim\",\n  \"No\": \"Não\",\n  \"Cancel\": \"Cancelar\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Esta acção não pode ser desfeita. Tem a certeza de que quer redefinir todas as categorias?\",\n  \"Reset\": \"Reinicializar\",\n  \"Reset All Categories\": \"Repor todas as categorias\",\n  \"Categories have been reset\": \"As categorias foram repostas\",\n  \"Enable Passcode\": \"Habilite a senha\",\n  \"Please Enter Passcode\": \"Por favor, introduza o código de acesso\",\n  \"Please Re-enter Passcode\": \"Por favor, introduza novamente o código de acesso\",\n  \"Passcode has been disabled\": \"O código de acesso foi desactivado\",\n  \"Passcode has been enabled\": \"O código de acesso foi activado\",\n  \"Category has been deleted\": \"A categoria foi eliminada\",\n  \"Are you sure you want to delete this category?\": \"Tem a certeza de que quer eliminar esta categoria?\",\n  \"Delete All Data\": \"Apagar todos os dados\",\n  \"All data has been deleted\": \"Todos os dados foram apagados\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Os dados apagados não podem ser recuperados. Tem a certeza de que quer apagar todos os dados?\",\n  \"Select a currency\": \"Seleccione uma moeda\",\n  \"Category has been updated\": \"A categoria foi actualizada\",\n  \"Are you sure you want to delete this transaction?\": \"Tem a certeza de querer apagar esta transacção?\",\n  \"Transaction has been deleted\": \"A transacção foi eliminada\",\n  \"Transaction has been updated\": \"A transacção foi actualizada\",\n  \"Select a date format\": \"Seleccionar um formato de data\",\n  \"Date format\": \"Formato da data\",\n  \"Date format has been updated\": \"O formato da data foi actualizado\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/ru.json",
    "content": "{\n  \"Input\": \"Вход\",\n  \"Analysis\": \"Анализ\",\n  \"Calendar\": \"Календарь\",\n  \"Other\": \"Другой\",\n  \"OtherIncome\": \"Другой\",\n  \"OtherExpense\": \"Другой\",\n  \"INCOME\": \"ДОХОД\",\n  \"EXPENSE\": \"РАСХОДЫ\",\n  \"Amount\": \"Количество\",\n  \"Description\": \"Описание\",\n  \"Save\": \"Сохранить\",\n  \"Edit Category\": \"Категория редактирования\",\n  \"Enter Category Name\": \"Введите название категории\",\n  \"Transport\": \"Транспорт\",\n  \"Fuel\": \"Топливо\",\n  \"Parking\": \"Стоянка\",\n  \"Services & Maintenance\": \"Обслуживание\",\n  \"Taxi\": \"Такси\",\n  \"Shopping\": \"Покупка товаров\",\n  \"Accessories\": \"Аксессуары\",\n  \"Electronic Devices\": \" Устройства\",\n  \"Clothes\": \"Одежда\",\n  \"Footwear\": \"Обувь\",\n  \"Entertainment\": \"Развлечение\",\n  \"Movies\": \"Фильмы\",\n  \"Games\": \"Игры\",\n  \"Music\": \"Музыка\",\n  \"Travel\": \"Путешествовать\",\n  \"Food & Beverages\": \"Еда и напитки\",\n  \"Beverages\": \"напитки\",\n  \"Food\": \"Еда\",\n  \"Daily Necessities\": \"Ежедневные нужды\",\n  \"Groceries\": \"Ежедневные нужды\",\n  \"Restaurant\": \"Ресторан\",\n  \"Gifts & Donations\": \"События\",\n  \"Charity\": \"Благотворительность\",\n  \"GiftsExpense\": \"Подарки\",\n  \"Funeral\": \"Похороны\",\n  \"Wedding\": \"Свадьба\",\n  \"Health\": \"Здоровье\",\n  \"Doctor\": \"Врач\",\n  \"Health Insurance\": \"страхование здоровья\",\n  \"Medicine\": \"Лекарство\",\n  \"Sports\": \"Спортивный\",\n  \"Home\": \"Дома\",\n  \"Furnishings\": \"Мебель\",\n  \"Home Services\": \"Домашние услуги\",\n  \"Pets\": \"Домашние питомцы\",\n  \"Mortgage & Rent\": \"Ипотека и аренда\",\n  \"Kids\": \"Дети\",\n  \"Pocket Money\": \"Карманные деньги\",\n  \"Baby Products\": \"Детские товары\",\n  \"Babysitter & Daycare\": \"Няня и детский сад\",\n  \"Tuition\": \"Плата за обучение\",\n  \"Personal Development\": \"Личное развитие\",\n  \"Education\": \"Образование\",\n  \"Business\": \"Бизнес\",\n  \"InvestmentExpense\": \"Инвестиции\",\n  \"Utility Bills\": \"Счета\",\n  \"Electricity\": \"Электричество\",\n  \"Internet\": \"Интернет\",\n  \"Mobile Phone\": \"Мобильный телефон\",\n  \"Water\": \"Вода\",\n  \"Salary\": \"Зарплата\",\n  \"Bonus\": \"Бонус\",\n  \"Side job\": \"Боковая работа\",\n  \"GiftsIncome\": \"Подарки\",\n  \"InvestmentIncome\": \"Инвестиции\",\n  \"Income\": \"Доход\",\n  \"Expense\": \"Расходы\",\n  \"Balance\": \"баланс\",\n  \"Today\": \"Сегодня\",\n  \"This week\": \"На этой неделе\",\n  \"This month\": \"Этот месяц\",\n  \"This year\": \"Этот год\",\n  \"This quarter\": \"Этот квартал\",\n  \"Category\": \"Категория\",\n  \"TOTAL BALANCE\": \"ИТОГОВЫЙ БАЛАНС\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"Просмотр вариантов обновления\",\n  \"My Account\": \"Мой счет\",\n  \"General Settings\": \"Общие настройки\",\n  \"Language\": \"Язык\",\n  \"Currency\": \"Валюта\",\n  \"Share Friends\": \"Поделиться друзьями\",\n  \"Rate App\": \"Оценить приложение\",\n  \"Feedback\": \"Обратная связь\",\n  \"Add Expense Category\": \"Добавить категорию расходов\",\n  \"Add Income Category\": \"Добавить категорию дохода\",\n  \"Category name\": \"Название категории\",\n  \"Parent category\": \"Родительская категория\",\n  \"Add\": \"Добавить\",\n  \"Game\": \"Игра\",\n  \"Edit\": \"Изменить\",\n  \"Select a date\": \"Выбрать дату\",\n  \"CANCEL\": \"ОТМЕНИТЬ\",\n  \"OK\": \"OK\",\n  \"There is no data\": \"Нет данных\",\n  \"Select a language\": \"Выберите язык\",\n  \"Please fill a category name\": \"Пожалуйста, введите название категории\",\n  \"Delete\": \"Удалить\",\n  \"Total Year Amount\": \"Общая сумма за год\",\n  \"Report\": \"Отчет\",\n  \"Hi you\": \"Привет\",\n  \"All\": \"Все\",\n  \"Category already exists\": \"Категория уже существует\",\n  \"Month\": \"Месяц\",\n  \"2 weeks\": \"2 недели\",\n  \"Week\": \"Неделя\",\n  \"Since\": \"С\",\n  \"Data has been saved\": \"Данные сохранены\",\n  \"Choose Category\": \"Выберите категорию\",\n  \"Done\": \"Готово\",\n  \"Icons\": \"Иконки\",\n  \"Please Confirm\": \"Подтвердите\",\n  \"Yes\": \"Да\",\n  \"No\": \"Нет\",\n  \"Cancel\": \"Отменить\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Это действие нельзя отменить. Вы уверены, что хотите сбросить все категории?\",\n  \"Reset\": \"Сброс\",\n  \"Reset All Categories\": \"Сбросить все категории\",\n  \"Categories have been reset\": \"Категории были сброшены\",\n  \"Enable Passcode\": \"Включить пароль\",\n  \"Please Enter Passcode\": \"Пожалуйста, введите пароль\",\n  \"Please Re-enter Passcode\": \"Пожалуйста, введите пароль заново\",\n  \"Passcode has been disabled\": \"Пасскод был отключен\",\n  \"Passcode has been enabled\": \"Пасскод был включен\",\n  \"Category has been deleted\": \"Категория была удалена\",\n  \"Are you sure you want to delete this category?\": \"Вы уверены, что хотите удалить эту категорию?\",\n  \"Delete All Data\": \"Удалить все данные\",\n  \"All data has been deleted\": \"Все данные были удалены\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Удаленные данные не могут быть восстановлены. Вы уверены, что хотите удалить все данные?\",\n  \"Select a currency\": \"Выберите валюту\",\n  \"Category has been updated\": \"Категория была обновлена\",\n  \"Are you sure you want to delete this transaction?\": \"Вы уверены, что хотите удалить эту транзакцию?\",\n  \"Transaction has been deleted\": \"Транзакция была удалена\",\n  \"Transaction has been updated\": \"Транзакция была обновлена\",\n  \"Select a date format\": \"Выберите формат даты\",\n  \"Date format\": \"Формат даты\",\n  \"Date format has been updated\": \"Формат даты был обновлен\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/tr.json",
    "content": "{\n  \"Input\": \"Giriş\",\n  \"Analysis\": \"Analiz\",\n  \"Calendar\": \"Takvim\",\n  \"Other\": \"Diğer\",\n  \"OtherIncome\": \"Diğer\",\n  \"OtherExpense\": \"Diğer\",\n  \"INCOME\": \"GELİR\",\n  \"EXPENSE\": \"GİDER\",\n  \"Amount\": \"Miktar\",\n  \"Description\": \"Tanım\",\n  \"Save\": \"kurtarmak\",\n  \"Edit Category\": \"Kategoriyi düzenle\",\n  \"Enter Category Name\": \"Kategori adını girin\",\n  \"Transport\": \"Ulaşım\",\n  \"Fuel\": \"Yakıt\",\n  \"Parking\": \"Otopark\",\n  \"Services & Maintenance\": \"Hizmetler ve Bakım\",\n  \"Taxi\": \"Taksi\",\n  \"Shopping\": \"Alışveriş yapmak\",\n  \"Accessories\": \"Aksesuarlar\",\n  \"Electronic Devices\": \"Elektronik aletler\",\n  \"Clothes\": \"Giysi\",\n  \"Footwear\": \"Ayakkabı\",\n  \"Entertainment\": \"Eğlence\",\n  \"Movies\": \"Filmler\",\n  \"Games\": \"Oyunlar\",\n  \"Music\": \"Müzik\",\n  \"Travel\": \"Seyahat\",\n  \"Food & Beverages\": \"Yiyecek ve İçecekler\",\n  \"Beverages\": \"içecekler\",\n  \"Food\": \"Gıda\",\n  \"Daily Necessities\": \"Günlük ihtiyaçlar\",\n  \"Groceries\": \"Günlük ihtiyaçlar\",\n  \"Restaurant\": \"Restoran\",\n  \"Gifts & Donations\": \"Hediyeler ve Bağışlar\",\n  \"Charity\": \"Hayırseverlik\",\n  \"GiftsExpense\": \"Hediyeler\",\n  \"Funeral\": \"Cenaze\",\n  \"Wedding\": \"Düğün\",\n  \"Health\": \"Sağlık\",\n  \"Doctor\": \"Doktor\",\n  \"Health Insurance\": \"Sağlık Sigortası\",\n  \"Medicine\": \"İlaç\",\n  \"Sports\": \"Spor Dalları\",\n  \"Home\": \"Ev\",\n  \"Furnishings\": \"Mobilyalar\",\n  \"Home Services\": \"Ev Hizmetleri\",\n  \"Pets\": \"Evcil Hayvanlar\",\n  \"Mortgage & Rent\": \"İpotek ve Kira\",\n  \"Kids\": \"Çocuklar\",\n  \"Pocket Money\": \"Harçlık\",\n  \"Baby Products\": \"Bebek ürünleri\",\n  \"Babysitter & Daycare\": \"Çocuk bakıcısı\",\n  \"Tuition\": \"Öğrenim\",\n  \"Personal Development\": \"Kişisel Gelişim\",\n  \"Education\": \"Eğitim\",\n  \"Business\": \"İş\",\n  \"InvestmentExpense\": \"Yatırım\",\n  \"Utility Bills\": \"Hizmet Faturaları\",\n  \"Electricity\": \"Elektrik\",\n  \"Internet\": \"İnternet\",\n  \"Mobile Phone\": \"Cep telefonu\",\n  \"Water\": \"Su\",\n  \"Salary\": \"Maaş\",\n  \"Bonus\": \"Bonus\",\n  \"Side job\": \"Ek iş\",\n  \"GiftsIncome\": \"Hediyeler\",\n  \"InvestmentIncome\": \"Yatırım\",\n  \"Income\": \"Gelir\",\n  \"Expense\": \"Gider\",\n  \"Balance\": \"Bakiye\",\n  \"Today\": \"Bugün\",\n  \"This week\": \"Bu hafta\",\n  \"This month\": \"Bu ay\",\n  \"This year\": \"Bu yıl\",\n  \"This quarter\": \"Bu çeyrek\",\n  \"Category\": \"Kategori\",\n  \"TOTAL BALANCE\": \"TOPLAM BAKIYE\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"Yükseltme seçeneklerini görüntüleyin\",\n  \"My Account\": \"Hesabım\",\n  \"General Settings\": \"Genel Ayarlar\",\n  \"Language\": \"Dil\",\n  \"Currency\": \"Para birimi\",\n  \"Share Friends\": \"Arkadaşları paylaş\",\n  \"Rate App\": \"Uygulamayı Değerlendir\",\n  \"Feedback\": \"Geri bildirim\",\n  \"Add Expense Category\": \"Gider Kategorisi Ekle\",\n  \"Add Income Category\": \"Akommes Kategorie derbäi\",\n  \"Category name\": \"Kategori adı\",\n  \"Parent category\": \"Aile kategorisi\",\n  \"Add\": \"Ekle\",\n  \"Game\": \"oyun\",\n  \"Edit\": \"Düzenle\",\n  \"Select a date\": \"Bir tarih seçin\",\n  \"CANCEL\": \"İPTAL ETMEK\",\n  \"OK\": \"TAMAM MI\",\n  \"There is no data\": \"Veri yok\",\n  \"Select a language\": \"Bir dil seç\",\n  \"Please fill a category name\": \"Lütfen bir kategori adı girin\",\n  \"Delete\": \"Sil\",\n  \"Total Year Amount\": \"Toplam Yıl Tutarı\",\n  \"Report\": \"Bildiri\",\n  \"Hi you\": \"merhaba sen\",\n  \"All\": \"Herşey\",\n  \"Category already exists\": \"Kategori zaten var\",\n  \"Month\": \"Ay\",\n  \"2 weeks\": \"2 hafta\",\n  \"Week\": \"Hafta\",\n  \"Since\": \"Beri\",\n  \"Data has been saved\": \"Veri kaydedildi\",\n  \"Choose Category\": \"Kategori Seçin\",\n  \"Done\": \"Tamamlandı\",\n  \"Icons\": \"Simgeler\",\n  \"Please Confirm\": \"Onaylamak\",\n  \"Yes\": \"Evet\",\n  \"No\": \"Numara\",\n  \"Cancel\": \"İptal\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Bu işlem geri alınamaz. Tüm kategorileri sıfırlamak istediğinizden emin misiniz?\",\n  \"Reset\": \"Sıfırla\",\n  \"Reset All Categories\": \"Tüm Kategorileri Sıfırla\",\n  \"Categories have been reset\": \"Kategoriler sıfırlandı\",\n  \"Enable Passcode\": \"Şifreyi Etkinleştir\",\n  \"Please Enter Passcode\": \"Lütfen Şifreyi Girin\",\n  \"Please Re-enter Passcode\": \"Lütfen şifreyi tekrar girin\",\n  \"Passcode has been disabled\": \"Parola devre dışı bırakıldı\",\n  \"Passcode has been enabled\": \"Şifre kodu etkinleştirildi\",\n  \"Category has been deleted\": \"Kategori silindi\",\n  \"Are you sure you want to delete this category?\": \"Bu kategoriyi silmek istediğinizden emin misiniz?\",\n  \"Delete All Data\": \"Tüm Verileri Sil\",\n  \"All data has been deleted\": \"Tüm veriler silindi\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Silinen veriler kurtarılamaz. Tüm verileri silmek istediğinizden emin misiniz?\",\n  \"Select a currency\": \"Bir para birimi seçin\",\n  \"Category has been updated\": \"Kategori güncellendi\",\n  \"Are you sure you want to delete this transaction?\": \"Bu işlemi silmek istediğinizden emin misiniz?\",\n  \"Transaction has been deleted\": \"İşlem silindi\",\n  \"Transaction has been updated\": \"İşlem güncellendi\",\n  \"Select a date format\": \"Bir tarih formatı seçin\",\n  \"Date format\": \"Tarih formatı\",\n  \"Date format has been updated\": \"Tarih formatı güncellend\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/vi.json",
    "content": "{\n  \"Input\": \"Nhập liệu \",\n  \"Analysis\": \"Phân tích\",\n  \"Calendar\": \"Lịch \",\n  \"Other\": \"Khác\",\n  \"OtherIncome\": \"Khác\",\n  \"OtherExpense\": \"Khác\",\n  \"INCOME\": \"THU NHẬP\",\n  \"EXPENSE\": \"CHI TIÊU\",\n  \"Amount\": \"Số tiền\",\n  \"Description\": \"Ghi chú\",\n  \"Save\": \"Lưu\",\n  \"Edit Category\": \"Chỉnh sửa danh mục\",\n  \"Enter Category Name\": \"Nhập danh mục\",\n  \"Transport\": \"Đi lại\",\n  \"Fuel\": \"Xăng xe\",\n  \"Parking\": \"Gửi xe\",\n  \"Services & Maintenance\": \"Dịch vụ & Bảo dưỡng\",\n  \"Taxi\": \"Thuê xe\",\n  \"Shopping\": \"Mua sắm\",\n  \"Accessories\": \"Phụ kiện\",\n  \"Electronic Devices\": \"Thiết bị điện tử\",\n  \"Clothes\": \"Quần áo\",\n  \"Footwear\": \"Giày dép\",\n  \"Entertainment\": \"Giải trí\",\n  \"Movies\": \"Phim ảnh\",\n  \"Games\": \"Game\",\n  \"Music\": \"Nhạc\",\n  \"Travel\": \"Du lịch\",\n  \"Food & Beverages\": \"Ăn uống\",\n  \"Beverages\": \"Đồ uống\",\n  \"Food\": \"Thức ăn\",\n  \"Daily Necessities\": \"Tạp phẩm\",\n  \"Groceries\": \"Tạp phẩm\",\n  \"Restaurant\": \"Nhà hàng\",\n  \"Gifts & Donations\": \"Hiếu hỉ & Từ thiện\",\n  \"Charity\": \"Từ thiện\",\n  \"GiftsExpense\": \"Quà\",\n  \"Funeral\": \"Tang lễ\",\n  \"Wedding\": \"Cưới hỏi\",\n  \"Health\": \"Chăm sóc sức khỏe\",\n  \"Doctor\": \"Khám chữa bệnh\",\n  \"Health Insurance\": \"Bảo hiểm y tế\",\n  \"Medicine\": \"Thuốc men\",\n  \"Sports\": \"Thể thao\",\n  \"Home\": \"Nhà cửa\",\n  \"Furnishings\": \"Đồ đạc & Nội thất\",\n  \"Home Services\": \"Sửa chữa nhà cửa\",\n  \"Pets\": \"Vật nuôi\",\n  \"Mortgage & Rent\": \"Thế chấp & thuê nhà\",\n  \"Kids\": \"Con cái\",\n  \"Pocket Money\": \"Tiền tiêu vặt\",\n  \"Baby Products\": \"Đồ dùng trẻ em\",\n  \"Babysitter & Daycare\": \"Giữ trẻ\",\n  \"Tuition\": \"Học phí\",\n  \"Personal Development\": \"Phát triển bản thân\",\n  \"Education\": \"Học hành\",\n  \"Business\": \"Kinh doanh\",\n  \"InvestmentExpense\": \"Đầu tư\",\n  \"Utility Bills\": \"Hóa đơn & Tiện ích\",\n  \"Electricity\": \"Điện\",\n  \"Internet\": \"Internet\",\n  \"Mobile Phone\": \"Điện thoại di động\",\n  \"Water\": \"Nước\",\n  \"Salary\": \"Lương\",\n  \"Bonus\": \"Thưởng\",\n  \"Side job\": \"Công việc thêm\",\n  \"GiftsIncome\": \"Quà\",\n  \"InvestmentIncome\": \"Đầu tư\",\n  \"Income\": \"Thu nhập\",\n  \"Expense\": \"Chi tiêu\",\n  \"Balance\": \"Số dư\",\n  \"Today\": \"Hôm nay\",\n  \"This week\": \"Tuần này\",\n  \"This month\": \"Tháng này\",\n  \"This year\": \"Năm nay\",\n  \"This quarter\": \"Quý này\",\n  \"Category\": \"Danh mục\",\n  \"TOTAL BALANCE\": \"SỐ DƯ\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"NÂNG CẤP PREMIUM\",\n  \"My Account\": \"Quản lí tài khoản\",\n  \"General Settings\": \"Cài đặt chung\",\n  \"Language\": \"Ngôn ngữ\",\n  \"Currency\": \"Tiền tệ\",\n  \"Share Friends\": \"Chia sẻ ứng dụng\",\n  \"Rate App\": \"Đánh giá ứng dụng\",\n  \"Feedback\": \"Góp ý\",\n  \"Add Expense Category\": \"Thêm danh mục chi tiêu\",\n  \"Add Income Category\": \"Thêm danh mục thu nhập\",\n  \"Category name\": \"Tên danh mục\",\n  \"Parent category\": \"Danh mục chính\",\n  \"Add\": \"Thêm\",\n  \"Game\": \"Trò chơi\",\n  \"Edit\": \"Sửa\",\n  \"Select a date\": \"Chọn ngày\",\n  \"CANCEL\": \"HUỶ BỎ\",\n  \"OK\": \"ĐỒNG Ý\",\n  \"There is no data\": \"Không có dữ liệu\",\n  \"Select a language\": \"Chọn ngôn ngữ\",\n  \"Please fill a category name\": \"Vui lòng điền tên danh mục\",\n  \"Delete\": \"Xóa\",\n  \"Total Year Amount\": \"Tổng số tiền trong năm\",\n  \"Report\": \"Báo cáo\",\n  \"Hi you\": \"Chào bạn\",\n  \"All\": \"Tất cả\",\n  \"Category already exists\": \"Danh mục này đã tồn tại\",\n  \"Month\": \"Tháng\",\n  \"2 weeks\": \"2 tuần\",\n  \"Week\": \"Tuần\",\n  \"Since\": \"Từ\",\n  \"Data has been saved\": \"Dữ liệu đã được lưu\",\n  \"Choose Category\": \"Chọn danh mục\",\n  \"Done\": \"Xong\",\n  \"Icons\": \"Biểu tượng\",\n  \"Please Confirm\": \"Xác nhận\",\n  \"Yes\": \"Có\",\n  \"No\": \"Không\",\n  \"Cancel\": \"Hủy bỏ\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"Hành động này không thể được hoàn tác. Bạn có chắc chắn muốn đặt lại tất cả danh mục không?\",\n  \"Reset\": \"Đặt lại\",\n  \"Reset All Categories\": \"Đặt lại tất cả danh mục\",\n  \"Categories have been reset\": \"Danh mục đã được đặt lại\",\n  \"Enable Passcode\": \"Bật mật mã\",\n  \"Please Enter Passcode\": \"Vui lòng nhập mật mã\",\n  \"Please Re-enter Passcode\": \"Vui lòng nhập lại mật mã\",\n  \"Passcode has been disabled\": \"Mật mã đã được vô hiệu hóa\",\n  \"Passcode has been enabled\": \"Mật mã đã được kích hoạt\",\n  \"Category has been deleted\": \"Danh mục đã được xóa\",\n  \"Are you sure you want to delete this category?\": \"Bạn có chắc chắn muốn xóa danh mục này không?\",\n  \"Delete All Data\": \"Xóa tất cả dữ liệu\",\n  \"All data has been deleted\": \"Tất cả dữ liệu đã được xóa\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"Không thể khôi phục dữ liệu đã xóa. Bạn có chắc chắn muốn xóa tất cả dữ liệu không?\",\n  \"Select a currency\": \"Chọn đơn vị tiền tệ\",\n  \"Category has been updated\": \"Danh mục đã được cập nhật\",\n  \"Are you sure you want to delete this transaction?\": \"Bạn có chắc chắn muốn xóa giao dịch này không ?\",\n  \"Transaction has been deleted\": \"Giao dịch đã được xóa\",\n  \"Transaction has been updated\": \"Giao dịch đã được cập nhật\",\n  \"Select a date format\": \"Chọn một định dạng ngày\",\n  \"Date format\": \"Định dạng ngày tháng\",\n  \"Date format has been updated\": \"Định dạng ngày đã được cập nhật\"\n}\n"
  },
  {
    "path": "lib/project/localization/lang/zh.json",
    "content": "{\n  \"Input\": \"输入\",\n  \"Analysis\": \"报告\",\n  \"Calendar\": \"日历 \",\n  \"Other\": \"其他\",\n  \"OtherIncome\": \"其他\",\n  \"OtherExpense\": \"其他\",\n  \"INCOME\": \"支出\",\n  \"EXPENSE\": \"收入\",\n  \"Amount\": \"金额 \",\n  \"Description\": \"记录\",\n  \"Save\": \"保存\",\n  \"Edit Category\": \"编辑类别\",\n  \"Enter Category Name\": \"选择类别\",\n  \"Transport\": \"运送\",\n  \"Fuel\": \"汽油\",\n  \"Parking\": \"停车费\",\n  \"Services & Maintenance\": \"服务与维护\",\n  \"Taxi\": \"出租车\",\n  \"Shopping\": \"购物\",\n  \"Accessories\": \"配件\",\n  \"Electronic Devices\": \"电子设备\",\n  \"Clothes\": \"服装\",\n  \"Footwear\": \"鞋类\",\n  \"Entertainment\": \"娱乐\",\n  \"Movies\": \"电影\",\n  \"Games\": \"游戏\",\n  \"Music\": \"音乐\",\n  \"Travel\": \"旅游\",\n  \"Food & Beverages\": \"餐饮\",\n  \"Beverages\": \"咖啡厅\",\n  \"Food\": \"食物\",\n  \"Daily Necessities\": \"日用品\",\n  \"Groceries\": \"日用品\",\n  \"Restaurant\": \"餐馆\",\n  \"Gifts & Donations\": \"礼物和捐赠\",\n  \"Charity\": \"慈善\",\n  \"GiftsExpense\": \"礼物\",\n  \"Funeral\": \"丧事\",\n  \"Wedding\": \"婚礼\",\n  \"Health\": \"医药\",\n  \"Doctor\": \"医生\",\n  \"Health Insurance\": \"健康保险\",\n  \"Medicine\": \"药房\",\n  \"Sports\": \"运动\",\n  \"Home\": \"居家\",\n  \"Pets\": \"宠物\",\n  \"Furnishings\": \"家具\",\n  \"Home Services\": \"家装\",\n  \"Mortgage & Rent\": \"租金\",\n  \"Kids\": \"孩子们\",\n  \"Pocket Money\": \"零花钱\",\n  \"Baby Products\": \"嬰兒用品\",\n  \"Babysitter & Daycare\": \"保姆和日托\",\n  \"Tuition\": \"学费\",\n  \"Personal Development\": \"个人发展\",\n  \"Education\": \"教育\",\n  \"Business\": \"商务\",\n  \"InvestmentExpense\": \"投资\",\n  \"Utility Bills\": \"水电费\",\n  \"Electricity\": \"电\",\n  \"Internet\": \"互联网\",\n  \"Mobile Phone\": \"移动电话\",\n  \"Water\": \"水\",\n  \"Salary\": \"工资\",\n  \"Bonus\": \"奖金\",\n  \"Side job\": \"副业\",\n  \"GiftsIncome\": \"礼物\",\n  \"InvestmentIncome\": \"投资\",\n  \"Income\": \"支出\",\n  \"Expense\": \"收入\",\n  \"Balance\": \"余额合计\",\n  \"Today\": \"今天\",\n  \"This week\": \"本星期\",\n  \"This month\": \"这个月\",\n  \"This year\": \"今年\",\n  \"This quarter\": \"这个季度\",\n  \"Category\": \"分类\",\n  \"TOTAL BALANCE\": \"余额合计\",\n  \"Nguyen Hoa\": \"Nguyen Hoa\",\n  \"VIEW UPGRADE OPTIONS\": \"探索高级\",\n  \"My Account\": \"账户管理\",\n  \"General Settings\": \"常规设置\",\n  \"Language\": \"语言\",\n  \"Currency\": \"货币\",\n  \"Share Friends\": \"分享朋友\",\n  \"Rate App\": \"评价应用\",\n  \"Feedback\": \"反馈\",\n  \"Add Expense Category\": \"添加支出类别\",\n  \"Add Income Category\": \"添加收入类别\",\n  \"Category name\": \"类别名称\",\n  \"Parent category\": \"父类别\",\n  \"Add\": \"添加\",\n  \"Game\": \"游戏\",\n  \"Edit\": \"编辑\",\n  \"Select a date\": \"选择一个日期\",\n  \"CANCEL\": \"取消\",\n  \"OK\": \"确定\",\n  \"There is no data\": \"没有数据\",\n  \"Select a language\": \"选择一种语言\",\n  \"Please fill a category name\": \"请填写一个类别名称\",\n  \"Delete\": \"删除\",\n  \"Total Year Amount\": \"年度总金额\",\n  \"Report\": \"报告\",\n  \"Hi you\": \"你好\",\n  \"All\": \"全部\",\n  \"Category already exists\": \"类别已经存在\",\n  \"Month\": \"月\",\n  \"2 weeks\": \"2周\",\n  \"Week\": \"周\",\n  \"Since\": \"自从\",\n  \"Data has been saved\": \"数据已被保存\",\n  \"Choose Category\": \"选择类别\",\n  \"Done\": \"完成\",\n  \"Icons\": \"图标\",\n  \"Please Confirm\": \"确认\",\n  \"Yes\": \"是的\",\n  \"No\": \"不\",\n  \"Cancel\": \"取消\",\n  \"This action cannot be undone. Are you sure you want to reset all categories?\": \"这个动作不能撤消。你确定要重置所有类别吗？\",\n  \"Reset\": \"重置\",\n  \"Reset All Categories\": \"重置所有类别\",\n  \"Categories have been reset\": \"类别已被重置\",\n  \"Enable Passcode\": \"启用密码\",\n  \"Please Enter Passcode\": \"请输入密码\",\n  \"Please Re-enter Passcode\": \"请重新输入密码\",\n  \"Passcode has been disabled\": \"密码已被禁用\",\n  \"Passcode has been enabled\": \"密码已启用\",\n  \"Category has been deleted\": \"类别已被删除\",\n  \"Are you sure you want to delete this category?\": \"你确定你要删除这个类别吗？\",\n  \"Delete All Data\": \"删除所有数据\",\n  \"All data has been deleted\": \"所有数据已被删除\",\n  \"Deleted data can not be recovered. Are you sure you want to delete all data?\": \"已删除的数据无法恢复。你确定要删除所有数据吗？\",\n  \"Select a currency\": \"选择一种货币\",\n  \"Category has been updated\": \"类别已被更新\",\n  \"Are you sure you want to delete this transaction?\": \"你确定你要删除这个交易吗？\",\n  \"Transaction has been deleted\": \"交易已被删除\",\n  \"Transaction has been updated\": \"交易已被更新\",\n  \"Select a date format\": \"选择一个日期格式\",\n  \"Date format\": \"日期格式\",\n  \"Date format has been updated\": \"日期格式已被更新\"\n}\n"
  },
  {
    "path": "lib/project/localization/language.dart",
    "content": "class Language {\n  final int id;\n  final String flag;\n  final String name;\n  final String languageCode;\n  final String countryCode;\n  final String currencySymbol;\n  final String currencyCode;\n  final String currencyName;\n  const Language(\n      this.id,\n      this.flag,\n      this.name,\n      this.languageCode,\n      this.countryCode,\n      this.currencySymbol,\n      this.currencyCode,\n      this.currencyName);\n  static List<Language> languageList = [\n    Language(\n        1, \"🇺🇸\", \"English\", \"en\", 'US', '\\$', 'USD', 'United States Dollar'),\n    // Language(2, \"🇸🇦\", \"العربية\", \"ar\", 'SA', 'R'),\n    Language(3, \"🇩🇪\", \"Deutsch\", \"de\", 'DE', '€', 'EUR', 'Euro'),\n    Language(4, \"🇪🇸\", \"Español\", \"es\", 'ES', '€', 'EUR', 'Euro'),\n    Language(5, \"🇫🇷\", \"Français\", \"fr\", 'FR', '€', 'EUR', 'Euro'),\n    Language(6, \"🇮🇳\", \"हिन्दी\", \"hi\", 'IN', '₹', 'INR', 'Indian Rupee'),\n    Language(7, \"🇯🇵\", \"日本語\", \"ja\", 'JP', '¥', 'JPY', 'Japanese Yen'),\n    Language(8, \"🇰🇷\", \"한국어\", \"ko\", 'KR', '₩', 'KRW', 'South Korean Won'),\n    Language(9, \"🇵🇹\", \"Português\", \"pt\", 'PT', '€', 'EUR', 'Euro'),\n    Language(\n        10, \"🇷🇺\", \"Русский язык\", \"ru\", 'RU', 'руб', 'RUB', 'Russian Ruble'),\n    Language(11, \"🇹🇷\", \"Türkçe\", \"tr\", 'TR', 'TL', 'TRY', 'Turkish Lira'),\n    Language(\n        12, \"🇻🇳\", \"Tiếng Việt\", \"vi\", 'VN', '₫', 'VND', 'Vietnamese Dong'),\n    Language(13, \"🇨🇳\", \"中文\", \"zh\", 'CN', '¥', 'CNY', 'Chinese Yuan'),\n        Language(14, \"🇳🇵\", \"नेपाली\", \"ne\", 'NP', 'रु', 'NPR', 'Nepali Rupee'),\n  ];\n}\n"
  },
  {
    "path": "lib/project/localization/methods.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'app_localization.dart';\n\nLocale locale(String languageCode) {\n  switch (languageCode) {\n    case 'en':\n      return Locale('en', 'US');\n    // case 'ar':\n    //   return Locale('ar', \"SA\");\n    case 'de':\n      return Locale('de', \"DE\");\n    case 'es':\n      return Locale('es', 'ES');\n    case 'fr':\n      return Locale('fr', \"FR\");\n    case 'hi':\n      return Locale('hi', \"IN\");\n    case 'ja':\n      return Locale('ja', \"JP\");\n    case 'ko':\n      return Locale('ko', 'KR');\n    case 'pt':\n      return Locale('pt', \"PT\");\n    case 'ru':\n      return Locale('ru', \"RU\");\n    case 'tr':\n      return Locale('tr', \"TR\");\n    case 'vi':\n      return Locale('vi', \"VN\");\n    case 'zh':\n      return Locale('zh', \"CN\");\n    case 'ne':\n      return Locale('ne', \"NP\");\n    default:\n      return Locale('en', 'US');\n  }\n}\n\nString? getTranslated(BuildContext context, String key) {\n  return AppLocalization.of(context)?.translate(key);\n}\n\nMap<String, String>? localizedMap(BuildContext context) =>\n    AppLocalization.of(context)?.localizedMap();\n"
  },
  {
    "path": "lib/project/provider.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimport 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';\n\nimport 'classes/input_model.dart';\nimport 'database_management/sqflite_services.dart';\n\n// input\nclass ChangeCategoryA with ChangeNotifier {\n  CategoryItem? categoryItemA;\n\n  void changeCategory(CategoryItem? newItem) {\n    categoryItemA = newItem ?? categoryItemA;\n    notifyListeners();\n  }\n}\n\nclass ChangeModelType with ChangeNotifier {\n  String? modelType;\n  void changeModelType(String newType) {\n    this.modelType = newType;\n    notifyListeners();\n  }\n}\n\n// analysis, report\nclass ChangeSelectedDate with ChangeNotifier {\n  String? selectedAnalysisDate;\n  String? selectedReportDate;\n  void changeSelectedAnalysisDate({String? newSelectedDate}) {\n    selectedAnalysisDate = newSelectedDate;\n    notifyListeners();\n  }\n\n  void changeSelectedReportDate({String? newSelectedDate}) {\n    selectedReportDate = newSelectedDate;\n    notifyListeners();\n  }\n}\n\n//report\nclass InputModelList with ChangeNotifier {\n  Future<List<InputModel>> inputModelList = DB.inputModelList();\n  void changeInputModelList() {\n    inputModelList = DB.inputModelList();\n    notifyListeners();\n  }\n}\n\n//expense_category\nclass ChangeExpenseItem with ChangeNotifier {\n  var exItemsLists = sharedPrefs.getAllExpenseItemsLists();\n  void getAllExpenseItems() {\n    exItemsLists = sharedPrefs.getAllExpenseItemsLists();\n    notifyListeners();\n  }\n}\n\nclass ChangeExpenseItemEdit with ChangeNotifier {\n  var exItemsLists = sharedPrefs.getAllExpenseItemsLists();\n  void getAllExpenseItems() {\n    exItemsLists = sharedPrefs.getAllExpenseItemsLists();\n    notifyListeners();\n  }\n}\n\n//income_category\nclass ChangeIncomeItem with ChangeNotifier {\n  var incomeItems = sharedPrefs.getItems('income items');\n  void getIncomeItems() {\n    incomeItems = sharedPrefs.getItems('income items');\n    notifyListeners();\n  }\n}\n\nclass ChangeIncomeItemEdit with ChangeNotifier {\n  var incomeItems = sharedPrefs.getItems('income items');\n  void getIncomeItems() {\n    incomeItems = sharedPrefs.getItems('income items');\n    notifyListeners();\n  }\n}\n\n//add_category\nclass ChangeCategory with ChangeNotifier {\n  IconData? selectedCategoryIcon;\n  CategoryItem? parentItem;\n\n  void changeCategoryIcon(IconData? selectedIcon) {\n    this.selectedCategoryIcon = selectedIcon;\n    notifyListeners();\n  }\n\n  void changeParentItem(CategoryItem? newParentItem) {\n    parentItem = newParentItem ?? parentItem;\n    notifyListeners();\n  }\n}\n\n//other\nclass OnSwitch with ChangeNotifier {\n  bool isPasscodeOn = sharedPrefs.isPasscodeOn;\n\n  void onSwitch() {\n    sharedPrefs.isPasscodeOn = !sharedPrefs.isPasscodeOn;\n    isPasscodeOn = sharedPrefs.isPasscodeOn;\n    notifyListeners();\n  }\n}\n\n//select_language\nclass OnLanguageSelected with ChangeNotifier {\n  String languageCode = sharedPrefs.getLocale().languageCode;\n  void onSelect(String newLanguageCode) {\n    languageCode = newLanguageCode;\n    notifyListeners();\n  }\n}\n\n//select_currency\nclass OnCurrencySelected with ChangeNotifier {\n  String appCurrency = sharedPrefs.appCurrency;\n  void onCurrencySelected(String newCurrency) {\n    appCurrency = newCurrency;\n    sharedPrefs.appCurrency = newCurrency;\n    sharedPrefs.getCurrency();\n    notifyListeners();\n  }\n}\n\n//select_date_format\nclass OnDateFormatSelected with ChangeNotifier {\n  String dateFormat = sharedPrefs.dateFormat;\n  void onDateFormatSelected(String newDateFormat) {\n    dateFormat = newDateFormat;\n    sharedPrefs.dateFormat = newDateFormat;\n    notifyListeners();\n  }\n}\n"
  },
  {
    "path": "lib/project/real_main.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:money_assistant_2608/project/auth_pages/sign_in.dart';\nimport 'database_management/shared_preferences_services.dart';\nimport 'localization/app_localization.dart';\nimport 'home.dart';\n\nvoid realMain() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await sharedPrefs.sharePrefsInit();\n  sharedPrefs.setItems(setCategoriesToDefault: false);\n  sharedPrefs.getCurrency();\n  sharedPrefs.getAllExpenseItemsLists();\n  runApp(MyApp()\n      // AppLock(\n      // builder: (args) => MyApp(),\n      // lockScreen: MainLockScreen(),\n      // enabled: sharedPrefs.isPasscodeOn ? true : false)\n      );\n}\n\nclass MyApp extends StatefulWidget {\n  static void setLocale(BuildContext context, Locale newLocale) {\n    _MyAppState state = context.findAncestorStateOfType<_MyAppState>()!;\n    state.setLocale(newLocale);\n  }\n\n  @override\n  _MyAppState createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n  late Locale? _locale;\n  setLocale(Locale locale) {\n    setState(() {\n      _locale = locale;\n    });\n  }\n\n  @override\n  void didChangeDependencies() {\n    Locale appLocale = sharedPrefs.getLocale();\n    setState(() {\n      this._locale = appLocale;\n    });\n    super.didChangeDependencies();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (this._locale == null) {\n      return Container(\n        child: Center(\n          child: CircularProgressIndicator(\n              valueColor: AlwaysStoppedAnimation<Color>(Colors.blue[800]!)),\n        ),\n      );\n    } else {\n      return ScreenUtilInit(\n        designSize: Size(428.0, 926.0),\n        builder: (_, child) => MaterialApp(\n          title: 'MMAS',\n          debugShowCheckedModeBanner: false,\n          theme: ThemeData(\n            textTheme: TextTheme(\n              headline3: TextStyle(\n                fontFamily: 'OpenSans',\n                fontSize: 45.0,\n                color: Colors.deepOrangeAccent,\n              ),\n              button: TextStyle(\n                fontFamily: 'OpenSans',\n              ),\n              subtitle1: TextStyle(fontFamily: 'NotoSans'),\n              bodyText2: TextStyle(fontFamily: 'NotoSans'),\n            ),\n            colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.indigo)\n                .copyWith(secondary: Colors.orange),\n            textSelectionTheme:\n                TextSelectionThemeData(cursorColor: Colors.amberAccent),\n          ),\n          builder: (context, widget) => MediaQuery(\n            data: MediaQuery.of(context).copyWith(textScaleFactor: 1),\n            child: widget!,\n          ),\n          home: SignIn(),\n          // Home(),\n          locale: _locale,\n          localizationsDelegates: [\n            AppLocalization.delegate,\n            GlobalMaterialLocalizations.delegate,\n            GlobalWidgetsLocalizations.delegate,\n            GlobalCupertinoLocalizations.delegate,\n          ],\n          localeResolutionCallback: (locale, supportedLocales) {\n            for (var supportedLocale in supportedLocales) {\n              if (supportedLocale.languageCode == locale!.languageCode &&\n                  supportedLocale.countryCode == locale.countryCode) {\n                return supportedLocale;\n              }\n            }\n            return supportedLocales.first;\n          },\n          supportedLocales: [\n            Locale(\"en\", \"US\"),\n            Locale(\"de\", \"DE\"),\n            Locale(\"es\", \"ES\"),\n            Locale(\"fr\", \"FR\"),\n            Locale(\"hi\", \"IN\"),\n            Locale(\"ja\", \"JP\"),\n            Locale(\"ko\", \"KR\"),\n            Locale(\"pt\", \"PT\"),\n            Locale(\"ru\", \"RU\"),\n            Locale(\"tr\", \"TR\"),\n            Locale(\"vi\", \"VN\"),\n            Locale(\"zh\", \"CN\"),\n            Locale(\"ne\", \"NP\"),\n          ],\n        ),\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: money_assistant_2608\ndescription: A new Flutter project.\n\n# The following line prevents the package from being accidentally published to\n# pub.dev using `pub publish`. This is preferred for private packages.\npublish_to: 'none' # Remove this line if you wish to publish to pub.dev\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.8\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n  #  material_floating_search_bar: ^0.3.3\n  #  cloud_firestore: ^0.16.0+1\n  #  syncfusion_flutter_datepicker: ^19.2.62\n  #  flutter_spinkit: ^5.1.0\n  google_sign_in: ^5.2.0\n  firebase_auth: ^3.1.4\n  firebase_core: ^1.8.0\n  shared_preferences: ^2.0.8\n  sqflite: ^2.0.0+4\n  intl: ^0.17.0\n  provider: ^5.0.0\n  flutter_screenutil: ^5.0.0+2\n  flutter_login: ^2.2.1\n  flutter_screen_lock: ^4.0.4+2\n  flutter_app_lock: ^2.0.0\n  google_fonts: ^2.1.0\n  table_calendar: ^3.0.2\n  syncfusion_flutter_charts: ^20.4.54\n  day_night_time_picker: ^1.0.3+1\n  flutter_material_pickers: ^3.1.0\n  sliding_up_panel: ^2.0.0+1\n  keyboard_actions: ^3.4.4\n  fluttertoast: ^8.2.1\n  flutter_swipe_action_cell: ^3.1.0\n  share_plus: ^2.1.4\n  in_app_review: ^2.0.3\n  rate_my_app: ^1.1.1\n#  local_auth: ^1.1.8\n\n  # icons\n  material_design_icons_flutter: ^4.0.5955\n  font_awesome_flutter: ^9.1.0\n  outline_material_icons: ^0.1.1\n  flutter_boxicons: ^3.0.0\n  icofont_flutter: ^1.4.0\n\n  cupertino_icons: ^1.0.3\n\ndependency_overrides:\n  flutter_colorpicker: ^0.6.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_native_splash: ^1.2.3\n\nflutter_native_splash:\n  color: \"#ffffff\"\n  #  color_dark: \"#ffffff\"\n  #  image_dark: images/splash_screen.png\n  image: images/splash_screen.png\n  android: true\n  ios: true\n#  android12: true\n\n    # This package generates native code to customize Flutter's default white native splash screen\n    # with background color and splash image.\n    # Customize the parameters below, and run the following command in the terminal:\n    # flutter pub run flutter_native_splash:create\n    # To restore Flutter's default white splash screen, run the following command in the terminal:\n    # flutter pub run flutter_native_splash:remove\n\n    # color or background_image is the only required parameter.  Use color to set the background\n    # of your splash screen to a solid color.  Use background_image to set the background of your\n    # splash screen to a png image.  This is useful for gradients. The image will be stretch to the\n    # size of the app. Only one parameter can be used, color and background_image cannot both be set.\n    #background_image: \"assets/background.png\"\n\n    # Optional parameters are listed below.  To enable a parameter, uncomment the line by removing\n    # the leading # character.\n\n    # The image parameter allows you to specify an image used in the splash screen.  It must be a\n    # png file.\n    #image: assets/splash.png\n\n    # The color_dark, background_image_dark, and image_dark are parameters that set the background\n    # and image when the device is in dark mode. If they are not specified, the app will use the\n    # parameters from above. If the image_dark parameter is specified, color_dark or\n    # background_image_dark must be specified.  color_dark and background_image_dark cannot both be\n    # set.\n    #color_dark: \"#042a49\"\n    #background_image_dark: \"assets/dark-background.png\"\n    #image_dark: assets/splash-invert.png\n\n    # The android, ios and web parameters can be used to disable generating a splash screen on a given\n    # platform.\n    #android: false\n    #ios: false\n    #web: false\n\n    # The position of the splash image can be set with android_gravity, ios_content_mode, and\n    # web_image_mode parameters.  All default to center.\n    #\n    # android_gravity can be one of the following Android Gravity (see\n    # https://developer.android.com/reference/android/view/Gravity): bottom, center,\n    # center_horizontal, center_vertical, clip_horizontal, clip_vertical, end, fill, fill_horizontal,\n    # fill_vertical, left, right, start, or top.\n    #android_gravity: center\n    #\n    # ios_content_mode can be one of the following iOS UIView.ContentMode (see\n    # https://developer.apple.com/documentation/uikit/uiview/contentmode): scaleToFill,\n    # scaleAspectFit, scaleAspectFill, center, top, bottom, left, right, topLeft, topRight,\n    # bottomLeft, or bottomRight.\n    #ios_content_mode: center\n    #\n    # web_image_mode can be one of the following modes: center, contain, stretch, and cover.\n    #web_image_mode: center\n\n    # To hide the notification bar, use the fullscreen parameter.  Has no affect in web since web\n    # has no notification bar.  Defaults to false.\n    # NOTE: Unlike Android, iOS will not automatically show the notification bar when the app loads.\n    #       To show the notification bar, add the following code to your Flutter app:\n    #       WidgetsFlutterBinding.ensureInitialized();\n    #       SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom, SystemUiOverlay.top]);\n    #fullscreen: true\n\n    # If you have changed the name(s) of your info.plist file(s), you can specify the filename(s)\n    # with the info_plist_files parameter.  Remove only the # characters in the three lines below,\n    # do not remove any spaces:\n    #info_plist_files:\n    #  - 'ios/Runner/Info-Debug.plist'\n    #  - 'ios/Runner/Info-Release.plist'\n\n\n    #command: flutter clean && flutter pub get && flutter pub run flutter_native_splash:create\n\n\n    # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n  generate: true    # Add this line\n\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  # assets:\n  #   - images/a_dot_burr.jpeg\n  #   - images/a_dot_ham.jpeg\n  assets:\n    #   - /Users/hoanguyen/AndroidStudioProjects/moneyassistant/lib/project/localization/lang/\n    #   - /Users/hoanguyen/AndroidStudioProjects/moneyassistant/images/\n    - lib/project/localization/lang/\n    - images/\n\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # mmas:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility that Flutter provides. For mmas, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_material_pickers/main.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  }
]