[
  {
    "path": ".github/workflows/ci.yml",
    "content": "\nname: CI\n\non:\n  push:\n    branches: [ master ]\n\njobs:\n  run_tests:\n    name: Run tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n\n      - name: Run tests\n        run: |\n          flutter pub get\n          flutter test\n\n  build_android:\n    name: Build android app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: android\n        env:\n          FLUTTER_PATH: /Users/adapps/flutter\n          ANDROID_SDK_PATH: /Users/adapps/Library/Android/Sdk\n          GEM_HOME: ~/.gems\n        run: |\n          echo flutter.sdk=${{ env.FLUTTER_PATH }} > local.properties\n          echo sdk.dir=${{ env.ANDROID_SDK_PATH }} >> local.properties\n          echo flutter.buildMode=release >> local.properties\n          echo storeFile=${{ secrets.ANDROID_KEYSTORE_PATH }} > key.properties\n          echo keyAlias=${{ secrets.ANDROID_KEY_ALIAS }} >> key.properties\n          echo keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }} >> key.properties\n          echo storePassword=${{ secrets.ANDROID_KEY_STORE_PASSWORD }} >> key.properties\n          /usr/local/bin/fastlane build_android production:true\n          rm -f key.properties\n\n      - name: Upload APK\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-apk\n          path: build/app/outputs/apk/release/app-release.apk\n\n      - name: Upload Bundle\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-aab\n          path: build/app/outputs/bundle/release/app-release.aab\n\n  build_ios:\n    name: Build iOS app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: ios\n        env:\n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}\n          TEMP_KEYCHAIN_NAME: ${{ secrets.TEMP_KEYCHAIN_NAME }}\n          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}\n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}          \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane build_ios\n\n      - name: Upload IPA\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: ios-ipa\n          path: ios/Runner.ipa"
  },
  {
    "path": ".github/workflows/deploy_beta.yml",
    "content": "name: DEPLOY_BETA\n\non:\n  push:\n    tags:\n    - 'v*-beta'\n\njobs:\n  run_tests:\n    name: Run tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n\n      - name: Run tests\n        run: |\n          flutter pub get\n          flutter test\n\n  build_android:\n    name: Build android app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: android\n        env:\n          FLUTTER_PATH: /Users/adapps/flutter\n          ANDROID_SDK_PATH: /Users/adapps/Library/Android/Sdk\n          GEM_HOME: ~/.gems\n        run: |\n          echo flutter.sdk=${{ env.FLUTTER_PATH }} > local.properties\n          echo sdk.dir=${{ env.ANDROID_SDK_PATH }} >> local.properties\n          echo flutter.buildMode=release >> local.properties\n          echo storeFile=${{ secrets.ANDROID_KEYSTORE_PATH }} > key.properties\n          echo keyAlias=${{ secrets.ANDROID_KEY_ALIAS }} >> key.properties\n          echo keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }} >> key.properties\n          echo storePassword=${{ secrets.ANDROID_KEY_STORE_PASSWORD }} >> key.properties\n          /usr/local/bin/fastlane build_android production:true\n          rm -f key.properties\n\n      - name: Upload APK\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-apk\n          path: build/app/outputs/apk/release/app-release.apk\n\n      - name: Upload Bundle\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-aab\n          path: build/app/outputs/bundle/release/app-release.aab\n\n  build_ios:\n    name: Build iOS app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: ios\n        env:\n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}\n          TEMP_KEYCHAIN_NAME: ${{ secrets.TEMP_KEYCHAIN_NAME }}\n          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}\n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}                   \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane build_ios\n\n      - name: Upload IPA\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: ios-ipa\n          path: ios/Runner.ipa\n\n  deploy_android:\n    name: Deploy android internal\n    needs: build_android\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download AAB\n        uses: actions/download-artifact@v2\n        with:\n          name: android-aab\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy android\n        if: success()\n        working-directory: android\n        env:\n          AAB_PATH: ${{ env.workspace }}/app-release.aab\n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_android internal:true\n\n  deploy_ios:\n    name: Deploy iOS testflight\n    needs: build_ios\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download IPA\n        uses: actions/download-artifact@v2\n        with:\n          name: ios-ipa\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy iOS \n        if: success()\n        working-directory: ios\n        env:\n          IPA_PATH: ${{ env.workspace }}/Runner.ipa   \n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}   \n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}                   \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_ios testflight:true"
  },
  {
    "path": ".github/workflows/deploy_release.yml",
    "content": "name: DEPLOY_RELEASE\n\non:\n  push:\n    tags:\n    - 'v*-release'\n\njobs:\n  run_tests:\n    name: Run tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n\n      - name: Run tests\n        run: |\n          flutter pub get\n          flutter test\n\n  build_android:\n    name: Build android app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: android\n        env:\n          FLUTTER_PATH: /Users/adapps/flutter\n          ANDROID_SDK_PATH: /Users/adapps/Library/Android/Sdk\n          GEM_HOME: ~/.gems\n        run: |\n          echo flutter.sdk=${{ env.FLUTTER_PATH }} > local.properties\n          echo sdk.dir=${{ env.ANDROID_SDK_PATH }} >> local.properties\n          echo flutter.buildMode=release >> local.properties\n          echo storeFile=${{ secrets.ANDROID_KEYSTORE_PATH }} > key.properties\n          echo keyAlias=${{ secrets.ANDROID_KEY_ALIAS }} >> key.properties\n          echo keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }} >> key.properties\n          echo storePassword=${{ secrets.ANDROID_KEY_STORE_PASSWORD }} >> key.properties\n          /usr/local/bin/fastlane build_android production:true\n          rm -f key.properties\n\n      - name: Upload APK\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-apk\n          path: build/app/outputs/apk/release/app-release.apk\n\n      - name: Upload Bundle\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-aab\n          path: build/app/outputs/bundle/release/app-release.aab\n\n  build_ios:\n    name: Build iOS app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: ios\n        env:\n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}\n          TEMP_KEYCHAIN_NAME: ${{ secrets.TEMP_KEYCHAIN_NAME }}\n          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}\n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}          \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane build_ios\n\n      - name: Upload IPA\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: ios-ipa\n          path: ios/Runner.ipa\n\n  deploy_android:\n    name: Deploy android production\n    needs: build_android\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download AAB\n        uses: actions/download-artifact@v2\n        with:\n          name: android-aab\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy android\n        if: success()\n        working-directory: android\n        env:\n          AAB_PATH: ${{ env.workspace }}/app-release.aab\n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_android production:true\n\n  deploy_ios:\n    name: Deploy iOS production\n    needs: build_ios\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download IPA\n        uses: actions/download-artifact@v2\n        with:\n          name: ios-ipa\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy iOS \n        if: success()\n        working-directory: ios\n        env:\n          IPA_PATH: ${{ env.workspace }}/Runner.ipa   \n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}   \n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}          \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_ios"
  },
  {
    "path": ".github/workflows/deploy_release_android.yml",
    "content": "name: DEPLOY_RELEASE\n\non:\n  push:\n    tags:\n    - 'v*-release-android'\n\njobs:\n  run_tests:\n    name: Run tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n\n      - name: Run tests\n        run: |\n          flutter pub get\n          flutter test\n\n  build_android:\n    name: Build android app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: android\n        env:\n          FLUTTER_PATH: /Users/adapps/flutter\n          ANDROID_SDK_PATH: /Users/adapps/Library/Android/Sdk\n          GEM_HOME: ~/.gems\n        run: |\n          echo flutter.sdk=${{ env.FLUTTER_PATH }} > local.properties\n          echo sdk.dir=${{ env.ANDROID_SDK_PATH }} >> local.properties\n          echo flutter.buildMode=release >> local.properties\n          echo storeFile=${{ secrets.ANDROID_KEYSTORE_PATH }} > key.properties\n          echo keyAlias=${{ secrets.ANDROID_KEY_ALIAS }} >> key.properties\n          echo keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }} >> key.properties\n          echo storePassword=${{ secrets.ANDROID_KEY_STORE_PASSWORD }} >> key.properties\n          /usr/local/bin/fastlane build_android production:true\n          rm -f key.properties\n\n      - name: Upload APK\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-apk\n          path: build/app/outputs/apk/release/app-release.apk\n\n      - name: Upload Bundle\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: android-aab\n          path: build/app/outputs/bundle/release/app-release.aab\n\n  deploy_android:\n    name: Deploy android production\n    needs: build_android\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download AAB\n        uses: actions/download-artifact@v2\n        with:\n          name: android-aab\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy android\n        if: success()\n        working-directory: android\n        env:\n          AAB_PATH: ${{ env.workspace }}/app-release.aab\n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_android production:true"
  },
  {
    "path": ".github/workflows/deploy_release_ios.yml",
    "content": "name: DEPLOY_RELEASE\n\non:\n  push:\n    tags:\n    - 'v*-release-ios'\n\njobs:\n  run_tests:\n    name: Run tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n\n      - name: Run tests\n        run: |\n          flutter pub get\n          flutter test\n\n  build_ios:\n    name: Build iOS app\n    needs: run_tests\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master\n\n      - name: Build artifacts\n        working-directory: ios\n        env:\n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}\n          TEMP_KEYCHAIN_NAME: ${{ secrets.TEMP_KEYCHAIN_NAME }}\n          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}\n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}          \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane build_ios\n\n      - name: Upload IPA\n        if: success()\n        uses: actions/upload-artifact@v1\n        with:\n          name: ios-ipa\n          path: ios/Runner.ipa\n\n  deploy_ios:\n    name: Deploy iOS production\n    needs: build_ios\n    runs-on: self-hosted\n    steps:\n      - uses: actions/checkout@master   \n      - name: Download IPA\n        uses: actions/download-artifact@v2\n        with:\n          name: ios-ipa\n\n      - name: Set workspace in env\n        run: echo \"workspace=$GITHUB_WORKSPACE\" >> $GITHUB_ENV\n\n      - name: Deploy iOS \n        if: success()\n        working-directory: ios\n        env:\n          IPA_PATH: ${{ env.workspace }}/Runner.ipa   \n          FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}\n          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}   \n          API_KEY_ID: ${{ secrets.FASTLANE_API_KEY_ID }}\n          API_KEY_ISSUER: ${{ secrets.FASTLANE_API_KEY_ISSUER }}\n          API_KEY_FILEPATH: ${{ secrets.FASTLANE_API_KEY_FILEPATH }}          \n          GEM_HOME: ~/.gems\n        run: |\n          /usr/local/bin/fastlane deploy_ios"
  },
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.lock\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# Eclipse project files\n.classpath\n.project\n.metadata\n.settings\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.vscode/\n\n# Flutter repo-specific\n/bin/cache/\n/bin/mingit/\n/dev/benchmarks/mega_gallery/\n/dev/bots/.recipe_deps\n/dev/bots/android_tools/\n/dev/docs/doc/\n/dev/docs/flutter.docs.zip\n/dev/docs/lib/\n/dev/docs/pubspec.yaml\n/packages/flutter/coverage/\nversion\n\n# packages file containing multi-root paths\n.packages.generated\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\nflutter_*.png\nlinked_*.ds\nunlinked.ds\nunlinked_spec.ds\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n**/android/key.properties\n*.jks\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n**/ios/*.ipa\n**/ios/*.app.dSYM.zip\n**/ios/flutter_export_environment.sh\n\n# Coverage\ncoverage/\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n\n# Translations\nlib/l10n/*.json\nbin/settings.py\n\n# Fastlane\nandroid/fastlane/report.xml\nios/fastlane/README.md\nios/fastlane/report.xml\nios/fastlane/Preview.html\nios/fastlane/metadata/review_information\nios/fastlane/metadata/trade_representative_contact_information\n"
  },
  {
    "path": "LICENSE",
    "content": "The Blaise logo, animations, and all assets in the \"assets\" folder are copyrighted by Appditto LLC and used by permission for this project only.\n\nAll code is copyrighted by Appditto LLC under the MIT license.\n\nCopyright (c) 2019-2022 Appditto LLC\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": "# Blaise - Simple, Sleek & Secure PASCAL Wallet\n\n[![GitHub release (latest)](https://img.shields.io/github/v/release/appditto/blaise_wallet_flutter)](https://github.com/appditto/blaise_wallet_flutter/releases) [![License](https://img.shields.io/github/license/appditto/blaise_wallet_flutter)](https://github.com/appditto/blaise_wallet_flutter/blob/master/LICENSE) [[![CI](https://github.com/appditto/blaise_wallet_flutter/workflows/CI/badge.svg)](https://github.com/appditto/blaise_wallet_flutter/actions?query=workflow%3ACI) [![Twitter Follow](https://img.shields.io/twitter/follow/Appditto?style=social)](https://twitter.com/intent/follow?screen_name=Appditto)\n\n## What is Blaise?\n![Blaise Hero](https://blaisewallet.com/assets/hero-mockup.png)\n\nBlaise is a cross-platform mobile wallet for the PASCAL cryptocurrency. It is written in Dart using [Flutter](https://flutter.io).\n\n![Blaise Borrow](https://blaisewallet.com/assets/blaise-borrow.gif) ![Blaise Send](https://blaisewallet.com/assets/blaise-send.gif)\n\n\nPrivate keys are stored on the device and never transmitted to the server. Signing and other low-level operations are performed using [PascalDart](https://pub.dev/packages/pascaldart)\n\n| Link | Description |\n| :----- | :------ |\n[blaisewallet.com](https://blaisewallet.com) | Blaise Homepage\n[pascalcoin.org](https://pascalcoin.org) | PACAL Cryptocurrency Homepage\n[appditto.com](https://appditto.com) | Appditto Homepage\n\n## Server\n\nBlaise can interact with any PascalCoin Daemon, a high-performance Python server is used for push notifications, periodic price updates, and the PASA purchase APIs.\n\nBlaise's backend server source code can be found [here](https://github.com/appditto/blaise_wallet_server)\n\n## Contributing\n\n* Fork the repository and clone it to your local machine\n* Follow the instructions [here](https://flutter.io/docs/get-started/install) to install the Flutter SDK\n* Setup [Android Studio](https://flutter.io/docs/development/tools/android-studio) or [Visual Studio Code](https://flutter.io/docs/development/tools/vs-code).\n\n## Building\n\nAndroid: `flutter build apk`\niOS: `flutter build ios`\n\nIf you have a connected device or emulator you can run and deploy the app with `flutter run`\n\n## Have a question?\n\nIf you need any help, feel free to file an issue if you do not manage to find a solution.\n\n## License\n\nBlaise is released under the MIT License\n\n### Update translations\n\n```\nflutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/localization.dart\nflutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \\\n   --no-use-deferred-loading lib/localization.dart lib/l10n/intl_*.arb\n```\n"
  },
  {
    "path": "android/Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\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 plugin: 'kotlin-kapt'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\napply plugin: 'com.google.gms.google-services'\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    compileSdkVersion 31\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        applicationId \"com.appditto.blaise\"\n        minSdkVersion 19\n        targetSdkVersion 31\n        multiDexEnabled true\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    signingConfigs {\n        release {\n            if (keystorePropertiesFile.exists()) {\n                keyAlias keystoreProperties['keyAlias']\n                keyPassword keystoreProperties['keyPassword']\n                storeFile file(keystoreProperties['storeFile'])\n                storePassword keystoreProperties['storePassword']\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            if (keystorePropertiesFile.exists()) {\n                signingConfig signingConfigs.release\n                minifyEnabled true\n                useProguard true\n\n                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n            } else {\n                signingConfig signingConfigs.debug\n            }\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test:runner:1.1.1'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.11\"\n    implementation \"com.bottlerocketstudios:vault:1.4.2\"\n    implementation \"androidx.multidex:multidex:2.0.0\"\n}\n"
  },
  {
    "path": "android/app/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"786466973238\",\n    \"firebase_url\": \"https://blaise-a22fa.firebaseio.com\",\n    \"project_id\": \"blaise-a22fa\",\n    \"storage_bucket\": \"blaise-a22fa.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:786466973238:android:59d3b6ab52a943d3\",\n        \"android_client_info\": {\n          \"package_name\": \"com.appditto.blaise\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"786466973238-luvav6kcq097806661753c4jh98q7dre.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyAb7sG6W-UFHg9Fbb5Mx3LaIkE5e3wxrwo\"\n        }\n      ],\n      \"services\": {\n        \"appinvite_service\": {\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"786466973238-luvav6kcq097806661753c4jh98q7dre.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "content": "-dontwarn android.**\n## Flutter wrapper\n-keep class io.flutter.app.** { *; }\n-keep class io.flutter.plugin.**  { *; }\n-keep class io.flutter.util.**  { *; }\n-keep class io.flutter.view.**  { *; }\n-keep class io.flutter.**  { *; }\n-keep class io.flutter.plugins.**  { *; }\n## Blaise\n-keep class com.appditto.** { *; }\n## QR Scanner\n-keep class com.apptreesoftware.** { *; }\n## Webview plugin\n-keep class com.flutter_webview_plugin.** { *; }\n## Realm\n-keep class io.realm.** { *; }\n## Vault\n-keep class com.bottlerocketstudios.** { *; }\n## File picker\n-keep class androidx.lifecycle.DefaultLifecycleObserver"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.appditto.blaise\">\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.appditto.blaise\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.USE_BIOMETRIC\"/>\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\".MultidexApplication\"\n        android:label=\"Blaise\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:networkSecurityConfig=\"@xml/network_security_config\">\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />         \n        <meta-data\n            android:name=\"com.google.firebase.messaging.default_notification_icon\"\n            android:resource=\"@drawable/ic_status_bar\" />\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\"\n            android:allowBackup=\"false\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\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        <activity android:name=\"com.apptreesoftware.barcodescan.BarcodeScannerActivity\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/java/com/appditto/blaise/LegacyStorage.java",
    "content": "package com.appditto.blaise;\n\nimport android.util.Base64;\n\npublic class LegacyStorage {\n\n    public String getSecret() {\n       return generateEncryptionKey();\n    }\n\n    private String generateEncryptionKey() {\n        if (Vault.getVault().getString(Vault.ENCRYPTION_KEY_NAME, null) == null) {\n        Vault.getVault()\n                .edit()\n                .putString(Vault.ENCRYPTION_KEY_NAME,\n                        Base64.encodeToString(Vault.generateKey(), Base64.DEFAULT))\n                .apply();\n        }\n        return Vault.getVault().getString(Vault.ENCRYPTION_KEY_NAME, null);\n    }\n}"
  },
  {
    "path": "android/app/src/main/java/com/appditto/blaise/MainActivity.java",
    "content": "package com.appditto.blaise;\n\nimport android.os.Bundle;\n\nimport androidx.annotation.NonNull;\nimport io.flutter.embedding.android.FlutterFragmentActivity;\nimport io.flutter.embedding.engine.FlutterEngine;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugins.GeneratedPluginRegistrant;\nimport io.flutter.view.FlutterMain;\n\npublic class MainActivity extends FlutterFragmentActivity {\n    private static final String CHANNEL = \"fappchannel\";\n\n    @Override\n    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {\n        GeneratedPluginRegistrant.registerWith(flutterEngine);\n        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)\n            .setMethodCallHandler(\n                (call, result) -> {\n                    if (call.method.equals(\"getSecret\")) {\n                        result.success(new LegacyStorage().getSecret());\n                    } else {\n                        result.notImplemented();\n                    }\n                }\n            );\n    }\n}\n"
  },
  {
    "path": "android/app/src/main/java/com/appditto/blaise/MultidexApplication.java",
    "content": "// Copyright 2013 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage com.appditto.blaise;\n\nimport android.util.Base64;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport androidx.annotation.CallSuper;\nimport android.content.Context;\nimport androidx.multidex.MultiDex;\n\nimport io.flutter.view.FlutterMain;\n\n/**\n * Flutter implementation of {@link android.app.Application}, managing\n * application-level global initializations.\n */\npublic class MultidexApplication extends Application {\n    @Override\n    protected void attachBaseContext(Context base) {\n       super.attachBaseContext(base);\n       MultiDex.install(this);\n    }\n\n    @Override\n    @CallSuper\n    public void onCreate() {\n        super.onCreate();\n\n        try {\n            Vault.initializeVault(this);\n            generateEncryptionKey();\n        } catch (Exception e) {\n    \n        }\n        FlutterMain.startInitialization(this);\n    }\n\n    private Activity mCurrentActivity = null;\n    public Activity getCurrentActivity() {\n        return mCurrentActivity;\n    }\n    public void setCurrentActivity(Activity mCurrentActivity) {\n        this.mCurrentActivity = mCurrentActivity;\n    }\n\n    /**\n     * generate an encryption key and store in the vault\n     */\n    private void generateEncryptionKey() {\n        if (Vault.getVault().getString(Vault.ENCRYPTION_KEY_NAME, null) == null) {\n        Vault.getVault()\n                .edit()\n                .putString(Vault.ENCRYPTION_KEY_NAME,\n                        Base64.encodeToString(Vault.generateKey(), Base64.DEFAULT))\n                .apply();\n        }\n    }\n}"
  },
  {
    "path": "android/app/src/main/java/com/appditto/blaise/Vault.java",
    "content": "package com.appditto.blaise;\n\nimport android.content.Context;\n\nimport com.bottlerocketstudios.vault.SharedPreferenceVault;\nimport com.bottlerocketstudios.vault.SharedPreferenceVaultFactory;\nimport com.bottlerocketstudios.vault.SharedPreferenceVaultRegistry;\n\nimport java.security.GeneralSecurityException;\nimport java.security.SecureRandom;\n\npublic class Vault {\n    public static final String ENCRYPTION_KEY_NAME = \"key\";\n    private static final String TAG = Vault.class.getSimpleName();\n    private static final String AUTOMATICALLY_KEYED_PREF_FILE_NAME = \"com.appditto.blaise.automaticallyKeyedPref\";\n    private static final String AUTOMATICALLY_KEYED_KEY_FILE_NAME = \"com.appditto.blaise.automaticallyKeyedKey\";\n    private static final String AUTOMATICALLY_KEYED_KEY_ALIAS = \"com.appditto.blaise.automaticallyKeyed\";\n    private static final int AUTOMATICALLY_KEYED_KEY_INDEX = 3;\n    private static final String AUTOMATICALLY_KEYED_PRESHARED_SECRET = \"8.b;(xYpB<Af$NvtM-#TUqSG\";\n\n    public static boolean initializeVault(Context context) {\n        try {\n            initKeyedVault(context);\n            return true;\n        } catch (GeneralSecurityException e) {\n        }\n        return false;\n    }\n\n    /**\n     * Create a vault that will automatically key itself initially with a random key.\n     */\n    private static void initKeyedVault(Context context) throws GeneralSecurityException {\n        SharedPreferenceVault sharedPreferenceVault = SharedPreferenceVaultFactory\n                .getAppKeyedCompatAes256Vault(\n                        context,\n                        AUTOMATICALLY_KEYED_PREF_FILE_NAME,\n                        AUTOMATICALLY_KEYED_KEY_FILE_NAME,\n                        AUTOMATICALLY_KEYED_KEY_ALIAS,\n                        AUTOMATICALLY_KEYED_KEY_INDEX,\n                        AUTOMATICALLY_KEYED_PRESHARED_SECRET\n                );\n        SharedPreferenceVaultRegistry\n                .getInstance()\n                .addVault(\n                        AUTOMATICALLY_KEYED_KEY_INDEX,\n                        AUTOMATICALLY_KEYED_PREF_FILE_NAME,\n                        AUTOMATICALLY_KEYED_KEY_ALIAS,\n                        sharedPreferenceVault\n                );\n    }\n\n    /**\n     * Encapsulates index knowledge.\n     */\n    public static SharedPreferenceVault getVault() {\n        return SharedPreferenceVaultRegistry.getInstance().getVault(AUTOMATICALLY_KEYED_KEY_INDEX);\n    }\n\n    /**\n     * Generate a secret key for use with encryption / decryption\n     */\n    public static byte[] generateKey() {\n        byte[] key = new byte[64];\n        new SecureRandom().nextBytes(key);\n        return key;\n    }\n\n}"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v24/ic_launcher_background.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n  <path\n      android:pathData=\"M0,0h108v108h-108z\"\n      android:strokeWidth=\"1\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:startY=\"0\"\n          android:startX=\"0\"\n          android:endY=\"108\"\n          android:endX=\"108\"\n          android:type=\"linear\">\n        <item android:offset=\"0\" android:color=\"#FFFFFFFF\"/>\n        <item android:offset=\"1\" android:color=\"#FFE2DBD3\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n  <path\n      android:pathData=\"M53.961,53.961m-32,0a32,32 0,1 1,64 0a32,32 0,1 1,-64 0\"\n      android:strokeWidth=\"1\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:startY=\"21.960999\"\n          android:startX=\"85.961\"\n          android:endY=\"85.961\"\n          android:endX=\"21.960999\"\n          android:type=\"linear\">\n        <item android:offset=\"0\" android:color=\"#FFFCC642\"/>\n        <item android:offset=\"1\" android:color=\"#FFF7941F\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n  <path\n      android:pathData=\"M53.961,53.961m-32,0a32,32 0,1 1,64 0a32,32 0,1 1,-64 0\"\n      android:strokeWidth=\"1\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:gradientRadius=\"63.228214\"\n          android:centerX=\"34.02683\"\n          android:centerY=\"29.371035\"\n          android:type=\"radial\">\n        <item android:offset=\"0\" android:color=\"#26FFFFFF\"/>\n        <item android:offset=\"1\" android:color=\"#00FFFFFF\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n  <path\n      android:pathData=\"M67.222,39.277L68.31,39.138C70.056,44.288 69.169,48.465 65.648,51.671C62.127,54.877 56.099,55.698 47.565,54.134L36.969,43.132L58.472,40.392L56.856,39.881L58.282,35.094L62.139,39.309L63.394,35.094L67.222,39.277ZM94,94L63.633,94L40.124,69.469L46.742,69.469L48.781,56.186L53.494,56.186L53.125,59.156L55.531,59.156L55.863,56.186L58.646,56.186L58.281,59.156L60.688,59.156L60.985,56.186C65.976,55.323 69.071,53.496 70.27,50.705C71.47,47.914 70.816,44.058 68.31,39.138L94,65.897L94,94Z\"\n      android:strokeAlpha=\"0.35\"\n      android:strokeWidth=\"1\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"\n      android:fillAlpha=\"0.35\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:startY=\"53.847736\"\n          android:startX=\"54.57417\"\n          android:endY=\"71.34273\"\n          android:endX=\"69.587006\"\n          android:type=\"linear\">\n        <item android:offset=\"0\" android:color=\"#FFC78200\"/>\n        <item android:offset=\"1\" android:color=\"#00C78200\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n  <path\n      android:pathData=\"M55.521,38.191L55.875,35.094L58.281,35.094L57.927,38.191L60.677,38.191L61.031,35.094L63.438,35.094L63.083,38.191L65.385,38.191C73.546,38.191 73.546,56.186 64.012,56.186L61.027,56.186L60.688,59.156L58.281,59.156L58.621,56.186L55.871,56.186L55.531,59.156L53.125,59.156L53.464,56.186L48.781,56.186L46.742,69.469L40.124,69.469L44.643,45.955L50.523,45.955L49.847,51.097C55.823,51.097 59.992,51.097 62.355,51.097C65.9,51.097 66.5,43.132 63.219,43.132C61.031,43.132 52.281,43.132 36.969,43.132L40.124,38.191L55.521,38.191Z\"\n      android:strokeWidth=\"1\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\">\n    <aapt:attr name=\"android:fillColor\">\n      <gradient \n          android:startY=\"38.267662\"\n          android:startX=\"40.075287\"\n          android:endY=\"56.159637\"\n          android:endX=\"62.724014\"\n          android:type=\"linear\">\n        <item android:offset=\"0\" android:color=\"#FFFFFFFF\"/>\n        <item android:offset=\"1\" android:color=\"#FFEDE6DE\"/>\n      </gradient>\n    </aapt:attr>\n  </path>\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"Theme.AppCompat.NoActionBar\">\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    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <domain-config cleartextTrafficPermitted=\"true\">\n        <domain includeSubdomains=\"true\">explorer.pascalcoin.org</domain>\n    </domain-config>\n</network-security-config>"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.appditto.blaise\">\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.4.31'\n\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.1.2'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath 'com.google.gms:google-services:4.3.4'\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}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/fastlane/Appfile",
    "content": "json_key_file(\"~/appditto/keys/playapi_key.json\") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one\npackage_name(\"com.appditto.blaise\") # e.g. com.krausefx.app\n"
  },
  {
    "path": "android/fastlane/Fastfile",
    "content": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n# For a list of all available actions, check out\n#\n#     https://docs.fastlane.tools/actions\n#\n# For a list of all available plugins, check out\n#\n#     https://docs.fastlane.tools/plugins/available-plugins\n#\n\ndefault_platform(:android)\n\nplatform :android do\n  before_all  do |lane, options|\n    update_fastlane\n  end\n\n  desc \"Build android aab and apk\"\n  lane :build_android do |options|\n    sh \"./flutter_build.sh --clean\"\n    sh \"./flutter_build.sh --apk\"\n  end\n\n  desc \"Deploy (Upload to play store)\"\n  lane :deploy_android do |options|\n    upload_to_play_store(\n      track: options[:production] ? 'production' : options[:internal] ? 'internal' : options[:alpha] ? 'alpha' : 'beta',\n      aab: ENV['AAB_PATH'],\n      skip_upload_images: true,\n      skip_upload_screenshots: true,\n    )\n  end\nend"
  },
  {
    "path": "android/fastlane/flutter_build.sh",
    "content": "#!/bin/bash\n\ncd ../../\nif [ \"$1\" == \"--clean\" ]\nthen\n   echo \"Running clean...\"\n   flutter clean\nelse\n   echo \"Skipping clean...\"\nfi\nif [ \"$1\" == \"--apk\" ]\nthen\n   echo \"Building APK...\"\n   flutter build apk --release\nelse\n   echo \"Building AAB...\"\n   flutter build appbundle --release\nfi"
  },
  {
    "path": "android/fastlane/flutter_test.sh",
    "content": "#!/bin/bash\n\ncd ../../\necho \"Running tests\"\nflutter test\n"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/1.txt",
    "content": "Initial Beta Release"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/17.txt",
    "content": "- Add themes to QR scanner\n"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/18.txt",
    "content": "- Add themes to QR scanner"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/20.txt",
    "content": "- Improve QR Scanner reliability on some devices\n- Add Catalan language\n- Performance improvements and bug fixes"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/22.txt",
    "content": "- Live chat removed"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/23.txt",
    "content": "- General bug fixes & improvements"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/changelogs/24.txt",
    "content": "- Disallow 0-fee transactions\n- Android 12 compatibility\n- Performance improvements\n- Bug fixes"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/full_description.txt",
    "content": "Features:\n\n- Create a new Pascal wallet or import an existing one\n- Manage multiple Pascal accounts (PASAs)\n- Send Pascal instantly to anyone, anywhere in the world\n- Change account names, transfer accounts, or list them for sale\n- Manage contacts in an intuitive, easy-to-use address book\n- View your accounts operations history\n- Easily obtain new accounts by borrowing them or using the built-in freepasa integration\n- Receive push notifications when you receive Pascal\n- If you have questions, we can help - get live support directly from the developers\n\nIMPORTANT:\n\nRemember to backup your private key and store it in a safe place. It is the only way to recover your funds if you sign out of the wallet or lose your device! If someone else gets your unencrypted private key, they will have full control over your funds.\n\nFor support:\nhelp@appditto.com\n\nPascalCoin website:\nhttps://pascalcoin.org"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/short_description.txt",
    "content": "Simple, Sleek, & Secure Pascal Wallet"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/title.txt",
    "content": "Blaise - Pascal Wallet"
  },
  {
    "path": "android/fastlane/metadata/android/en-US/video.txt",
    "content": ""
  },
  {
    "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-6.5.1-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.enableJetifier=true\nandroid.useAndroidX=true\nandroid.enableR8=true\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "assets/country_phone_map.json",
    "content": "[\n    {\n       \"iso\": \"AF\",\n       \"text\": \"Afghanistan (+93)\"\n    },\n    {\n       \"iso\": \"AL\",\n       \"text\": \"Albania (+355)\"\n    },\n    {\n       \"iso\": \"DZ\",\n       \"text\": \"Algeria (+213)\"\n    },\n    {\n       \"iso\": \"AS\",\n       \"text\": \"American Samoa (+1)\"\n    },\n    {\n       \"iso\": \"AD\",\n       \"text\": \"Andorra (+376)\"\n    },\n    {\n       \"iso\": \"AO\",\n       \"text\": \"Angola (+244)\"\n    },\n    {\n       \"iso\": \"AI\",\n       \"text\": \"Anguilla (+1)\"\n    },\n    {\n       \"iso\": \"AG\",\n       \"text\": \"Antigua & Barbuda (+1)\"\n    },\n    {\n       \"iso\": \"AR\",\n       \"text\": \"Argentina (+54)\"\n    },\n    {\n       \"iso\": \"AM\",\n       \"text\": \"Armenia (+374)\"\n    },\n    {\n       \"iso\": \"AW\",\n       \"text\": \"Aruba (+297)\"\n    },\n    {\n       \"iso\": \"AC\",\n       \"text\": \"Ascension Island (+247)\"\n    },\n    {\n       \"iso\": \"AU\",\n       \"text\": \"Australia (+61)\"\n    },\n    {\n       \"iso\": \"AT\",\n       \"text\": \"Austria (+43)\"\n    },\n    {\n       \"iso\": \"AZ\",\n       \"text\": \"Azerbaijan (+994)\"\n    },\n    {\n       \"iso\": \"BS\",\n       \"text\": \"Bahamas (+1)\"\n    },\n    {\n       \"iso\": \"BH\",\n       \"text\": \"Bahrain (+973)\"\n    },\n    {\n       \"iso\": \"BD\",\n       \"text\": \"Bangladesh (+880)\"\n    },\n    {\n       \"iso\": \"BB\",\n       \"text\": \"Barbados (+1)\"\n    },\n    {\n       \"iso\": \"BY\",\n       \"text\": \"Belarus (+375)\"\n    },\n    {\n       \"iso\": \"BE\",\n       \"text\": \"Belgium (+32)\"\n    },\n    {\n       \"iso\": \"BZ\",\n       \"text\": \"Belize (+501)\"\n    },\n    {\n       \"iso\": \"BJ\",\n       \"text\": \"Benin (+229)\"\n    },\n    {\n       \"iso\": \"BM\",\n       \"text\": \"Bermuda (+1)\"\n    },\n    {\n       \"iso\": \"BT\",\n       \"text\": \"Bhutan (+975)\"\n    },\n    {\n       \"iso\": \"BO\",\n       \"text\": \"Bolivia (+591)\"\n    },\n    {\n       \"iso\": \"BA\",\n       \"text\": \"Bosnia & Herzegovina (+387)\"\n    },\n    {\n       \"iso\": \"BW\",\n       \"text\": \"Botswana (+267)\"\n    },\n    {\n       \"iso\": \"BR\",\n       \"text\": \"Brazil (+55)\"\n    },\n    {\n       \"iso\": \"IO\",\n       \"text\": \"British Indian Ocean Territory (+246)\"\n    },\n    {\n       \"iso\": \"VG\",\n       \"text\": \"British Virgin Islands (+1)\"\n    },\n    {\n       \"iso\": \"BN\",\n       \"text\": \"Brunei (+673)\"\n    },\n    {\n       \"iso\": \"BG\",\n       \"text\": \"Bulgaria (+359)\"\n    },\n    {\n       \"iso\": \"BF\",\n       \"text\": \"Burkina Faso (+226)\"\n    },\n    {\n       \"iso\": \"BI\",\n       \"text\": \"Burundi (+257)\"\n    },\n    {\n       \"iso\": \"KH\",\n       \"text\": \"Cambodia (+855)\"\n    },\n    {\n       \"iso\": \"CM\",\n       \"text\": \"Cameroon (+237)\"\n    },\n    {\n       \"iso\": \"CA\",\n       \"text\": \"Canada (+1)\"\n    },\n    {\n       \"iso\": \"CV\",\n       \"text\": \"Cape Verde (+238)\"\n    },\n    {\n       \"iso\": \"BQ\",\n       \"text\": \"Caribbean Netherlands (+599)\"\n    },\n    {\n       \"iso\": \"KY\",\n       \"text\": \"Cayman Islands (+1)\"\n    },\n    {\n       \"iso\": \"CF\",\n       \"text\": \"Central African Republic (+236)\"\n    },\n    {\n       \"iso\": \"TD\",\n       \"text\": \"Chad (+235)\"\n    },\n    {\n       \"iso\": \"CL\",\n       \"text\": \"Chile (+56)\"\n    },\n    {\n       \"iso\": \"CN\",\n       \"text\": \"China (+86)\"\n    },\n    {\n       \"iso\": \"CX\",\n       \"text\": \"Christmas Island (+61)\"\n    },\n    {\n       \"iso\": \"CC\",\n       \"text\": \"Cocos (Keeling) Islands (+61)\"\n    },\n    {\n       \"iso\": \"CO\",\n       \"text\": \"Colombia (+57)\"\n    },\n    {\n       \"iso\": \"KM\",\n       \"text\": \"Comoros (+269)\"\n    },\n    {\n       \"iso\": \"CG\",\n       \"text\": \"Congo - Brazzaville (+242)\"\n    },\n    {\n       \"iso\": \"CD\",\n       \"text\": \"Congo - Kinshasa (+243)\"\n    },\n    {\n       \"iso\": \"CK\",\n       \"text\": \"Cook Islands (+682)\"\n    },\n    {\n       \"iso\": \"CR\",\n       \"text\": \"Costa Rica (+506)\"\n    },\n    {\n       \"iso\": \"HR\",\n       \"text\": \"Croatia (+385)\"\n    },\n    {\n       \"iso\": \"CU\",\n       \"text\": \"Cuba (+53)\"\n    },\n    {\n       \"iso\": \"CW\",\n       \"text\": \"Curaçao (+599)\"\n    },\n    {\n       \"iso\": \"CY\",\n       \"text\": \"Cyprus (+357)\"\n    },\n    {\n       \"iso\": \"CZ\",\n       \"text\": \"Czechia (+420)\"\n    },\n    {\n       \"iso\": \"CI\",\n       \"text\": \"Côte d’Ivoire (+225)\"\n    },\n    {\n       \"iso\": \"DK\",\n       \"text\": \"Denmark (+45)\"\n    },\n    {\n       \"iso\": \"DJ\",\n       \"text\": \"Djibouti (+253)\"\n    },\n    {\n       \"iso\": \"DM\",\n       \"text\": \"Dominica (+1)\"\n    },\n    {\n       \"iso\": \"DO\",\n       \"text\": \"Dominican Republic (+1)\"\n    },\n    {\n       \"iso\": \"EC\",\n       \"text\": \"Ecuador (+593)\"\n    },\n    {\n       \"iso\": \"EG\",\n       \"text\": \"Egypt (+20)\"\n    },\n    {\n       \"iso\": \"SV\",\n       \"text\": \"El Salvador (+503)\"\n    },\n    {\n       \"iso\": \"GQ\",\n       \"text\": \"Equatorial Guinea (+240)\"\n    },\n    {\n       \"iso\": \"ER\",\n       \"text\": \"Eritrea (+291)\"\n    },\n    {\n       \"iso\": \"EE\",\n       \"text\": \"Estonia (+372)\"\n    },\n    {\n       \"iso\": \"ET\",\n       \"text\": \"Ethiopia (+251)\"\n    },\n    {\n       \"iso\": \"FK\",\n       \"text\": \"Falkland Islands (+500)\"\n    },\n    {\n       \"iso\": \"FO\",\n       \"text\": \"Faroe Islands (+298)\"\n    },\n    {\n       \"iso\": \"FJ\",\n       \"text\": \"Fiji (+679)\"\n    },\n    {\n       \"iso\": \"FI\",\n       \"text\": \"Finland (+358)\"\n    },\n    {\n       \"iso\": \"FR\",\n       \"text\": \"France (+33)\"\n    },\n    {\n       \"iso\": \"GF\",\n       \"text\": \"French Guiana (+594)\"\n    },\n    {\n       \"iso\": \"PF\",\n       \"text\": \"French Polynesia (+689)\"\n    },\n    {\n       \"iso\": \"GA\",\n       \"text\": \"Gabon (+241)\"\n    },\n    {\n       \"iso\": \"GM\",\n       \"text\": \"Gambia (+220)\"\n    },\n    {\n       \"iso\": \"GE\",\n       \"text\": \"Georgia (+995)\"\n    },\n    {\n       \"iso\": \"DE\",\n       \"text\": \"Germany (+49)\"\n    },\n    {\n       \"iso\": \"GH\",\n       \"text\": \"Ghana (+233)\"\n    },\n    {\n       \"iso\": \"GI\",\n       \"text\": \"Gibraltar (+350)\"\n    },\n    {\n       \"iso\": \"GR\",\n       \"text\": \"Greece (+30)\"\n    },\n    {\n       \"iso\": \"GL\",\n       \"text\": \"Greenland (+299)\"\n    },\n    {\n       \"iso\": \"GD\",\n       \"text\": \"Grenada (+1)\"\n    },\n    {\n       \"iso\": \"GP\",\n       \"text\": \"Guadeloupe (+590)\"\n    },\n    {\n       \"iso\": \"GU\",\n       \"text\": \"Guam (+1)\"\n    },\n    {\n       \"iso\": \"GT\",\n       \"text\": \"Guatemala (+502)\"\n    },\n    {\n       \"iso\": \"GG\",\n       \"text\": \"Guernsey (+44)\"\n    },\n    {\n       \"iso\": \"GN\",\n       \"text\": \"Guinea (+224)\"\n    },\n    {\n       \"iso\": \"GW\",\n       \"text\": \"Guinea-Bissau (+245)\"\n    },\n    {\n       \"iso\": \"GY\",\n       \"text\": \"Guyana (+592)\"\n    },\n    {\n       \"iso\": \"HT\",\n       \"text\": \"Haiti (+509)\"\n    },\n    {\n       \"iso\": \"HN\",\n       \"text\": \"Honduras (+504)\"\n    },\n    {\n       \"iso\": \"HK\",\n       \"text\": \"Hong Kong SAR China (+852)\"\n    },\n    {\n       \"iso\": \"HU\",\n       \"text\": \"Hungary (+36)\"\n    },\n    {\n       \"iso\": \"IS\",\n       \"text\": \"Iceland (+354)\"\n    },\n    {\n       \"iso\": \"IN\",\n       \"text\": \"India (+91)\"\n    },\n    {\n       \"iso\": \"ID\",\n       \"text\": \"Indonesia (+62)\"\n    },\n    {\n       \"iso\": \"IR\",\n       \"text\": \"Iran (+98)\"\n    },\n    {\n       \"iso\": \"IQ\",\n       \"text\": \"Iraq (+964)\"\n    },\n    {\n       \"iso\": \"IE\",\n       \"text\": \"Ireland (+353)\"\n    },\n    {\n       \"iso\": \"IM\",\n       \"text\": \"Isle of Man (+44)\"\n    },\n    {\n       \"iso\": \"IL\",\n       \"text\": \"Israel (+972)\"\n    },\n    {\n       \"iso\": \"IT\",\n       \"text\": \"Italy (+39)\"\n    },\n    {\n       \"iso\": \"JM\",\n       \"text\": \"Jamaica (+1)\"\n    },\n    {\n       \"iso\": \"JP\",\n       \"text\": \"Japan (+81)\"\n    },\n    {\n       \"iso\": \"JE\",\n       \"text\": \"Jersey (+44)\"\n    },\n    {\n       \"iso\": \"JO\",\n       \"text\": \"Jordan (+962)\"\n    },\n    {\n       \"iso\": \"KZ\",\n       \"text\": \"Kazakhstan (+7)\"\n    },\n    {\n       \"iso\": \"KE\",\n       \"text\": \"Kenya (+254)\"\n    },\n    {\n       \"iso\": \"KI\",\n       \"text\": \"Kiribati (+686)\"\n    },\n    {\n       \"iso\": \"XK\",\n       \"text\": \"Kosovo (+383)\"\n    },\n    {\n       \"iso\": \"KW\",\n       \"text\": \"Kuwait (+965)\"\n    },\n    {\n       \"iso\": \"KG\",\n       \"text\": \"Kyrgyzstan (+996)\"\n    },\n    {\n       \"iso\": \"LA\",\n       \"text\": \"Laos (+856)\"\n    },\n    {\n       \"iso\": \"LV\",\n       \"text\": \"Latvia (+371)\"\n    },\n    {\n       \"iso\": \"LB\",\n       \"text\": \"Lebanon (+961)\"\n    },\n    {\n       \"iso\": \"LS\",\n       \"text\": \"Lesotho (+266)\"\n    },\n    {\n       \"iso\": \"LR\",\n       \"text\": \"Liberia (+231)\"\n    },\n    {\n       \"iso\": \"LY\",\n       \"text\": \"Libya (+218)\"\n    },\n    {\n       \"iso\": \"LI\",\n       \"text\": \"Liechtenstein (+423)\"\n    },\n    {\n       \"iso\": \"LT\",\n       \"text\": \"Lithuania (+370)\"\n    },\n    {\n       \"iso\": \"LU\",\n       \"text\": \"Luxembourg (+352)\"\n    },\n    {\n       \"iso\": \"MO\",\n       \"text\": \"Macau SAR China (+853)\"\n    },\n    {\n       \"iso\": \"MK\",\n       \"text\": \"Macedonia (+389)\"\n    },\n    {\n       \"iso\": \"MG\",\n       \"text\": \"Madagascar (+261)\"\n    },\n    {\n       \"iso\": \"MW\",\n       \"text\": \"Malawi (+265)\"\n    },\n    {\n       \"iso\": \"MY\",\n       \"text\": \"Malaysia (+60)\"\n    },\n    {\n       \"iso\": \"MV\",\n       \"text\": \"Maldives (+960)\"\n    },\n    {\n       \"iso\": \"ML\",\n       \"text\": \"Mali (+223)\"\n    },\n    {\n       \"iso\": \"MT\",\n       \"text\": \"Malta (+356)\"\n    },\n    {\n       \"iso\": \"MH\",\n       \"text\": \"Marshall Islands (+692)\"\n    },\n    {\n       \"iso\": \"MQ\",\n       \"text\": \"Martinique (+596)\"\n    },\n    {\n       \"iso\": \"MR\",\n       \"text\": \"Mauritania (+222)\"\n    },\n    {\n       \"iso\": \"MU\",\n       \"text\": \"Mauritius (+230)\"\n    },\n    {\n       \"iso\": \"YT\",\n       \"text\": \"Mayotte (+262)\"\n    },\n    {\n       \"iso\": \"MX\",\n       \"text\": \"Mexico (+52)\"\n    },\n    {\n       \"iso\": \"FM\",\n       \"text\": \"Micronesia (+691)\"\n    },\n    {\n       \"iso\": \"MD\",\n       \"text\": \"Moldova (+373)\"\n    },\n    {\n       \"iso\": \"MC\",\n       \"text\": \"Monaco (+377)\"\n    },\n    {\n       \"iso\": \"MN\",\n       \"text\": \"Mongolia (+976)\"\n    },\n    {\n       \"iso\": \"ME\",\n       \"text\": \"Montenegro (+382)\"\n    },\n    {\n       \"iso\": \"MS\",\n       \"text\": \"Montserrat (+1)\"\n    },\n    {\n       \"iso\": \"MA\",\n       \"text\": \"Morocco (+212)\"\n    },\n    {\n       \"iso\": \"MZ\",\n       \"text\": \"Mozambique (+258)\"\n    },\n    {\n       \"iso\": \"MM\",\n       \"text\": \"Myanmar (Burma) (+95)\"\n    },\n    {\n       \"iso\": \"NA\",\n       \"text\": \"Namibia (+264)\"\n    },\n    {\n       \"iso\": \"NR\",\n       \"text\": \"Nauru (+674)\"\n    },\n    {\n       \"iso\": \"NP\",\n       \"text\": \"Nepal (+977)\"\n    },\n    {\n       \"iso\": \"NL\",\n       \"text\": \"Netherlands (+31)\"\n    },\n    {\n       \"iso\": \"NC\",\n       \"text\": \"New Caledonia (+687)\"\n    },\n    {\n       \"iso\": \"NZ\",\n       \"text\": \"New Zealand (+64)\"\n    },\n    {\n       \"iso\": \"NI\",\n       \"text\": \"Nicaragua (+505)\"\n    },\n    {\n       \"iso\": \"NE\",\n       \"text\": \"Niger (+227)\"\n    },\n    {\n       \"iso\": \"NG\",\n       \"text\": \"Nigeria (+234)\"\n    },\n    {\n       \"iso\": \"NU\",\n       \"text\": \"Niue (+683)\"\n    },\n    {\n       \"iso\": \"NF\",\n       \"text\": \"Norfolk Island (+672)\"\n    },\n    {\n       \"iso\": \"KP\",\n       \"text\": \"North Korea (+850)\"\n    },\n    {\n       \"iso\": \"MP\",\n       \"text\": \"Northern Mariana Islands (+1)\"\n    },\n    {\n       \"iso\": \"NO\",\n       \"text\": \"Norway (+47)\"\n    },\n    {\n       \"iso\": \"OM\",\n       \"text\": \"Oman (+968)\"\n    },\n    {\n       \"iso\": \"PK\",\n       \"text\": \"Pakistan (+92)\"\n    },\n    {\n       \"iso\": \"PW\",\n       \"text\": \"Palau (+680)\"\n    },\n    {\n       \"iso\": \"PS\",\n       \"text\": \"Palestinian Territories (+970)\"\n    },\n    {\n       \"iso\": \"PA\",\n       \"text\": \"Panama (+507)\"\n    },\n    {\n       \"iso\": \"PG\",\n       \"text\": \"Papua New Guinea (+675)\"\n    },\n    {\n       \"iso\": \"PY\",\n       \"text\": \"Paraguay (+595)\"\n    },\n    {\n       \"iso\": \"PE\",\n       \"text\": \"Peru (+51)\"\n    },\n    {\n       \"iso\": \"PH\",\n       \"text\": \"Philippines (+63)\"\n    },\n    {\n       \"iso\": \"PL\",\n       \"text\": \"Poland (+48)\"\n    },\n    {\n       \"iso\": \"PT\",\n       \"text\": \"Portugal (+351)\"\n    },\n    {\n       \"iso\": \"PR\",\n       \"text\": \"Puerto Rico (+1)\"\n    },\n    {\n       \"iso\": \"QA\",\n       \"text\": \"Qatar (+974)\"\n    },\n    {\n       \"iso\": \"RO\",\n       \"text\": \"Romania (+40)\"\n    },\n    {\n       \"iso\": \"RU\",\n       \"text\": \"Russia (+7)\"\n    },\n    {\n       \"iso\": \"RW\",\n       \"text\": \"Rwanda (+250)\"\n    },\n    {\n       \"iso\": \"RE\",\n       \"text\": \"Réunion (+262)\"\n    },\n    {\n       \"iso\": \"WS\",\n       \"text\": \"Samoa (+685)\"\n    },\n    {\n       \"iso\": \"SM\",\n       \"text\": \"San Marino (+378)\"\n    },\n    {\n       \"iso\": \"SA\",\n       \"text\": \"Saudi Arabia (+966)\"\n    },\n    {\n       \"iso\": \"SN\",\n       \"text\": \"Senegal (+221)\"\n    },\n    {\n       \"iso\": \"RS\",\n       \"text\": \"Serbia (+381)\"\n    },\n    {\n       \"iso\": \"SC\",\n       \"text\": \"Seychelles (+248)\"\n    },\n    {\n       \"iso\": \"SL\",\n       \"text\": \"Sierra Leone (+232)\"\n    },\n    {\n       \"iso\": \"SG\",\n       \"text\": \"Singapore (+65)\"\n    },\n    {\n       \"iso\": \"SX\",\n       \"text\": \"Sint Maarten (+1)\"\n    },\n    {\n       \"iso\": \"SK\",\n       \"text\": \"Slovakia (+421)\"\n    },\n    {\n       \"iso\": \"SI\",\n       \"text\": \"Slovenia (+386)\"\n    },\n    {\n       \"iso\": \"SB\",\n       \"text\": \"Solomon Islands (+677)\"\n    },\n    {\n       \"iso\": \"SO\",\n       \"text\": \"Somalia (+252)\"\n    },\n    {\n       \"iso\": \"ZA\",\n       \"text\": \"South Africa (+27)\"\n    },\n    {\n       \"iso\": \"KR\",\n       \"text\": \"South Korea (+82)\"\n    },\n    {\n       \"iso\": \"SS\",\n       \"text\": \"South Sudan (+211)\"\n    },\n    {\n       \"iso\": \"ES\",\n       \"text\": \"Spain (+34)\"\n    },\n    {\n       \"iso\": \"LK\",\n       \"text\": \"Sri Lanka (+94)\"\n    },\n    {\n       \"iso\": \"BL\",\n       \"text\": \"St. Barthélemy (+590)\"\n    },\n    {\n       \"iso\": \"SH\",\n       \"text\": \"St. Helena (+290)\"\n    },\n    {\n       \"iso\": \"KN\",\n       \"text\": \"St. Kitts & Nevis (+1)\"\n    },\n    {\n       \"iso\": \"LC\",\n       \"text\": \"St. Lucia (+1)\"\n    },\n    {\n       \"iso\": \"MF\",\n       \"text\": \"St. Martin (+590)\"\n    },\n    {\n       \"iso\": \"PM\",\n       \"text\": \"St. Pierre & Miquelon (+508)\"\n    },\n    {\n       \"iso\": \"VC\",\n       \"text\": \"St. Vincent & Grenadines (+1)\"\n    },\n    {\n       \"iso\": \"SD\",\n       \"text\": \"Sudan (+249)\"\n    },\n    {\n       \"iso\": \"SR\",\n       \"text\": \"Suriname (+597)\"\n    },\n    {\n       \"iso\": \"SJ\",\n       \"text\": \"Svalbard & Jan Mayen (+47)\"\n    },\n    {\n       \"iso\": \"SZ\",\n       \"text\": \"Swaziland (+268)\"\n    },\n    {\n       \"iso\": \"SE\",\n       \"text\": \"Sweden (+46)\"\n    },\n    {\n       \"iso\": \"CH\",\n       \"text\": \"Switzerland (+41)\"\n    },\n    {\n       \"iso\": \"SY\",\n       \"text\": \"Syria (+963)\"\n    },\n    {\n       \"iso\": \"ST\",\n       \"text\": \"São Tomé & Príncipe (+239)\"\n    },\n    {\n       \"iso\": \"TW\",\n       \"text\": \"Taiwan (+886)\"\n    },\n    {\n       \"iso\": \"TJ\",\n       \"text\": \"Tajikistan (+992)\"\n    },\n    {\n       \"iso\": \"TZ\",\n       \"text\": \"Tanzania (+255)\"\n    },\n    {\n       \"iso\": \"TH\",\n       \"text\": \"Thailand (+66)\"\n    },\n    {\n       \"iso\": \"TL\",\n       \"text\": \"Timor-Leste (+670)\"\n    },\n    {\n       \"iso\": \"TG\",\n       \"text\": \"Togo (+228)\"\n    },\n    {\n       \"iso\": \"TK\",\n       \"text\": \"Tokelau (+690)\"\n    },\n    {\n       \"iso\": \"TO\",\n       \"text\": \"Tonga (+676)\"\n    },\n    {\n       \"iso\": \"TT\",\n       \"text\": \"Trinidad & Tobago (+1)\"\n    },\n    {\n       \"iso\": \"TA\",\n       \"text\": \"Tristan da Cunha (+290)\"\n    },\n    {\n       \"iso\": \"TN\",\n       \"text\": \"Tunisia (+216)\"\n    },\n    {\n       \"iso\": \"TR\",\n       \"text\": \"Turkey (+90)\"\n    },\n    {\n       \"iso\": \"TM\",\n       \"text\": \"Turkmenistan (+993)\"\n    },\n    {\n       \"iso\": \"TC\",\n       \"text\": \"Turks & Caicos Islands (+1)\"\n    },\n    {\n       \"iso\": \"TV\",\n       \"text\": \"Tuvalu (+688)\"\n    },\n    {\n       \"iso\": \"VI\",\n       \"text\": \"U.S. Virgin Islands (+1)\"\n    },\n    {\n       \"iso\": \"UG\",\n       \"text\": \"Uganda (+256)\"\n    },\n    {\n       \"iso\": \"UA\",\n       \"text\": \"Ukraine (+380)\"\n    },\n    {\n       \"iso\": \"AE\",\n       \"text\": \"United Arab Emirates (+971)\"\n    },\n    {\n       \"iso\": \"GB\",\n       \"text\": \"United Kingdom (+44)\"\n    },\n    {\n       \"iso\": \"US\",\n       \"text\": \"United States (+1)\"\n    },\n    {\n       \"iso\": \"UY\",\n       \"text\": \"Uruguay (+598)\"\n    },\n    {\n       \"iso\": \"UZ\",\n       \"text\": \"Uzbekistan (+998)\"\n    },\n    {\n       \"iso\": \"VU\",\n       \"text\": \"Vanuatu (+678)\"\n    },\n    {\n       \"iso\": \"VA\",\n       \"text\": \"Vatican City (+39)\"\n    },\n    {\n       \"iso\": \"VE\",\n       \"text\": \"Venezuela (+58)\"\n    },\n    {\n       \"iso\": \"VN\",\n       \"text\": \"Vietnam (+84)\"\n    },\n    {\n       \"iso\": \"WF\",\n       \"text\": \"Wallis & Futuna (+681)\"\n    },\n    {\n       \"iso\": \"EH\",\n       \"text\": \"Western Sahara (+212)\"\n    },\n    {\n       \"iso\": \"YE\",\n       \"text\": \"Yemen (+967)\"\n    },\n    {\n       \"iso\": \"ZM\",\n       \"text\": \"Zambia (+260)\"\n    },\n    {\n       \"iso\": \"ZW\",\n       \"text\": \"Zimbabwe (+263)\"\n    },\n    {\n       \"iso\": \"AX\",\n       \"text\": \"Åland Islands (+358)\"\n    }\n ]"
  },
  {
    "path": "bin/arb_to_pojson.py",
    "content": "#!/usr/bin/env python\nimport argparse\nimport json\nimport sys\n\nparser = argparse.ArgumentParser()\nparser.add_argument('-f', '--file', help='Path to arb file', required=True)\noptions = parser.parse_args()\n\nif not options.file.endswith(\"arb\"):\n    print(f\"Can't process {options.file}, file must be a .arb\")\n    parser.print_help()\n    sys.exit(0)\n\nout_file = options.file.replace(\".arb\", \".json\")\nret = []\nwith open(options.file) as arb_file:\n    data = json.load(arb_file)\n    obj = {}\n    for key, value in data.items():\n        if key.startswith(\"@@\"):\n            continue\n        if key.startswith(\"@\"):\n            obj['context'] = value['description']\n            ret.append(obj)\n            obj = {}\n        else:\n            obj['reference'] = key\n            obj['term'] = value.replace(\"\\n\", \"<newline>\")\nwith open(out_file, 'w') as outf:\n    json.dump(ret, outf, indent=4, ensure_ascii=False)\n    print(f\"Wrote {out_file}\")\n"
  },
  {
    "path": "bin/pojson_to_arb.py",
    "content": "#!/usr/bin/env python\nimport argparse\nimport json\nimport sys\n\nparser = argparse.ArgumentParser()\nparser.add_argument('-f', '--file', help='Path to json file', required=True)\noptions = parser.parse_args()\n\nif not options.file.endswith(\"json\"):\n    print(f\"Can't process {options.file}, file must be a .jon\")\n    parser.print_help()\n    sys.exit(0)\n\nout_file = options.file.replace(\".json\", \".arb\")\nret = {}\nwith open(options.file) as json_file:\n    data = json.load(json_file)\n    for obj in data:\n        ret[obj['reference']] = obj['definition'].replace(\"<newline>\", \"\\n\")\nwith open(out_file, 'w') as outf:\n    json.dump(ret, outf, indent=2, ensure_ascii=False)\n    print(f\"Wrote {out_file}\")\n"
  },
  {
    "path": "bin/poupdate.py",
    "content": "import os\nimport json\nimport subprocess\nfrom poeditor import POEditorAPI\nfrom settings import PO_API_KEY, PROJECT_ID\n\nclient = POEditorAPI(api_token=PO_API_KEY)\n\nlanguages = client.list_project_languages(PROJECT_ID)\n\nlanguage_codes = []\n\nfor l in languages:\n    if l['percentage'] > 50:\n        language_codes.append(l['code'])\n\nfor code in language_codes:\n        print(f\"Downloading {code}...\")\n        client.export(PROJECT_ID, code, file_type='json', local_file=f'lib/l10n/intl_{code}.json')\n        print(f\"Downloaded {code}\")\n\nfor fname in os.listdir('lib/l10n'):\n        if fname.endswith('.json'):\n                fname = f'lib/l10n/{fname}'\n                out_file = fname.replace(\".json\", \".arb\")\n                ret = {}\n                with open(fname) as json_file:\n                    data = json.load(json_file)\n                    for obj in data:\n                        if 'reference' in obj and 'definition' in obj and obj['definition'] is not None:\n                                ret[obj['reference']] = obj['definition'].replace(\"<newline>\", \"\\n\")\n                with open(out_file, 'w') as outf:\n                    json.dump(ret, outf, indent=2, ensure_ascii=False)\n                    print(f\"Wrote {out_file}\")\n                os.remove(fname)\n\nsubprocess.run('flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/localization.dart lib/l10n/intl_*.arb', shell=True)"
  },
  {
    "path": "bin/settings.py.example",
    "content": "PO_API_KEY='1234'\nPROJECT_ID=1234"
  },
  {
    "path": "ci/get_version.sh",
    "content": "#!/bin/bash\n# Parse yaml file\nparse_yaml() {\n    local prefix=$2\n    local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\\034')\n    sed -ne \"s|^\\($s\\)\\($w\\)$s:$s\\\"\\(.*\\)\\\"$s\\$|\\1$fs\\2$fs\\3|p\" \\\n            -e \"s|^\\($s\\)\\($w\\)$s:$s\\(.*\\)$s\\$|\\1$fs\\2$fs\\3|p\"  $1 |\n    awk -F$fs '{\n        indent = length($1)/2;\n        vname[indent] = $2;\n        for (i in vname) {if (i > indent) {delete vname[i]}}\n        if (length($3) > 0) {\n            vn=\"\"; for (i=0; i<indent; i++) {vn=(vn)(vname[i])(\"_\")}\n            printf(\"%s%s%s=\\\"%s\\\"\\n\", \"'$prefix'\",vn, $2, $3);\n        }\n    }'\n}\n\nget_version() {\n    # Read pubspec\n    eval $(parse_yaml pubspec.yaml \"config_\")\n\n    # Get VERSION\n    echo \"v$(echo $config_version | cut -f1 -d\"+\")\"\n}\n"
  },
  {
    "path": "ci/tag_version.sh",
    "content": "#!/bin/bash\n\nsource ./ci/get_version.sh\n\nVERSION=$(get_version)\nGITHUB_OAUTH_BASIC=\"${GITHUB_API_TOKEN}:x-oauth-basic\"\nAUTH=\"Authorization: token $GITHUB_API_TOKEN\"\nGH_PUBLISH=\"$GH_REPO/releases\"\n\n# See if TAG exists\n\n#export GIT_DIR=./.git\n#if git rev-parse $VERSION >/dev/null 2>&1\n#then\n#    echo \"Tag already exists\"\n#    exit 0\n#fi\n#echo \"Tag not found, creating...\"\n#git tag -d $VERSION\n#git tag $VERSION HEAD\n#git push origin :$VERSION\n#git push origin $VERSION\n#if [ $? -ne 0 ]\n#then\n#    echo \"Fatal, failed to push tag $VERSION\"\n#    exit 1\n#fi\n\npubresponse=$(curl -u \"$GITHUB_OAUTH_BASIC\" -sH \"$AUTH\" --data '{\"tag_name\":\"'\"$VERSION\"'\", \"name\":\"Blaise '\"${VERSION}\"'\", \"draft\":false, \"prerelease\":false}' $GH_PUBLISH)\nif [[ \"$pubresponse\" == *\"already_exists\"* ]]; then\n  echo \"Tag already exists, skipping\"\n   exit 0\nelif [[ \"$pubresponse\" == *\"Validation Failed\"* ]]; then\n  echo \"Error! ${pubresponse}\"\n  exit 1\nfi\necho \"Release created\"\nexit 0\n"
  },
  {
    "path": "ci/upload_android_github.sh",
    "content": "#!/bin/bash\n#\n# Based on:\n\n# https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447\n#\n# Uploads our android release APK to a corresponding release on github releases page\n#\n\nsource ./ci/get_version.sh\nVERSION=$(get_version)\n\n# Define variables.\nGH_TAGS=\"$GH_REPO/releases/tags/$VERSION\"\nGH_PUBLISH=\"$GH_REPO/releases\"\nWGET_ARGS=\"--content-disposition --auth-no-challenge --no-cookie\"\nCURL_ARGS=\"-LJO#\"\nfilename=./build/app/outputs/apk/release/app-release.apk\nGITHUB_OAUTH_BASIC=\"${GITHUB_API_TOKEN}:x-oauth-basic\"\n\nAUTH=\"Authorization: token $GITHUB_API_TOKEN\"\n\n# Validate token.\ncurl -o /dev/null -sH \"$AUTH\" $GH_REPO || { echo \"Error: Invalid repo, token or network issue!\";  exit 1; }\n\n# Read asset tags.\nresponse=$(curl -u \"$GITHUB_OAUTH_BASIC\" -sH \"$AUTH\" $GH_TAGS)\n\n# Get ID of the asset based on given filename.\neval $(echo \"$response\" | grep -m 1 \"id.:\" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')\n[ \"$id\" ] || {\n  echo \"Error: Failed to get release id for tag: $VERSION\";\n  echo \"$response\" awk 'length($0)<100' >&2;\n  exit 1;\n}\n# Upload asset\necho \"Uploading asset... $localAssetPath\" >&2\n\n# Construct url\nGH_ASSET=\"https://uploads.github.com/repos/$GH_OWNER/$GH_REPO_NAME/releases/$id/assets?name=blaise_${VERSION}.apk\"\n\ncurl -u \"$GITHUB_OAUTH_BASIC\" --data-binary @\"$filename\" -H \"$AUTH\" -H \"Content-Type: application/octet-stream\" $GH_ASSET\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/Flutter.podspec",
    "content": "#\n# NOTE: This podspec is NOT to be published. It is only used as a local source!\n#       This is a generated file; do not edit or check into version control.\n#\n\nPod::Spec.new do |s|\n  s.name             = 'Flutter'\n  s.version          = '1.0.0'\n  s.summary          = 'High-performance, high-fidelity mobile apps.'\n  s.homepage         = 'https://flutter.io'\n  s.license          = { :type => 'MIT' }\n  s.author           = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }\n  s.source           = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }\n  s.ios.deployment_target = '9.0'\n  # Framework linking is handled by Flutter tooling, not CocoaPods.\n  # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs.\n  s.vendored_frameworks = 'path/to/nothing'\nend\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/Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\ngem \"cocoapods\""
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :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.h",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : FlutterAppDelegate\n- (void)lc_setAlternateIconName:(NSString*)iconName;\n@end\n"
  },
  {
    "path": "ios/Runner/AppDelegate.m",
    "content": "#include \"AppDelegate.h\"\n#include \"GeneratedPluginRegistrant.h\"\n#import \"Runner-Swift.h\"\n\n@implementation AppDelegate\n\n- (void)lc_setAlternateIconName:(NSString*)iconName\n{\n    if ([[UIApplication sharedApplication] respondsToSelector:@selector(supportsAlternateIcons)] &&\n        [[UIApplication sharedApplication] supportsAlternateIcons])\n    {\n        NSMutableString *selectorString = [[NSMutableString alloc] initWithCapacity:40];\n        [selectorString appendString:@\"_setAlternate\"];\n        [selectorString appendString:@\"IconName:\"];\n        [selectorString appendString:@\"completionHandler:\"];\n        \n        SEL selector = NSSelectorFromString(selectorString);\n        IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];\n        void (*func)(id, SEL, id, id) = (void *)imp;\n        if (func)\n        {\n            func([UIApplication sharedApplication], selector, iconName, ^(NSError * _Nullable error) {});\n        }\n    }\n}\n\n- (BOOL)application:(UIApplication *)application\ndidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n    FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;\n    \n    FlutterMethodChannel* appChannel = [FlutterMethodChannel\n                                        methodChannelWithName:@\"fappchannel\"\n                                        binaryMessenger:controller];\n    \n    [appChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {\n        if ([@\"changeIcon\" isEqualToString:call.method]) {\n            NSDictionary *arguments = [call arguments];\n            NSString *icon = arguments[@\"icon\"];\n            if (icon == NULL || icon.length == 0) {\n                result([FlutterError errorWithCode:@\"error\"\n                                           message:@\"Icon is required\"\n                                           details:nil]);\n                return;\n            }\n            if ([@\"Light\" isEqualToString:icon ]) {\n                [self lc_setAlternateIconName:nil];\n            } else if ([@\"Dark\" isEqualToString:icon]) {\n                [self lc_setAlternateIconName:@\"Dark\"];\n            } else if ([@\"Copper\" isEqualToString:icon]) {\n                [self lc_setAlternateIconName:@\"Copper\"];\n            }\n        } else if ([@\"setSecureClipboardItem\" isEqualToString:call.method]) {\n            NSDictionary *arguments = [call arguments];\n            NSString *value = arguments[@\"value\"];\n            [SecureClipboard setClipboardItem:value];\n        } else {\n            result(FlutterMethodNotImplemented);\n        }\n    }];\n    \n    [GeneratedPluginRegistrant registerWithRegistry:self];\n    return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n\n@end\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\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 opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </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=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\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=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "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>786466973238-8v19gq83o927niadorolmvts501v3jn6.apps.googleusercontent.com</string>\n\t<key>REVERSED_CLIENT_ID</key>\n\t<string>com.googleusercontent.apps.786466973238-8v19gq83o927niadorolmvts501v3jn6</string>\n\t<key>API_KEY</key>\n\t<string>AIzaSyC-BXfz1vd342KBhsEK-7HwkVDZ9OFGCbg</string>\n\t<key>GCM_SENDER_ID</key>\n\t<string>786466973238</string>\n\t<key>PLIST_VERSION</key>\n\t<string>1</string>\n\t<key>BUNDLE_ID</key>\n\t<string>com.appditto.blaise</string>\n\t<key>PROJECT_ID</key>\n\t<string>blaise-a22fa</string>\n\t<key>STORAGE_BUCKET</key>\n\t<string>blaise-a22fa.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:786466973238:ios:59d3b6ab52a943d3</string>\n\t<key>DATABASE_URL</key>\n\t<string>https://blaise-a22fa.firebaseio.com</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</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>Blaise</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>CFBundleName</key>\n\t<string>blaise_wallet_flutter</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>NSCameraUsageDescription</key>\n\t<string>Camera permission is required for barcode scanning.</string>\n\t<key>NSFaceIDUsageDescription</key>\n\t<string>App needs to authenticate using faces.</string>\n\t<key>NSPhotoLibraryAddUsageDescription</key>\n\t<string>This app requires access to the photo library.</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>This app requires access to the photo library.</string>\n\t<key>UIBackgroundModes</key>\n\t<array>\n\t\t<string>fetch</string>\n\t\t<string>remote-notification</string>\n\t</array>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</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\t<key>CFBundleIcons</key>\n\t<dict>\n\t\t<key>CFBundlePrimaryIcon</key>\n\t\t<dict>\n\t\t\t<key>CFBundleIconFiles</key>\n\t\t\t<array>\n\t\t\t\t<string>Icon-App</string>\n\t\t\t</array>\n\t\t\t<key>UIPrerenderedIcon</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>CFBundleAlternateIcons</key>\n\t\t<dict>\n\t\t\t<key>Dark</key>\n\t\t\t<dict>\n\t\t\t\t<key>CFBundleIconFiles</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Dark-Icon-App</string>\n\t\t\t\t</array>\n\t\t\t\t<key>UIPrerenderedIcon</key>\n\t\t\t\t<false/>\n\t\t\t</dict>\n\t\t\t<key>Copper</key>\n\t\t\t<dict>\n\t\t\t\t<key>CFBundleIconFiles</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Copper-Icon-App</string>\n\t\t\t\t</array>\n\t\t\t\t<key>UIPrerenderedIcon</key>\n\t\t\t\t<false/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\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/clipboard.swift",
    "content": "import Foundation\nimport UIKit\nimport MobileCoreServices\n\n@objcMembers class SecureClipboard: NSObject {\n    static func setClipboardItem(_ value: String) {\n        let pasteboardItems = [[\n            kUTTypePlainText as String: value\n            ]]\n        let pasteboardOptions : [UIPasteboard.OptionsKey: Any] = [\n            UIPasteboard.OptionsKey.expirationDate: Date().addingTimeInterval(60 * 2),\n            UIPasteboard.OptionsKey.localOnly: true\n        ]\n        UIPasteboard.general.setItems(pasteboardItems, options: pasteboardOptions)\n    }\n}\n"
  },
  {
    "path": "ios/Runner/main.m",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char* argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t24FF04FFD6FD224422092912 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 42074951F44019CE5ACED5F2 /* Pods_Runner.framework */; };\n\t\t3961A6B22304917B0088A4FD /* Dark-Icon-App@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6A92304917A0088A4FD /* Dark-Icon-App@3x.png */; };\n\t\t3961A6B32304917B0088A4FD /* Icon-App@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AA2304917A0088A4FD /* Icon-App@3x.png */; };\n\t\t3961A6B42304917B0088A4FD /* Dark-Icon-App@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AB2304917A0088A4FD /* Dark-Icon-App@1x.png */; };\n\t\t3961A6B52304917B0088A4FD /* Icon-App@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AC2304917A0088A4FD /* Icon-App@1x.png */; };\n\t\t3961A6B62304917B0088A4FD /* Copper-Icon-App@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AD2304917A0088A4FD /* Copper-Icon-App@3x.png */; };\n\t\t3961A6B72304917B0088A4FD /* Dark-Icon-App@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AE2304917A0088A4FD /* Dark-Icon-App@2x.png */; };\n\t\t3961A6B82304917B0088A4FD /* Copper-Icon-App@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6AF2304917A0088A4FD /* Copper-Icon-App@1x.png */; };\n\t\t3961A6B92304917B0088A4FD /* Copper-Icon-App@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6B02304917A0088A4FD /* Copper-Icon-App@2x.png */; };\n\t\t3961A6BA2304917B0088A4FD /* Icon-App@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3961A6B12304917B0088A4FD /* Icon-App@2x.png */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t761828152358E8C4001F6E1D /* clipboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761828142358E8C4001F6E1D /* clipboard.swift */; };\n\t\t7693980122F353FF009A1CF6 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7693980022F353FF009A1CF6 /* GoogleService-Info.plist */; };\n\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };\n\t\t97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };\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\t2D7AF7B673C6DFA1AB52610D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3961A6A92304917A0088A4FD /* Dark-Icon-App@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Dark-Icon-App@3x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AA2304917A0088A4FD /* Icon-App@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Icon-App@3x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AB2304917A0088A4FD /* Dark-Icon-App@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Dark-Icon-App@1x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AC2304917A0088A4FD /* Icon-App@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Icon-App@1x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AD2304917A0088A4FD /* Copper-Icon-App@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Copper-Icon-App@3x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AE2304917A0088A4FD /* Dark-Icon-App@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Dark-Icon-App@2x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6AF2304917A0088A4FD /* Copper-Icon-App@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Copper-Icon-App@1x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6B02304917A0088A4FD /* Copper-Icon-App@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Copper-Icon-App@2x.png\"; sourceTree = \"<group>\"; };\n\t\t3961A6B12304917B0088A4FD /* Icon-App@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Icon-App@2x.png\"; 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\t42074951F44019CE5ACED5F2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t761828142358E8C4001F6E1D /* clipboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = clipboard.swift; sourceTree = \"<group>\"; };\n\t\t766334DC22D66099008DDB1D /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t7693980022F353FF009A1CF6 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"GoogleService-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t7693980222F35413009A1CF6 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t95A7889671BF4F1B90796A25 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.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\t97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\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\tA4ECA53D14AF7F1AF649555F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.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\t24FF04FFD6FD224422092912 /* 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\t0782DE0FD6A6B5B3DE006797 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t95A7889671BF4F1B90796A25 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\tA4ECA53D14AF7F1AF649555F /* Pods-Runner.release.xcconfig */,\n\t\t\t\t2D7AF7B673C6DFA1AB52610D /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3961A6BB230491C40088A4FD /* resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3961A6AF2304917A0088A4FD /* Copper-Icon-App@1x.png */,\n\t\t\t\t3961A6B02304917A0088A4FD /* Copper-Icon-App@2x.png */,\n\t\t\t\t3961A6AD2304917A0088A4FD /* Copper-Icon-App@3x.png */,\n\t\t\t\t3961A6AB2304917A0088A4FD /* Dark-Icon-App@1x.png */,\n\t\t\t\t3961A6AE2304917A0088A4FD /* Dark-Icon-App@2x.png */,\n\t\t\t\t3961A6A92304917A0088A4FD /* Dark-Icon-App@3x.png */,\n\t\t\t\t3961A6AC2304917A0088A4FD /* Icon-App@1x.png */,\n\t\t\t\t3961A6B12304917B0088A4FD /* Icon-App@2x.png */,\n\t\t\t\t3961A6AA2304917A0088A4FD /* Icon-App@3x.png */,\n\t\t\t);\n\t\t\tpath = resources;\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\t0782DE0FD6A6B5B3DE006797 /* Pods */,\n\t\t\t\tB45E5D8B972749CD5E5098A6 /* 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\t3961A6BB230491C40088A4FD /* resources */,\n\t\t\t\t7693980222F35413009A1CF6 /* Runner.entitlements */,\n\t\t\t\t7693980022F353FF009A1CF6 /* GoogleService-Info.plist */,\n\t\t\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,\n\t\t\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,\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\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t766334DC22D66099008DDB1D /* Runner-Bridging-Header.h */,\n\t\t\t\t761828142358E8C4001F6E1D /* clipboard.swift */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146F21CF9000F007C117D /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB45E5D8B972749CD5E5098A6 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t42074951F44019CE5ACED5F2 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\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\t2975C03BF22FC6C9407CF999 /* [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\tD745A3CD92FDF2233DC810C1 /* [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 = 1300;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\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\tDevelopmentTeam = 44R7KF7645;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.BackgroundModes = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcom.apple.Push = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\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 3.2\";\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\t3961A6B22304917B0088A4FD /* Dark-Icon-App@3x.png in Resources */,\n\t\t\t\t3961A6B52304917B0088A4FD /* Icon-App@1x.png in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t3961A6B62304917B0088A4FD /* Copper-Icon-App@3x.png in Resources */,\n\t\t\t\t3961A6BA2304917B0088A4FD /* Icon-App@2x.png in Resources */,\n\t\t\t\t7693980122F353FF009A1CF6 /* GoogleService-Info.plist in Resources */,\n\t\t\t\t3961A6B32304917B0088A4FD /* Icon-App@3x.png in Resources */,\n\t\t\t\t3961A6B72304917B0088A4FD /* Dark-Icon-App@2x.png in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t3961A6B82304917B0088A4FD /* Copper-Icon-App@1x.png in Resources */,\n\t\t\t\t3961A6B42304917B0088A4FD /* Dark-Icon-App@1x.png in Resources */,\n\t\t\t\t3961A6B92304917B0088A4FD /* Copper-Icon-App@2x.png 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\t2975C03BF22FC6C9407CF999 /* [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\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\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\tD745A3CD92FDF2233DC810C1 /* [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\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SwiftyGif/SwiftyGif.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/barcode_scan/barcode_scan.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/device_info/device_info.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/file_picker/file_picker.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/flutter_webview_plugin/flutter_webview_plugin.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/local_auth/local_auth.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/package_info/package_info.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/path_provider_ios/path_provider_ios.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/share/share.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/shared_preferences_ios/shared_preferences_ios.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/vibrate/vibrate.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyGif.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/barcode_scan.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_picker.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_webview_plugin.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_ios.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_ios.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibrate.framework\",\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\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,\n\t\t\t\t97C146F31CF9000F007C117D /* main.m in Sources */,\n\t\t\t\t761828152358E8C4001F6E1D /* clipboard.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_LOCALIZABILITY_NONLOCALIZED = YES;\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\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\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 44R7KF7645;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.3;\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\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.appditto.blaise;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OBJC_INTERFACE_HEADER_NAME = \"Runner-Swift.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_LOCALIZABILITY_NONLOCALIZED = YES;\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_LOCALIZABILITY_NONLOCALIZED = YES;\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\tSWIFT_COMPILATION_MODE = wholemodule;\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\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 44R7KF7645;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.3;\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\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.appditto.blaise;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OBJC_INTERFACE_HEADER_NAME = \"Runner-Swift.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\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 44R7KF7645;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.3;\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\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.appditto.blaise;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OBJC_INTERFACE_HEADER_NAME = \"Runner-Swift.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/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\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      <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      <Testables>\n      </Testables>\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   </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/fastlane/Appfile",
    "content": "app_identifier(\"com.appditto.blaise\") # The bundle identifier of your app\napple_id(\"appdittoapps@gmail.com\") # Your Apple email address\n\nitc_team_id(\"119652752\") # App Store Connect Team ID\nteam_id(\"44R7KF7645\") # Developer Portal Team ID\n\n# For more information about the Appfile, see:\n#     https://docs.fastlane.tools/advanced/#appfile\n"
  },
  {
    "path": "ios/fastlane/Deliverfile",
    "content": "release_notes({\n  'default' => File.read('./fastlane/metadata/en-US/release_notes.txt'),\n  'en-US' => File.read('./fastlane/metadata/en-US/release_notes.txt')\n});\n\nsubmission_information({\n  add_id_info_serves_ads: false,\n  add_id_info_tracks_action: false,\n  add_id_info_tracks_install: false,\n  add_id_info_uses_idfa: false,\n  content_rights_has_rights: true,\n  content_rights_contains_third_party_content: true,\n  export_compliance_platform: 'ios',\n  export_compliance_compliance_required: false,\n  export_compliance_encryption_updated: false,\n  export_compliance_app_type: nil,\n  export_compliance_uses_encryption: true,\n  export_compliance_is_exempt: true,\n  export_compliance_contains_third_party_cryptography: true,\n  export_compliance_contains_proprietary_cryptography: false,\n  export_compliance_available_on_french_store: true \n});\n"
  },
  {
    "path": "ios/fastlane/Fastfile",
    "content": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n# For a list of all available actions, check out\n#\n#     https://docs.fastlane.tools/actions\n#\n# For a list of all available plugins, check out\n#\n#     https://docs.fastlane.tools/plugins/available-plugins\n#\n\ndefault_platform(:ios)\n\nTEMP_KEYCHAIN_NAME_DEFAULT = \"fastlane_flutter\"\nTEMP_KEYCHAN_PASSWORD_DEFAULT = \"temppassword\"\nSIGH_PROVISIONING_PROFILE_NAME = \"com.appditto.blaise AppStore\"\n\ndef delete_temp_keychain(name)\n  delete_keychain(\n    name: name\n  ) if File.exist? File.expand_path(\"~/Library/Keychains/#{name}-db\")\nend\n\ndef create_temp_keychain(name, password)\n  create_keychain(\n    name: name,\n    password: password,\n    unlock: false,\n    timeout: 0\n  )\nend\n\ndef ensure_temp_keychain(name, password)\n  delete_temp_keychain(name)\n  create_temp_keychain(name, password)\nend\n\nplatform :ios do\n  before_all  do |lane, options|\n    update_fastlane\n  end\n\n  desc \"Build & sign iOS app\"\n  lane :build_ios do |options|\n    begin\n      sh \"cp -Rp ../Runner.xcodeproj ../Runner.xcodeproj.bak\"\n      keychain_name = ENV['TEMP_KEYCHAIN_NAME'] || TEMP_KEYCHAIN_NAME_DEFAULT\n      keychain_password = ENV['TEMP_KEYCHAIN_PASSWORD'] || TEMP_KEYCHAN_PASSWORD_DEFAULT\n      ensure_temp_keychain(keychain_name, keychain_password)\n      api_key = app_store_connect_api_key(\n        key_id: ENV['API_KEY_ID'],\n        issuer_id: ENV['API_KEY_ISSUER'],\n        key_filepath: ENV['API_KEY_FILEPATH'],\n        duration: 1200,\n        in_house: false\n      )         \n      match(\n        app_identifier: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier),\n        type: \"appstore\",\n        keychain_name: keychain_name,\n        keychain_password: keychain_password,\n        readonly: false,\n        skip_provisioning_profiles: true,\n        api_key: api_key\n      )\n      cert(\n        keychain_path: \"~/Library/Keychains/#{keychain_name}-db\",\n        keychain_password: keychain_password,\n        api_key: api_key \n      )\n      sigh(\n        app_identifier: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier),\n        readonly: false,\n        cert_id: lane_context[SharedValues::CERT_CERTIFICATE_ID],\n        provisioning_name: ENV['SIGH_PROVISIONING_PROFILE_NAME'],\n        ignore_profiles_with_different_name: true,\n        api_key: api_key\n      )\n      disable_automatic_code_signing(\n        path: \"./Runner.xcodeproj\",\n        team_id: CredentialsManager::AppfileConfig.try_fetch_value(:team_id),\n        profile_name: lane_context[SharedValues::SIGH_NAME],\n        profile_uuid: lane_context[SharedValues::SIGH_UUID],\n        code_sign_identity: \"iPhone Distribution\"\n      )\n      sh \"./flutter_build.sh --clean\"\n      build_ios_app(\n        export_options: {\n            method: \"app-store\",\n            provisioningProfiles: { \n              \"com.appditto.blaise\" => ENV['SIGH_PROVISIONING_PROFILE_NAME'],\n            }\n        }\n      )\n    rescue SystemExit, Interrupt\n      raise\n    rescue Exception => e\n      delete_temp_keychain(keychain_name)\n      sh \"cp -Rp ../Runner.xcodeproj.bak/* ../Runner.xcodeproj/ || true\"\n      sh \"rm -rf ../Runner.xcodeproj.bak\"\n      raise\n    ensure\n      delete_temp_keychain(keychain_name)\n      sh \"cp -Rp ../Runner.xcodeproj.bak/* ../Runner.xcodeproj/ || true\"\n      sh \"rm -rf ../Runner.xcodeproj.bak\"\n    end\n  end\n\n  desc \"Upload iOS app to app store\"\n  lane :deploy_ios do |options|\n    api_key = app_store_connect_api_key(\n      key_id: ENV['API_KEY_ID'],\n      issuer_id: ENV['API_KEY_ISSUER'],\n      key_filepath: ENV['API_KEY_FILEPATH'],\n      duration: 1200,\n      in_house: false\n    )    \n    if options[:testflight]\n      upload_to_testflight(\n        api_key: api_key,\n        skip_submission: true,\n        ipa: ENV['IPA_PATH']\n      )\n    else\n      deliver(\n        api_key: api_key,\n        skip_metadata: false,\n        skip_screenshots: true,\n        submit_for_review: true,\n        force: true,\n        ipa: ENV['IPA_PATH'],\n        precheck_include_in_app_purchases: false\n      )\n    end\n  end\nend"
  },
  {
    "path": "ios/fastlane/Matchfile",
    "content": "git_url(\"git@github.com:appditto/ios-certificates.git\")\n\nstorage_mode(\"git\")\n\ntype(\"development\") # The default type, can be: appstore, adhoc, enterprise or development\n\n# app_identifier([\"tools.fastlane.app\", \"tools.fastlane.app2\"])\n# username(\"user@fastlane.tools\") # Your Apple Developer Portal username\n\n# For all available options run `fastlane match --help`\n# Remove the # in the beginning of the line to enable the other options\n\n# The docs are available on https://docs.fastlane.tools/actions/match\n"
  },
  {
    "path": "ios/fastlane/flutter_build.sh",
    "content": "#!/bin/bash\n\ncd ../../\nif [ \"$1\" == \"--clean\" ]\nthen\n   echo \"Running clean...\"\n   flutter clean\nelse\n   echo \"Skipping clean...\"\nfi\nflutter build ios --release --no-codesign\n"
  },
  {
    "path": "ios/fastlane/flutter_test.sh",
    "content": "#!/bin/bash\n\ncd ../../\necho \"Running tests\"\nflutter test\n"
  },
  {
    "path": "ios/fastlane/metadata/copyright.txt",
    "content": "2022 Avenge Media LLC\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/apple_tv_privacy_policy.txt",
    "content": "\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/description.txt",
    "content": "Blaise is a simple, sleek & secure Pascal wallet.\nFeatures:\n\n- Create a new Pascal wallet or import an existing one\n- Manage multiple Pascal accounts (PASAs)\n- Send Pascal instantly to anyone, anywhere in the world\n- Change account names, transfer accounts, or list them for sale\n- Manage contacts in an intuitive, easy-to-use address book\n- View your accounts operations history\n- Customize the wallet with various themes\n- Select one of the 5+ languages available\n\nIMPORTANT:\nRemember to backup your private key and store it in a safe place. It is the only way to recover your funds if you sign out of the wallet or lose your device! If someone else gets your unencrypted private key, they will have full control over your funds.\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/keywords.txt",
    "content": "pascal, pascalcoin, cryptocurrency, crypto, wallet, bitcoin, ethereum, exchange, blockchain, flutter\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/marketing_url.txt",
    "content": "https://blaisewallet.com\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/name.txt",
    "content": "Blaise - Pascal Wallet\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/privacy_url.txt",
    "content": "https://appditto.github.io/blaise/privacy_policy.html\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/promotional_text.txt",
    "content": "Simple, Sleek & Secure Pascal Wallet\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/release_notes.txt",
    "content": "- Disallow 0-fee transactions\n- Performance improvements\n- Bug fixes"
  },
  {
    "path": "ios/fastlane/metadata/en-US/subtitle.txt",
    "content": "Securely send & receive Pascal\n"
  },
  {
    "path": "ios/fastlane/metadata/en-US/support_url.txt",
    "content": "https://help.blaisewallet.com/\n"
  },
  {
    "path": "ios/fastlane/metadata/primary_category.txt",
    "content": "MZGenre.Finance\n"
  },
  {
    "path": "ios/fastlane/metadata/primary_first_sub_category.txt",
    "content": "\n"
  },
  {
    "path": "ios/fastlane/metadata/primary_second_sub_category.txt",
    "content": "\n"
  },
  {
    "path": "ios/fastlane/metadata/secondary_category.txt",
    "content": "MZGenre.Utilities\n"
  },
  {
    "path": "ios/fastlane/metadata/secondary_first_sub_category.txt",
    "content": "\n"
  },
  {
    "path": "ios/fastlane/metadata/secondary_second_sub_category.txt",
    "content": "\n"
  },
  {
    "path": "lib/appstate_container.dart",
    "content": "import 'dart:async';\n\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:blaise_wallet_flutter/model/available_themes.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/subscribe_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/subscribe_response.dart';\nimport 'package:blaise_wallet_flutter/network/ws_client.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/wallet/wallet.dart';\nimport 'package:blaise_wallet_flutter/themes.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nfinal Wallet walletState = Wallet();\n\nconst List<String> PREACHED_SVG_ASSETS = [\n  'assets/illustration_backup.svg',\n  'assets/illustration_backup_dark.svg',\n  'assets/illustration_new_wallet.svg',\n  'assets/illustration_new_wallet_dark.svg',\n  'assets/illustration_security.svg',\n  'assets/illustration_security_dark.svg',\n  'assets/illustration_two_options.svg',\n  'assets/illustration_two_options_dark.svg',\n  'assets/illustration_borrowed.svg',\n  'assets/illustration_borrowed_dark.svg',\n];\n\nclass _InheritedStateContainer extends InheritedWidget {\n  // Data is your entire state. In our case just 'User'\n  final StateContainerState data;\n\n  // You must pass through a child and your state.\n  _InheritedStateContainer({\n    Key key,\n    @required this.data,\n    @required Widget child,\n  }) : super(key: key, child: child);\n\n  // This is a built in method which you can use to check if\n  // any state has changed. If not, no reason to rebuild all the widgets\n  // that rely on your state.\n  @override\n  bool updateShouldNotify(_InheritedStateContainer old) => true;\n}\n\nclass StateContainer extends StatefulWidget {\n  // You must pass through a child.\n  final Widget child;\n\n  StateContainer({@required this.child});\n\n  // This is the secret sauce. Write your own 'of' method that will behave\n  // Exactly like MediaQuery.of and Theme.of\n  // It basically says 'get the data from the widget of this type.\n  static StateContainerState of(BuildContext context) {\n    return context\n        .dependOnInheritedWidgetOfExactType<_InheritedStateContainer>()\n        .data;\n  }\n\n  @override\n  StateContainerState createState() => StateContainerState();\n}\n\n/// App InheritedWidget\n/// This is where we handle the global state and also where\n/// we interact with the server and make requests/handle+propagate responses\n///\n/// Basically the central hub behind the entire app\nclass StateContainerState extends State<StateContainer> {\n  // Theme\n  BaseTheme curTheme = BlaiseLightTheme();\n\n  // Language\n  LanguageSetting curLanguage = LanguageSetting(AvailableLanguage.DEFAULT);\n\n  // Currency\n  String currencyLocale;\n  Locale deviceLocale = Locale('en', 'US');\n  AvailableCurrency curCurrency = AvailableCurrency(AvailableCurrencyEnum.USD);\n\n  // Helper FN to precache SVG assets for performance\n  Future<void> _precacheSvgs() async {\n    PREACHED_SVG_ASSETS.forEach((asset) {\n      precachePicture(\n          ExactAssetPicture(SvgPicture.svgStringDecoder, asset), context);\n    });\n  }\n\n  // Change language\n  void updateLanguage(LanguageSetting language) {\n    setState(() {\n      curLanguage = language;\n    });\n  }\n\n  // Change the theme\n  Future<void> updateTheme(ThemeSetting theme, {bool setIcon = true}) async {\n    if (theme != null && theme.getTheme() != curTheme) {\n      if (mounted) {\n        setState(() {\n          this.curTheme = theme.getTheme();\n        });\n      }\n      await sl.get<SharedPrefsUtil>().setTheme(theme);\n    }\n    if (setIcon) {\n      AppIcon.setAppIcon(theme.getTheme().appIcon);\n    }\n  }\n\n  /// Add donations contact if it hasnt already been added\n  Future<void> _addSampleContact() async {\n    bool contactAdded = await sl.get<SharedPrefsUtil>().getFirstContactAdded();\n    if (!contactAdded) {\n      bool addressExists = await sl\n          .get<DBHelper>()\n          .contactExistsWithAccount(AccountNumber.fromInt(1185729));\n      if (addressExists) {\n        return;\n      }\n      bool nameExists =\n          await sl.get<DBHelper>().contactExistsWithName(\"BlaiseDonations\");\n      if (nameExists) {\n        return;\n      }\n      await sl.get<SharedPrefsUtil>().setFirstContactAdded(true);\n      Contact c = Contact(\n          name: \"BlaiseDonations\",\n          account: AccountNumber.fromInt(1185729),\n          payload: \"Thanks!\");\n      await sl.get<DBHelper>().saveContact(c);\n    }\n  }\n\n  StreamSubscription<ConnStatusEvent> _connStatusSub;\n  StreamSubscription<SubscribeEvent> _subscribeEventSub;\n  StreamSubscription<PriceEvent> _priceEventSub;\n  StreamSubscription<NewOperationEvent> _newOpSub;\n\n  // Register RX event listenerss\n  void _registerBus() {\n    _subscribeEventSub =\n        EventTaxiImpl.singleton().registerTo<SubscribeEvent>().listen((event) {\n      handleSubscribeResponse(event.response);\n    });\n    _priceEventSub =\n        EventTaxiImpl.singleton().registerTo<PriceEvent>().listen((event) {\n      // PriceResponse's get pushed periodically, it wasn't a request we made so don't pop the queue\n      walletState.btcPrice = event.response.btcPrice;\n      walletState.localCurrencyPrice = event.response.price;\n    });\n    _connStatusSub =\n        EventTaxiImpl.singleton().registerTo<ConnStatusEvent>().listen((event) {\n      if (event.status == ConnectionStatus.CONNECTED) {\n        walletState.requestUpdate();\n      } else if (event.status == ConnectionStatus.DISCONNECTED &&\n          !sl.get<WSClient>().suspended) {\n        sl.get<WSClient>().initCommunication();\n      }\n    });\n    _newOpSub = EventTaxiImpl.singleton()\n        .registerTo<NewOperationEvent>()\n        .listen((event) {\n      walletState.addNewOp(event.operation);\n    });\n  }\n\n  void _destroyBus() {\n    if (_connStatusSub != null) {\n      _connStatusSub.cancel();\n    }\n    if (_subscribeEventSub != null) {\n      _subscribeEventSub.cancel();\n    }\n    if (_priceEventSub != null) {\n      _priceEventSub.cancel();\n    }\n    if (_newOpSub != null) {\n      _newOpSub.cancel();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    // Precache SVG Assets\n    _precacheSvgs();\n    // Set initial theme\n    sl.get<SharedPrefsUtil>().getTheme().then((themeSetting) {\n      updateTheme(themeSetting, setIcon: false);\n    });\n    // Add initial contact if not already present\n    _addSampleContact();\n    // Set currency locale here for the UI to access\n    sl.get<SharedPrefsUtil>().getCurrency(deviceLocale).then((currency) {\n      setState(() {\n        currencyLocale = currency.getLocale().toString();\n        curCurrency = currency;\n      });\n    });\n    // Get default language setting\n    sl.get<SharedPrefsUtil>().getLanguage().then((language) {\n      setState(() {\n        curLanguage = language;\n      });\n    });\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  /// Handle account_subscribe response\n  void handleSubscribeResponse(SubscribeResponse response) {\n    // Set currency locale here for the UI to access\n    sl.get<SharedPrefsUtil>().getCurrency(deviceLocale).then((currency) {\n      setState(() {\n        currencyLocale = currency.getLocale().toString();\n        curCurrency = currency;\n      });\n    });\n    // Server gives us a UUID for future requests on subscribe\n    if (response.uuid != null) {\n      sl.get<SharedPrefsUtil>().setUuid(response.uuid);\n    }\n    walletState.localCurrencyPrice = response.price;\n    walletState.btcPrice = response.btcPrice;\n    walletState.hasExceededBorrowLimit = !response.borrowEligible;\n    walletState.hasReceivedSubscribeResponse = true;\n    sl.get<WSClient>().pop();\n    sl.get<WSClient>().processQueue();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return _InheritedStateContainer(\n      data: this,\n      child: widget.child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/bus/authenticated_event.dart",
    "content": "\nimport 'package:event_taxi/event_taxi.dart';\n\nenum AUTH_EVENT_TYPE { SEND, TRANSFER, CHANGE, BACKUP, LIST_FORSALE, DELIST_FORSALE }\n\nclass AuthenticatedEvent implements Event {\n  final AUTH_EVENT_TYPE authType;\n\n  AuthenticatedEvent(this.authType);\n}"
  },
  {
    "path": "lib/bus/conn_status_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\n\n// Bus event for connection status changing\nenum ConnectionStatus { CONNECTED, DISCONNECTED }\n\nclass ConnStatusEvent implements Event {\n  final ConnectionStatus status;\n\n  ConnStatusEvent({this.status});\n}"
  },
  {
    "path": "lib/bus/contact_added_event.dart",
    "content": "import 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass ContactAddedEvent implements Event {\n  final Contact contact;\n\n  ContactAddedEvent({this.contact});\n}"
  },
  {
    "path": "lib/bus/contact_modified_event.dart",
    "content": "import 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass ContactModifiedEvent implements Event {\n  final Contact contact;\n\n  ContactModifiedEvent({this.contact});\n}"
  },
  {
    "path": "lib/bus/contact_removed_event.dart",
    "content": "import 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass ContactRemovedEvent implements Event {\n  final Contact contact;\n\n  ContactRemovedEvent({this.contact});\n}"
  },
  {
    "path": "lib/bus/daemon_changed_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\n\nclass DaemonChangedEvent implements Event {\n  final String newDaemon;\n\n  DaemonChangedEvent({this.newDaemon});\n}"
  },
  {
    "path": "lib/bus/disable_lock_timeout_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\n\nclass DisableLockTimeoutEvent implements Event {\n  final bool disable;\n\n  DisableLockTimeoutEvent({this.disable});\n}"
  },
  {
    "path": "lib/bus/events.dart",
    "content": "export 'authenticated_event.dart';\nexport 'contact_modified_event.dart';\nexport 'contact_added_event.dart';\nexport 'contact_removed_event.dart';\nexport 'update_history_event.dart';\nexport 'daemon_changed_event.dart';\nexport 'payload_changed_event.dart';\nexport 'disable_lock_timeout_event.dart';\nexport 'conn_status_event.dart';\nexport 'subscribe_event.dart';\nexport 'price_event.dart';\nexport 'new_operation_event.dart';"
  },
  {
    "path": "lib/bus/new_operation_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass NewOperationEvent implements Event {\n  final PascalOperation operation;\n\n  NewOperationEvent({this.operation});\n}"
  },
  {
    "path": "lib/bus/payload_changed_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\n\nclass PayloadChangedEvent implements Event {\n  final String payload;\n\n  PayloadChangedEvent({this.payload});\n}"
  },
  {
    "path": "lib/bus/price_event.dart",
    "content": "import 'package:event_taxi/event_taxi.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/price_response.dart';\n\nclass PriceEvent implements Event {\n  final PriceResponse response;\n\n  PriceEvent({this.response});\n}"
  },
  {
    "path": "lib/bus/subscribe_event.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/response/subscribe_response.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass SubscribeEvent implements Event {\n  final SubscribeResponse response;\n\n  SubscribeEvent({this.response});\n}"
  },
  {
    "path": "lib/bus/update_history_event.dart",
    "content": "\nimport 'package:event_taxi/event_taxi.dart';\n\nclass UpdateHistoryEvent implements Event {\n}"
  },
  {
    "path": "lib/constants.dart",
    "content": "class AppConstants {\n  static const String DEFAULT_RPC_HTTP_URL =\n      'https://blaiseapi.appditto.com/rawrpc';\n  static const String WS_API_URL = 'wss://blaiseapi.appditto.com';\n  static const String EULA_URL = 'https://appditto.github.io/blaise/eula.html';\n  static const String PRIVACY_POLICY_URL = 'https://appditto.github.io/blaise/privacy_policy.html';\n}\n"
  },
  {
    "path": "lib/l10n/intl_ar.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"مفتاح خاص جديد\",\n  \"importPrivateKeyButton\": \"استيراد مفتاح خاص\",\n  \"gotItButton\": \"حصلت عليه!\",\n  \"goBackButton\": \"رجوع\",\n  \"copyButton\": \"نسخ\",\n  \"copiedButton\": \"تم النسخ\",\n  \"keyCopiedButton\": \"تم نسخ المفتاح\",\n  \"iHaveBackedItUpButton\": \"قمت بالنسخ الإحتياطي\",\n  \"yesImSureButton\": \"نعم، أنا متأكد\",\n  \"noGoBackButton\": \"لا، رجوع\",\n  \"getAnAccountButton\": \"أحصل على حساب\",\n  \"getAFreeAccountButton\": \"أحصل على حساب بالمجان\",\n  \"buyAnAccountButton\": \"إشتري حساب\",\n  \"sendConfirmationButton\": \"ارسل تأكيد\",\n  \"confirmButton\": \"تأكيد\",\n  \"borrowAnAccountButton\": \"استعر حساباً\",\n  \"importButton\": \"إستيراد\",\n  \"receiveButton\": \"استلام\",\n  \"sendButton\": \"إرسال\",\n  \"copyAddressButton\": \"نسخ الحساب\",\n  \"copiedAddressButton\": \"تم نسخ الحساب\",\n  \"addToContactsButton\": \"أضف إلى جهات الإتصال\",\n  \"operationDetailsButton\": \"تفاصيل العملية\",\n  \"openInExplorerButton\": \"افتح في المستكشف\",\n  \"requestButton\": \"طلب\",\n  \"addAPayloadButton\": \"+ أضف ملاحظة (Payload)\",\n  \"addADurationButton\": \"+ أضف مدة\",\n  \"scanQRCodeButton\": \"مسح رمز QR\",\n  \"cancelButton\": \"إلغاء\",\n  \"closeButton\": \"إغلاق\",\n  \"changeNameButton\": \"تغيير الإسم\",\n  \"transferButton\": \"نقل\",\n  \"listForSaleButton\": \"إدراج للبيع\",\n  \"createPrivateSaleButton\": \"إنشاء بيع خاص\",\n  \"yesAddFeeButton\": \"نعم، أضف رسوم\",\n  \"unlockButton\": \"إلغاء قفل\",\n  \"unlockWithBiometricsButton\": \"إلغاء قفل بالبصمة\",\n  \"unlockWithPINButton\": \"إلغاء القفل برقم سري\",\n  \"setToDefaultButton\": \"اجعله افتراضيا\",\n  \"addContactButton\": \"أضف جهة إتصال\",\n  \"encryptedKeyButton\": \"مفتاح مشفر\",\n  \"unencryptedKeyButton\": \"مفتاح غير مشفر\",\n  \"encryptButton\": \"تشفير\",\n  \"showButton\": \"اظهر\",\n  \"hideButton\": \"إخفي\",\n  \"copyEncryptedKeyButton\": \"نسخ مفتاح مشفر\",\n  \"copyUnencryptedKeyButton\": \"نسخ مفتاح غير مشفر\",\n  \"copyKeyButton\": \"نسخ مفتاح\",\n  \"copyPublicKeyButton\": \"نسخ المفتاح عام\",\n  \"deletePrivateKeyAndLogoutButton\": \"احذف المفتاح الخاص\\nوتسجيل خروج\",\n  \"searchForNameButton\": \"بحث عن اسم\",\n  \"searchAccountNameButton\": \"ابحث باسم الحساب\",\n  \"searchNameButton\": \"إبحث عن إسم\",\n  \"okayGoBackButton\": \"موافق، رجوع\",\n  \"nextButton\": \"التالي\",\n  \"welcomeParagraph\": \"مرحبا بك في محفظة بليز، للبدء، يمكنك إنشاء مفتاح خاص جديد أو إستيراد مفتاح موجود\",\n  \"newKeySecurityParagraph\": \"في الشاشة التالية، سوف ترى مفتاحك الخاص الجديد، أنه يمثل كل شئ، بدونه أنت لا تملك أموالك، لذلك من الضروري أن تحفظه في مكان أمن، ولا تشاركة مع أحد.\",\n  \"uninstallDisclaimerParagraph\": \"إذا فقدت جهازك أو الغيت تسطيب محفظة بليز، سوف تحتاج للـ \\\"مفتاح الخاص\\\" لكي تستعيد أموالك.\",\n  \"newPrivateKeyParagraph\": \"يوجد أدناه المفتاح الخاص لمحفظتك الجديدة، من الضروري أن تحفظه في مكان أمن ولا تشاركه مع أحد، ولا تقم بأخذ لقطة للشاشة أو تركه في ملف على جهازك، يستحسن أن تكتبه بيدك على ورقة وتحفظة في مكان أمن.\",\n  \"newKeyBackUpConfirmParagraph\": \"هل متأكد من أنك قمت بعمل نسخة إحتياطية من مفتاحك الخاص في مكان أمن؟\",\n  \"newWalletGreetingParagraph\": \"مرحباً بك في <colored>محفظة بليز</colored>.\\nيمكنك البدء بالحصول على حساب جديد.\",\n  \"getAccountFirstParagraph\": \"هناك خيارين للحصول على حسابك الأول:\",\n  \"getAccountSecondParagraph\": \"1. يمكنك الحصول على حساب مجاني بإستخدام رقم تليفونك، <colored>فقط حساب واحد لكل رقم تليفون</colored>\",\n  \"getAccountThirdParagraph\": \"2. يمكنك شراء حساب/حسابات مقابل <colored>%1 باسكال (%2).</colored>\",\n  \"enterPhoneNumberParagraph\": \"أدخل رقم تليفونك أدناه.\",\n  \"enterConfirmationCodeParagraph\": \"لقد أرسلنا لك رمز التأكيد، يرجى إدخاله أدناه.\",\n  \"borrowStarted\": \"بدأت عملية الشراء لـ %1\",\n  \"borrowAccountParagraph\": \"لشراء حساب، أولا سوف نعطيك واحد (على سبيل الإعارة)، إذا أرسلت على الأقل <colored>%1 باسكال(%2)</colored> إلى هذا الحساب في خلال <colored>%3 أيام</colored>, الحساب سوف يكون ملكك و <colored>%1 باسكال</colored> سوف تخصم من رصيدك تلقائياً.\\nغير ذلك، سوف نسترد الحساب بعد نهاية <colored>%3 أيام</colored> ولن يكون ملكك.\\nلذلك من المستحسن أولا إرسال مبلغ صغير قبل أن تمتلك الحساب.\",\n  \"importPrivateKeyParagraph\": \"أدخل مفتاحك الخاص أدناه.\",\n  \"looksLikeEncryptedKeyParagraph\": \"يبدو أن هذا المفتاح الخاص مشفراً، يرجى إدخال كلمة المرور لفك تشفيره واستيراده.\",\n  \"urlChangedToParagraph\": \"URL تم تغييره إلى %1\",\n  \"backupKeyFirstParagraph\": \"لديك خياران لإجراء نسخ احتياطي للمفتاح الخاص:\",\n  \"backupKeySecondParagraph\": \"1. مشفر، مما يعني أنه محمي بكلمة مرور.\",\n  \"backupKeyThirdParagraph\": \"2. غير مشفر، مما يعني أنه خام وغير محمي بكلمة مرور.\",\n  \"backupKeyFourthParagraph\": \"نوصي بحفظ النسخة غير المشفرة في وضع عدم الاتصال بالإنترنت (أوفلاين)، عن طريق كتابتها على ورقة، و يمكنك حفظ النسخة المشفرة على مدير كلمات المرور (باسورد مانجر) لراحتك.\",\n  \"encryptKeyParagraph\": \"قم بإنشاء كلمة مرور جديدة لتشفير مفتاحك الخاص.\",\n  \"backupEncryptedKeyFirstParagraph\": \"أدناه هو مفتاحك الخاص المشفر. محمي بكلمة مرور. يمكنك حفظه بأمان على مدير كلمات المرور (باسورد مانجر) لراحتك.\",\n  \"backupEncryptedKeySecondParagraph\": \"نظرًا لأنه مشفر بكلمة مرور، إذا فقدت أو نسيت كلمة المرور، فلن تتمكن من فك تشفيره والوصول إلى أموالك.\",\n  \"backupUnencryptedKeyParagraph\": \"يوجد أدناه مفتاحك الخاص غير المشفر. <colored> ليس محمي بكلمة مرور، مما يعني أنه من الأهمية حفظه في مكان آمن وغير متصل بالإنترنت. </colored>  نوصي بكتابته على ورقة.\",\n  \"publicKeyParagraph\": \"أدناه هو المفتاح العام الخاص بك. كما يوحي الاسم، الغرض منه هو المشاركة بشكل عام لإستقبال الحسابات عليه وانتقال ملكيتها للمفتاح الخاص التابع لهذا المفتاح العام.\",\n  \"borrowedAccountParagraph\": \"هذا هو <colored>حساب معار إليك</colored>.\\nإذا أرسلت على الأقل <colored>%1 باسكال</colored> إلى هذا الحساب في خلال <colored>%2 أيام, %3 ساعات, و %4 دقائق</colored>, سوف يكون ملكك.\",\n  \"borrowedAccountPaidParagraph\": \"<colored>تم شراء الحساب!</colored>\\nنقله إليك قيد المعالجة حاليًا. تستغرق هذه العملية عادةً <colored>15 دقيقة</colored>, في بعض الحالات قد تستغرق وقتا أطول قليلا.\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored>سيؤدي تسجيل الخروج إلى إزالة المفتاح الخاص وكافة البيانات المتعلقة بمحفظتك من على هذا الجهاز.</colored> إذا لم يتم عمل نسخة احتياطية من المفتاح الخاص، فلن تتمكن من الوصول إلى أموالك مرة أخرى. إذا قمت بعمل نسخة إحتياطية من مفتاح الخاص، فلا داعي للقلق.\",\n  \"logoutSecondDisclaimerParagraph\": \"هل أنت متأكد من أنك قمت بعمل نسخة احتياطية من المفتاح الخاص؟ <colored>إذا قمت بعمل نسخة إحتياطية من مفتاحك الخاص، فلا داعي للقلق بشأنه.</colored>\",\n  \"sendingConfirmParagraph\": \"برجاء مراجعة تفاصيل العملية قبل الإرسال.\",\n  \"sentParagraph\": \"تم إرسال العملية بنجاح.\",\n  \"changeNameParagraph\": \"أدخل اسمًا أدناه لتغيير اسم الحساب.\",\n  \"changingNameParagraph\": \"تأكيد اسم حسابك الجديد للمتابعة.\",\n  \"changedNameParagraph\": \"تم تغيير اسم حسابك بنجاح.\",\n  \"transferParagraph\": \"أدخل \\\"مفتاح عام\\\" أدناه لنقل ملكية هذا الحساب إليه.\",\n  \"transferringParagraph\": \"قم بتأكيد \\\"المفتاح العام\\\" أدناه لنقل ملكية هذا الحساب إليه.\",\n  \"transferredParagraph\": \"تم نقل حسابك بنجاح إلى \\\"المفتاح العام\\\" أدناه.\",\n  \"listForSaleParagraph\": \"لعرض هذا الحساب للبيع، أدخل سعرًا و\\\"الحساب\\\" الذي سيتلقى الدفع.\",\n  \"listingForSaleParagraph\": \"برجاء تأكيد السعر والحساب الذي سيتلقى الدفع.\",\n  \"listedForSaleParagraph\": \"تم إدراج حسابك للبيع بنجاح. سنخبرك إذا ما قام شخص ما بشرئه.\",\n  \"createPrivateSaleParagraph\": \"أدخل السعر, الحساب الذي سيتلقى الدفع, والمفتاح العام أدناه لإنشاء بيع خاص لهذا الحساب.\",\n  \"creatingPrivateSaleParagraph\": \"تأكد من المعلومات أدناه.\",\n  \"createdPrivateSaleParagraph\": \"تم إنشاء البيع الخاص بنجاح. سنخبرك إذا تم شراؤه.\",\n  \"delistFromSaleParagraph\": \"تأكد من رغبتك في حذف هذا الحساب من البيع.\",\n  \"delistedFromSaleParagraph\": \"تم حذف حسابك من البيع بنجاح.\",\n  \"feeRequiredParagraph\": \"هذه المعاملة تتطلب رسوم.\",\n  \"feeConfirmAmountParagraph\": \"يرجى تأكيد إضافة رسوم %1 باسكال لهذه العملية للمتابعة.\\n.\",\n  \"keyTypeNotSupportedParagraph\": \"لا تدعم محفظة بليز هذا النوع من المفاتيح الخاصة. يمكنك إنشاء مفتاح خاص جديد ونقل حساباتك إليه باستخدام محفظة أخرى.\",\n  \"enterPINToUnlockParagraph\": \"أدخل رمز المرور لإلغاء القفل\",\n  \"authenticateToUnlockParagraph\": \"المصادقة لإلغاء القفل\",\n  \"manyFailedAttemptsParagraph\": \"محاولات كثيرة فاشلة لإلغاء القفل\",\n  \"authenticateToChangeNameParagraph\": \"المصادقة لتغيير اسم الحساب إلى \\\"%1\\\"\",\n  \"authenticateToDelistParagraph\": \"المصادقة لحذف الحساب من البيع\",\n  \"authenticateToListForSaleParagraph\": \"المصادقة لإدراج الحساب للبيع\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"المصادقة لإنشاء بيع خاص\",\n  \"authenticateToTransferParagraph\": \"المصادقة لنقل الحساب\",\n  \"authenticateToSendParagraph\": \"المصادقة لإرسال %1 باسكال\",\n  \"authenticateToBackUpParagraph\": \"المصادقة لإجراء نسخ احتياطي للمفتاح الخاص\",\n  \"invalidPINParagraph\": \"رمز المرور غير صحيح\",\n  \"noMatchPINParagraph\": \"رمز المرور غير متطابق\",\n  \"confirmPINParagraph\": \"تأكيد رمز المرور\",\n  \"enterPINParagraph\": \"أدخل رمز المرور\",\n  \"createPINParagraph\": \"إنشاء 6 أرقام رمز مرور\",\n  \"addedToContactsParagraph\": \"%1 تم إضافته إلى جهات الإتصال\",\n  \"removedFromContactsParagraph\": \"تم إزالة %1 من جهات الإتصال\",\n  \"failedToRemoveFromContactsParagraph\": \"فشل في إزالة %1 من جهات الإتصال\",\n  \"successfullyImportedContactsParagraph\": \"تم إستيراد %1 جهات إتصال بنجاح\",\n  \"checkOutBlaiseParagraph\": \"أنظر، بليز! محفظة \\\"باسكال\\\" بسيطة وأنيقة وآمنة لنظامي أندرويد و آي أو إس: https://blaisewallet.com\",\n  \"newAccountParagraph\": \"هذا هو حسابك الجديد.\\nبمجرد أن تستقبل <colored>باسكال</colored>, سوف تظهر العمليات كما موضح أدناه.\",\n  \"settingsHeader\": \"إعدادات\",\n  \"preferencesHeader\": \"تفضيلات\",\n  \"currencyHeader\": \"العملة\",\n  \"languageHeader\": \"اللغة\",\n  \"languageColonHeader\": \"اللغة:\",\n  \"systemDefaultHeader\": \"إفتراضي النظام\",\n  \"themeHeader\": \"المظهر\",\n  \"themeLightHeader\": \"فاتح\",\n  \"themeDarkHeader\": \"مظلم\",\n  \"themeCopperHeader\": \"نحاسي\",\n  \"notificationsHeader\": \"الإشعارات\",\n  \"securityHeader\": \"الأمان\",\n  \"authenticationMethodHeader\": \"طريقة المصادقة\",\n  \"authenticationPINHeader\": \"رمز المرور\",\n  \"authenticationBiometricsHeader\": \"البصمة\",\n  \"authenticateOnLaunchHeader\": \"المصادقة عند التشغيل\",\n  \"yesHeader\": \"نعم\",\n  \"noHeader\": \"لا\",\n  \"automaticallyLockHeader\": \"قفل تلقائي\",\n  \"lockInstantHeader\": \"فوراً\",\n  \"lock1Header\": \"بعد %1 دقيقة\",\n  \"lock5Header\": \"بعد %1 دقائق\",\n  \"lock15Header\": \"بعد %1 دقائق\",\n  \"lock30Header\": \"بعد %1 دقائق\",\n  \"lock60Header\": \"بعد %1 دقائق\",\n  \"defaultHeader\": \"إفتراضي\",\n  \"manageHeader\": \"إدارة\",\n  \"contactsHeader\": \"جهات الإتصال\",\n  \"backUpPrivateKeyHeader\": \"نسخ إحتياطي للمفتاح الخاص\",\n  \"viewPublicKeyHeader\": \"عرض المفتاح العام\",\n  \"shareHeader\": \"مشاركة بليز\",\n  \"logoutHeader\": \"تسجيل خروج\",\n  \"privacyPolicyHeader\": \"سياسة الخصوصية\",\n  \"changeAccountNameHeader\": \"تغيير اسم الحساب\",\n  \"transferAccountHeader\": \"نقل ملكية الحساب\",\n  \"listAccountForSaleHeader\": \"إدراج الحساب للبيع\",\n  \"createPrivateSaleHeader\": \"إدارج الحساب للبيع الخاص\",\n  \"delistFromSaleHeader\": \"حذف الحساب من البيع\",\n  \"getAccountSheetHeader\": \"الحصول على حساب\",\n  \"freeAccountSheetHeader\": \"حساب مجاني\",\n  \"buyAccountSheetHeader\": \"شراء حساب\",\n  \"sendSheetHeader\": \"إرسال\",\n  \"sendingSheetHeader\": \"جارٍ الإرسال\",\n  \"sentSheetHeader\": \"تم الإرسال\",\n  \"requestSheetHeader\": \"طلب\",\n  \"changeNameSheetHeader\": \"تغيير الإسم\",\n  \"changingNameSheetHeader\": \"جارٍ التغيير\",\n  \"changedNameSheetHeader\": \"تم التغيير\",\n  \"transferSheetHeader\": \"نقل\",\n  \"transferringSheetHeader\": \"جارٍ النقل\",\n  \"transferredSheetHeader\": \"تم النقل\",\n  \"listForSaleSheetHeader\": \"إدراج للبيع\",\n  \"listingForSaleSheetHeader\": \"جارٍ الإدراج\",\n  \"listedForSaleSheetHeader\": \"تم الإدراج\",\n  \"createPrivateSaleSheetHeader\": \"بيع خاص\",\n  \"creatingPrivateSaleSheetHeader\": \"إنشاء\",\n  \"createdPrivateSaleSheetHeader\": \"تم الإنشاء\",\n  \"delistingSheetHeader\": \"جارٍ الحذف\",\n  \"delistedSheetHeader\": \"تم الحذف\",\n  \"addContactSheetHeader\": \"إضافة جهة إتصال\",\n  \"contactSheetHeader\": \"جهة إتصال\",\n  \"publicKeySheetHeader\": \"مفتاح عام\",\n  \"privateKeySheetHeader\": \"مفتاح خاص\",\n  \"backUpSheetHeader\": \"نسخ إحتياطي\",\n  \"encryptSheetHeader\": \"تشفير\",\n  \"changeDaemonSheetHeader\": \"تغيير Daemon\",\n  \"securityFirstHeader\": \"الأمان أولا!\",\n  \"newPrivateKeyHeader\": \"مفتاح خاص جديد\",\n  \"importPrivateKeyHeader\": \"إستيراد مفتاح خاص\",\n  \"decryptAndImportKeyHeader\": \"فك تشفير & إستيراد\",\n  \"backUpKeyHeader\": \"نسخ إحتياطي لمفاتيحك\",\n  \"lockedHeader\": \"مقفل\",\n  \"privateKeyTextFieldHeader\": \"مفتاح خاص\",\n  \"passwordTextFieldHeader\": \"كلمه مرور\",\n  \"newPasswordTextFieldHeader\": \"كلمة مرور جديدة\",\n  \"confirmPasswordTextFieldHeader\": \"تأكيد كلمة المرور\",\n  \"confirmTextFieldHeader\": \"تأكيد\",\n  \"countryCodeTextFieldHeader\": \"كود البلد\",\n  \"phoneNumberTextFieldHeader\": \"رقم التليفون\",\n  \"confirmationCodeTextFieldHeader\": \"كود التفعيل\",\n  \"accountTextFieldHeader\": \"حساب\",\n  \"addressTextFieldHeader\": \"رقم الحساب\",\n  \"contactNameTextFieldHeader\": \"أسم جهة الإتصال\",\n  \"amountTextFieldHeader\": \"المبلغ\",\n  \"payloadTextFieldHeader\": \"ملاحظة (Payload)\",\n  \"nameTextFieldHeader\": \"إسم\",\n  \"newAccountNameTextFieldHeader\": \"إسم الحساب الجديد\",\n  \"publicKeyTextFieldHeader\": \"مفتاح عام\",\n  \"priceTextFieldHeader\": \"السعر\",\n  \"receivingAccountTextFieldHeader\": \"الحساب متلقي الدفع\",\n  \"durationTextFieldHeader\": \"المدة\",\n  \"feeTextFieldHeader\": \"رسوم\",\n  \"otherOperationsHeader\": \"معاملات أخرى\",\n  \"warningHeader\": \"تحذير\",\n  \"areYouSureHeader\": \"هل أنت متأكد؟\",\n  \"addFeeHeader\": \"إضافة رسوم\",\n  \"keyTypeNotSupportedHeader\": \"المفتاح غير مدعوم\",\n  \"accountToSendFromHeader\": \"حساب لإرسال من\",\n  \"sentHeader\": \"صادر\",\n  \"receivedHeader\": \"وأرد\",\n  \"nameChangedHeader\": \"تم تغيير الإسم\",\n  \"listedForSaleHeader\": \"تم إدراجه للبيع\",\n  \"privateSaleHeader\": \"بيع خاص\",\n  \"delistedFromSaleHeader\": \"تم حذفه من البيع\",\n  \"delistedHeader\": \"تم حذفه\",\n  \"undefinedHeader\": \"غير محدد\",\n  \"transferredHeader\": \"تم نقله\",\n  \"balanceHeader\": \"الرصيد\",\n  \"totalBalanceHeader\": \"إجمالي الرصيد\",\n  \"accountBalanceHeader\": \"رصيد الحساب\",\n  \"accountsHeader\": \"الحسابات\",\n  \"operationsHeader\": \"العمليات\",\n  \"encryptThePayloadHeader\": \"تشفير الملاحظة (Payload)\",\n  \"encryptPayloadHeader\": \"تشفير الملاحظة (Payload)\",\n  \"forSaleHeader\": \"للبيع\",\n  \"borrowedHeader\": \"حساب معار\",\n  \"borrowedTransferredHeader\": \"جارٍ النقل\",\n  \"borrowedAccountHeader\": \"حساب معار\",\n  \"feeColonHeader\": \"رسوم:\",\n  \"pendingHeader\": \"قيد الانتظار\",\n  \"onHeader\": \"تعمل\",\n  \"offHeader\": \"لا تعمل\",\n  \"priceRequiredError\": \"السعر مطلوب\",\n  \"amountRequiredError\": \"المبلغ مطلوب\",\n  \"nameRequiredError\": \"الإسم مطلوب\",\n  \"zeroPriceError\": \"لا يمكن أن يكون السعر 0\",\n  \"zeroAmountError\": \"لا يمكن أن يكون المبلغ 0\",\n  \"invalidAccountNameError\": \"اسم حساب غير صحيح\",\n  \"invalidReceivingAccountError\": \"حساب المستلم غير صحيح\",\n  \"invalidPublicKeyError\": \"مفتاح عام غير صالح\",\n  \"invalidPrivateKeyError\": \"مفتاح خاص غير صالح\",\n  \"invalidAddressError\": \"حساب غير صحيح\",\n  \"invalidAccountError\": \"حساب غير صحيح\",\n  \"invalidDestinationError\": \"وجهة غير صالحة\",\n  \"insufficientBalanceError\": \"رصيد غير كافي\",\n  \"threeCharacterNameError\": \"يجب أن يكون 3 أحرف على الأقل\",\n  \"contactDoesntExistError\": \"جهة الاتصال غير موجودة\",\n  \"contactAlreadyExistsError\": \"جهة الاتصال موجود بالفعل\",\n  \"cantSendToYourselfError\": \"لا يمكن أن ترسل إلى نفسك\",\n  \"somethingWentWrongError\": \"هناك شئ خاطئ، برجاء المحاولة فى وقت لاحق\",\n  \"failedToEncryptPayloadError\": \"فشل في تشفير الملاحظة (Payload)\",\n  \"emptyPasswordError\": \"كلمة المرور لا يمكن أن تكون فارغة\",\n  \"noMatchPasswordError\": \"كلمات المرور غير متطابقة\",\n  \"invalidPasswordError\": \"كلمة مرور خاطئة\",\n  \"didNotGetResponseError\": \"لم نحصل على استجابة من الخادم\\n\",\n  \"noContactsToExportError\": \"لا جهات اتصال للتصدير\",\n  \"noContactsToImportError\": \"لا يوجد جهات اتصال لاستيرادها\",\n  \"failedToImportContactsError\": \"فشل في استيراد جهات الاتصال\",\n  \"blockchainRewardOPDetails\": \"مكافأة البلوكشين (%1)\",\n  \"transactionOPDetails\": \"العملية (%1)\",\n  \"changeKeyOPDetails\": \"تغيير المفتاح (%1)\",\n  \"recoverFundsOPDetails\": \"إسترداد الأموال (%1)\",\n  \"listAccountForSaleOPDetails\": \"إدراج الحساب للبيع (%1)\",\n  \"delistAccountOPDetails\": \"إلغاء إدراج الحساب (%1)\",\n  \"buyAccountOPDetails\": \"شراء حساب (%1)\",\n  \"changeKeySignedOPDetails\": \"تغيير مفتاح التوقيع (%1)\",\n  \"changeAccountInfoOPDetails\": \"تغيير معلومات الحساب (%1)\",\n  \"multioperationOPDetails\": \"عملية متعددة (%1)\",\n  \"unknownOPDetails\": \"غير معروف (%1)\",\n  \"sendingAccountOPDetails\": \"الحساب المُرسِل\",\n  \"receivingAccountOPDetails\": \"الحساب المستقبِل\",\n  \"changingAccountOPDetails\": \"تغيير الحساب\",\n  \"sendAmountOPDetails\": \"إرسال مبلغ\",\n  \"payloadOPDetails\": \"ملاحظة (Payload)\",\n  \"newPublicKeyOPDetails\": \"مفتاح عام جديد\",\n  \"newNameOPDetails\": \"اسم جديد\",\n  \"sellerAccountOPDetails\": \"حساب البائع\",\n  \"accountPriceOPDetails\": \"سعر الحساب\",\n  \"lockedUntilBlockOPDetails\": \"مغلق حتى الكتلة\",\n  \"blockOPDetails\": \"كتلة\",\n  \"timeOPDetails\": \"الوقت\",\n  \"naOPDetails\": \"غير موجود\",\n  \"ophashOPDetails\": \"معرف المعاملة\",\n  \"feeOPDetails\": \"رسوم\",\n  \"noperationOPDetails\": \"المعاملات المرسلة\",\n  \"accountOPDetails\": \"حساب\",\n  \"noResultsFound\": \"لا توجد نتائج\",\n  \"getAccountThirdParagraphAlternative\": \"2. يمكنك شراء حساب واحد مقابل <colored>%1 باسكال (%2).</colored><colored> مسموح فقط بـ \\\"حساب\\\" واحد لكل مستخدم</colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"2. يمكنك شراء \\\"حساب\\\" مقابل <colored>%1 باسكال (%2).</colored><colored> يمكنك شراء حتى %3 حساب.</colored>\",\n  \"receiveAccountButton\": \"استلام حساب\",\n  \"receiveAnAccountButton\": \"استلام حساب\",\n  \"okayButton\": \"موافق\",\n  \"liveSupportButton\": \"مساعدة؟\",\n  \"invalidPhoneNumberParagraph\": \"رقم التليفون غير صالح\",\n  \"confirmationCodeError\": \"فشل التحقق، تأكد من كتابة الرمز المرسل إليك بشكل صحيح\",\n  \"freepasaComplete\": \"تم بنجاح، حسابك الجديد سيظهر بعد 1 تأكيد من الشبكة\",\n  \"unconfirmedAccountHeader\": \"حساب (لم يتم تأكيده)\",\n  \"unconfirmedAccountParagraph\": \"هذا <colored>حساب غير مؤكد</colored>. تم نقله إليك، ولكن بإنتظار 1 تأكيد من الشبكة قبل ان تتمكن نم إستخدامه. قد تستغرق هذه العملية 5 دقائق، وعندما تكتمل سيكون بإمكانك استخدام الحساب.\",\n  \"connectingHeader\": \"جارٍ الإتصال\"\n}"
  },
  {
    "path": "lib/l10n/intl_ca.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"Nova clau privada\",\n  \"importPrivateKeyButton\": \"Importa clau privada\",\n  \"gotItButton\": \"Ho tinc!\",\n  \"goBackButton\": \"Torna\",\n  \"copyButton\": \"Còpia\",\n  \"copiedButton\": \"Copiat\",\n  \"keyCopiedButton\": \"Clau copiada\",\n  \"iHaveBackedItUpButton\": \"Copia realitzada\",\n  \"yesImSureButton\": \"Sí, n'estic segur\",\n  \"noGoBackButton\": \"No, torna enrere\",\n  \"getAnAccountButton\": \"Obtenir un compte\",\n  \"getAFreeAccountButton\": \"Obtenir un compte gratuït\",\n  \"buyAnAccountButton\": \"Comprar un compte\",\n  \"sendConfirmationButton\": \"Confirmar l'enviament\",\n  \"confirmButton\": \"Confirmar\",\n  \"borrowAnAccountButton\": \"Elimina un compte\",\n  \"importButton\": \"Importa\",\n  \"receiveButton\": \"Rebre\",\n  \"sendButton\": \"Enviar\",\n  \"copyAddressButton\": \"Copiar adreça\",\n  \"copiedAddressButton\": \"Adreça copiada\",\n  \"addToContactsButton\": \"Afegir a contactes\",\n  \"operationDetailsButton\": \"Detalls de l'operació\",\n  \"openInExplorerButton\": \"Obriu a l'Explorador\",\n  \"requestButton\": \"Sol·licitud\",\n  \"addAPayloadButton\": \"+ Afegir un concepte (Payload)\",\n  \"addADurationButton\": \"+ Afegir una Durada\",\n  \"scanQRCodeButton\": \"Escaneig del codi QR\",\n  \"cancelButton\": \"Cancel·lar\",\n  \"closeButton\": \"Tanca\",\n  \"changeNameButton\": \"Canviar el nom\",\n  \"transferButton\": \"Transferència\",\n  \"listForSaleButton\": \"Posar a la venda\",\n  \"createPrivateSaleButton\": \"Crear una venda privada\",\n  \"yesAddFeeButton\": \"Sí, afegeix comissió\",\n  \"unlockButton\": \"Desbloquejar\",\n  \"unlockWithBiometricsButton\": \"Desbloquejar amb Biometrics\",\n  \"unlockWithPINButton\": \"Desbloquegeu amb el PIN\",\n  \"setToDefaultButton\": \"Establir a valors predeterminats\",\n  \"changeDaemonButton\": \"Canvia de servidor\",\n  \"addContactButton\": \"Afegeix contacte\",\n  \"encryptedKeyButton\": \"Clau xifrada\",\n  \"unencryptedKeyButton\": \"Clau no xifrada\",\n  \"encryptButton\": \"Xifra\",\n  \"showButton\": \"Mostra\",\n  \"hideButton\": \"Amaga\",\n  \"copyEncryptedKeyButton\": \"Copia la clau xifrada\",\n  \"copyUnencryptedKeyButton\": \"Copia la clau sense xifrar\",\n  \"copyKeyButton\": \"Copia la clau privada\",\n  \"copyPublicKeyButton\": \"Copia la clau pública\",\n  \"deletePrivateKeyAndLogoutButton\": \"Suprimeix la clau privada\\nTanca la sessió\",\n  \"searchForNameButton\": \"Buscar nom\",\n  \"searchAccountNameButton\": \"Cerca el nom del compte\",\n  \"searchNameButton\": \"Nom de la cerca\",\n  \"okayGoBackButton\": \"D'acord, torna\",\n  \"nextButton\": \"Pròxim\",\n  \"welcomeParagraph\": \"Benvingut a la cartera Blaise. Per començar, podeu crear una clau privada o importar-ne una.\",\n  \"newKeySecurityParagraph\": \"A la pantalla següent, veureu la vostra clau privada nova. És una contrasenya per accedir als vostres fons. És fonamental que el feu una còpia de seguretat i no el compartiu mai amb ningú.\",\n  \"uninstallDisclaimerParagraph\": \"Si perdeu el dispositiu o desinstalgeu Blaise Wallet, necessitareu la clau privada per recuperar els vostres fons.\",\n  \"newPrivateKeyParagraph\": \"A continuació, es mostra la clau privada de la nova cartera. És fonamental que feu una còpia de seguretat de la clau privada i no la guardeu mai com a text de pantalla o captura de pantalla. Recomanem escriure-la en un tros de paper i guardar-la fora de línia.\",\n  \"newKeyBackUpConfirmParagraph\": \"Esteu segur que heu creat una còpia de seguretat de la clau privada de la nova billetera?\",\n  \"newWalletGreetingParagraph\": \"Benvingut a <colored> Blaise Wallet </colored>. \\n Podeu començar obtenint un compte.\",\n  \"getAccountFirstParagraph\": \"Hi ha dues opcions per obtenir el teu primer compte:\",\n  \"getAccountSecondParagraph\": \"1- Podeu obtenir un compte gratuït mitjançant el vostre número de telèfon. <colored> Només es permet un compte per número de telèfon. </colored>\",\n  \"getAccountThirdParagraph\": \"2- Podeu comprar tants comptes com vulgueu per <colored>% 1 Pascal (% 2). </colored>\",\n  \"enterPhoneNumberParagraph\": \"Introduïu el vostre número de telèfon a continuació.\",\n  \"enterConfirmationCodeParagraph\": \"Us hem enviat un codi de confirmació, introduïu-lo a continuació.\",\n  \"borrowStarted\": \"S'ha iniciat la compra per a% 1\",\n  \"borrowAccountParagraph\": \"Per comprar un compte, primer haurà de demanar un préstec gratuït. Si envieu almenys <colored>% 1 Pascal (% 2) </colored> al compte dins de <colored>% 3 dies </colored>, el compte serà vostre i <colored>% 1 Pascal </colored> es descomptarà automàticament del vostre saldo. \\n En cas contrari, ens retornarà al final de <colored>% 3 dies </colored> i ja no pertanyrà a la vostra cartera. \\n Es recomana només envieu una petita quantitat de monedes fins que no teniu el compte.\",\n  \"importPrivateKeyParagraph\": \"Introduïu la vostra clau privada a continuació.\",\n  \"looksLikeEncryptedKeyParagraph\": \"Sembla que una clau privada xifrada, introduïu la contrasenya per desxifrar-la i importar-la.\",\n  \"changeDaemonParagraph\": \"Introduïu una adreça per utilitzar un dimoni Pascal diferent per a sol·licituds RPC.\",\n  \"urlChangedToParagraph\": \"L'URL s'ha canviat a% 1\",\n  \"backupKeyFirstParagraph\": \"Teniu dues opcions per fer una còpia de seguretat de la vostra clau privada:\",\n  \"backupKeySecondParagraph\": \"1- Encriptat, el que significa que està protegit amb una contrasenya.\",\n  \"backupKeyThirdParagraph\": \"2- No xifrat, cosa que significa que és brut i no protegit per una contrasenya.\",\n  \"backupKeyFourthParagraph\": \"Recomanem guardar fora de línia la versió no xifrada, escrivint-la en un tros de paper. Podeu emmagatzemar la versió xifrada en un gestor de contrasenyes per a la vostra comoditat.\",\n  \"encryptKeyParagraph\": \"Creeu una contrasenya nova per xifrar la vostra clau privada.\",\n  \"backupEncryptedKeyFirstParagraph\": \"A continuació, trobareu la vostra clau privada xifrada. Està protegit per una contrasenya. Podeu emmagatzemar-lo de forma segura en un gestor de contrasenyes per a la vostra comoditat.\",\n  \"backupEncryptedKeySecondParagraph\": \"Com que està xifrada amb la vostra contrasenya, si perds o oblides la teva contrasenya, no podràs desxifrar-la ni accedir als teus fons.\",\n  \"backupUnencryptedKeyParagraph\": \"A continuació, trobareu la vostra clau privada sense xifrar. <colored> No està protegit per una contrasenya, cosa que significa que és important guardar-la en algun lloc segur i fora de línia. </colored> Recomanem escriure-la en un tros de paper.\",\n  \"publicKeyParagraph\": \"A continuació, es mostra la vostra clau pública. Com el seu nom indica, es pretén compartir públicament i demostrar que una operació particular pertany a la vostra clau privada.\",\n  \"borrowedAccountParagraph\": \"Aquest és un <colored> compte prestat </colored>. \\n Si li envieu almenys <colored>% 1 Pascal </colored> en els següents <colored>% 2 dies,% 3 hores i% 4 minuts </colored>, ja serà teu.\",\n  \"borrowedAccountPaidParagraph\": \"<colored> El vostre compte s'ha comprat! </colored> \\n La transferència es processa actualment. Aquest procés sol durar uns 15 minuts <colored> </colored>, en alguns casos pot trigar una mica més.\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored> En tancar la sessió, suprimireu la clau privada i totes les dades relacionades amb Blaise d'aquest dispositiu. </colored> Si la vostra clau privada no està feta una còpia de seguretat, no podreu tornar a accedir als vostres fons. Si hi ha una còpia de seguretat de la teva clau privada, no et preocuparà res.\",\n  \"logoutSecondDisclaimerParagraph\": \"Esteu segur que heu fet una còpia de seguretat de la vostra clau privada? <colored> Sempre que hàgiu fet una còpia de seguretat de la vostra clau privada, no us haureu de preocupar. </colored>\",\n  \"sendingConfirmParagraph\": \"Confirmeu les dades de la transacció a enviar.\",\n  \"sentParagraph\": \"La transacció s'ha enviat correctament.\",\n  \"changeNameParagraph\": \"Introduïu un nom a continuació per canviar el nom del vostre compte.\",\n  \"changingNameParagraph\": \"Confirmeu el nom del compte nou per continuar.\",\n  \"changedNameParagraph\": \"El vostre nom del compte s'ha canviat correctament.\",\n  \"transferParagraph\": \"Introduïu una clau pública a continuació per transferir-hi la propietat d’aquest compte.\",\n  \"transferringParagraph\": \"Confirmeu la clau pública següent per transferir-hi la propietat d’aquest compte.\",\n  \"transferredParagraph\": \"El vostre compte s'ha transferit correctament a la clau pública següent.\",\n  \"listForSaleParagraph\": \"Introduïu un preu i un compte que rebran el pagament per llistar aquest compte per vendre.\",\n  \"listingForSaleParagraph\": \"Confirmeu el preu i el compte que rebrà el pagament.\",\n  \"listedForSaleParagraph\": \"El vostre compte s'ha llistat amb èxit per a la venda. Us informarem si algú la compra.\",\n  \"createPrivateSaleParagraph\": \"Introduïu un preu, un compte de recepció i una clau pública a continuació per crear una venda privada per a aquest compte.\",\n  \"creatingPrivateSaleParagraph\": \"Confirmeu la informació següent.\",\n  \"createdPrivateSaleParagraph\": \"La venda privada s'ha creat correctament. Us informarem si es compra.\",\n  \"delistFromSaleParagraph\": \"Confirmeu que voleu suprimir aquest compte des de la venda.\",\n  \"delistedFromSaleParagraph\": \"El vostre compte s'ha suprimit correctament de la venda.\",\n  \"feeRequiredParagraph\": \"Aquesta operació requereix un cànon.\",\n  \"feeConfirmAmountParagraph\": \"Per confirmar l’addició de taxa de Pascal% 1 a aquesta operació per continuar.\",\n  \"keyTypeNotSupportedParagraph\": \"Aquest tipus de clau privada encara no és compatible amb Blaise. Podeu crear una clau privada nova i transferir-ne els comptes mitjançant una cartera diferent.\",\n  \"enterPINToUnlockParagraph\": \"Introduïu el PIN per desbloquejar Blaise\",\n  \"authenticateToUnlockParagraph\": \"Autentica per desbloquejar Blaise\",\n  \"manyFailedAttemptsParagraph\": \"Massa intents fallits de desbloqueig\",\n  \"authenticateToChangeNameParagraph\": \"Autentica per canviar el nom del compte a \\\"% 1\\\"\",\n  \"authenticateToDelistParagraph\": \"Autentifica't per eliminar la compte des de la venda\",\n  \"authenticateToListForSaleParagraph\": \"Autentica la llista del compte en venda\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"Autentiqueu-vos per crear venda privada\",\n  \"authenticateToTransferParagraph\": \"Autentica la transferència del compte\",\n  \"authenticateToSendParagraph\": \"Autentica per enviar% 1 Pascal\",\n  \"authenticateToBackUpParagraph\": \"Autentiqueu la còpia de seguretat de clau privada\",\n  \"invalidPINParagraph\": \"PIN no vàlid\",\n  \"noMatchPINParagraph\": \"Els PIN no coincideixen\",\n  \"confirmPINParagraph\": \"Confirmeu el PIN\",\n  \"enterPINParagraph\": \"Introduïu el PIN\",\n  \"createPINParagraph\": \"Creeu un PIN de 6 dígits\",\n  \"addedToContactsParagraph\": \"% 1 afegit als contactes\",\n  \"removedFromContactsParagraph\": \"S'ha eliminat% 1 dels contactes\",\n  \"failedToRemoveFromContactsParagraph\": \"No s'ha pogut eliminar% 1 dels contactes\",\n  \"successfullyImportedContactsParagraph\": \"% 1 contactes importats amb èxit\",\n  \"checkOutBlaiseParagraph\": \"Fes una ullada a Blaise! Cartera de Pascal senzilla, elegant i segura per a iOS i Android: https://blaisewallet.com\",\n  \"newAccountParagraph\": \"Aquest és el vostre nou compte. \\n Un cop rebut <colored> Pascal </colored>, les operacions es mostraran com a continuació.\",\n  \"settingsHeader\": \"Configuració\",\n  \"preferencesHeader\": \"Preferències\",\n  \"currencyHeader\": \"Moneda\",\n  \"languageHeader\": \"Llenguatge\",\n  \"languageColonHeader\": \"Llenguatge:\",\n  \"systemDefaultHeader\": \"Predeterminat del sistema\",\n  \"themeHeader\": \"Tema\",\n  \"themeLightHeader\": \"Llum\",\n  \"themeDarkHeader\": \"Fosc\",\n  \"themeCopperHeader\": \"Coure\",\n  \"notificationsHeader\": \"Notificacions\",\n  \"securityHeader\": \"Seguretat\",\n  \"authenticationMethodHeader\": \"Mètode d'autenticació\",\n  \"authenticationPINHeader\": \"PIN\",\n  \"authenticationBiometricsHeader\": \"Biometria\",\n  \"authenticateOnLaunchHeader\": \"Autentica't a Launch\",\n  \"yesHeader\": \"Sí\",\n  \"noHeader\": \"No\",\n  \"automaticallyLockHeader\": \"Bloquejar automàticament\",\n  \"lockInstantHeader\": \"Instantàniament\",\n  \"lock1Header\": \"Després de% 1 minut\",\n  \"lock5Header\": \"Després de% 1 minuts\",\n  \"lock15Header\": \"Després de% 1 minuts\",\n  \"lock30Header\": \"Després de% 1 minuts\",\n  \"lock60Header\": \"Després de% 1 minuts\",\n  \"daemonHeader\": \"Dimoni\",\n  \"defaultHeader\": \"Per defecte\",\n  \"manageHeader\": \"Gestiona\",\n  \"contactsHeader\": \"Contactes\",\n  \"backUpPrivateKeyHeader\": \"Còpia de seguretat de clau privada\",\n  \"viewPublicKeyHeader\": \"Veure clau pública\",\n  \"shareHeader\": \"Comparteix Blaise\",\n  \"logoutHeader\": \"Tancar sessió\",\n  \"privacyPolicyHeader\": \"Política de privacitat\",\n  \"changeAccountNameHeader\": \"Canvieu el nom del compte\",\n  \"transferAccountHeader\": \"Compte de transferència\",\n  \"listAccountForSaleHeader\": \"Llista de compte en venda\",\n  \"createPrivateSaleHeader\": \"Crea venda privada\",\n  \"delistFromSaleHeader\": \"Elimina la venda\",\n  \"getAccountSheetHeader\": \"Obtén un compte\",\n  \"freeAccountSheetHeader\": \"Compte gratuït\",\n  \"buyAccountSheetHeader\": \"Compra el compte\",\n  \"sendSheetHeader\": \"Envia\",\n  \"sendingSheetHeader\": \"S'està enviant\",\n  \"sentSheetHeader\": \"Enviat\",\n  \"requestSheetHeader\": \"Sol·licitud\",\n  \"changeNameSheetHeader\": \"Canvieu el nom\",\n  \"changingNameSheetHeader\": \"Canviant\",\n  \"changedNameSheetHeader\": \"Canviat\",\n  \"transferSheetHeader\": \"Transferència\",\n  \"transferringSheetHeader\": \"Transferència\",\n  \"transferredSheetHeader\": \"Traspassat\",\n  \"listForSaleSheetHeader\": \"Llistat en venda\",\n  \"listingForSaleSheetHeader\": \"Llistat\",\n  \"listedForSaleSheetHeader\": \"Enumerat\",\n  \"createPrivateSaleSheetHeader\": \"Venda privada\",\n  \"creatingPrivateSaleSheetHeader\": \"Creació\",\n  \"createdPrivateSaleSheetHeader\": \"Creat\",\n  \"delistingSheetHeader\": \"Suprimint\",\n  \"delistedSheetHeader\": \"Suprimit\",\n  \"addContactSheetHeader\": \"Afegeix contacte\",\n  \"contactSheetHeader\": \"Contacte\",\n  \"publicKeySheetHeader\": \"Clau pública\",\n  \"privateKeySheetHeader\": \"Clau privada\",\n  \"backUpSheetHeader\": \"Còpia de seguretat\",\n  \"encryptSheetHeader\": \"Xifra\",\n  \"changeDaemonSheetHeader\": \"Canvia de dimoni\",\n  \"securityFirstHeader\": \"Seguretat primer!\",\n  \"newPrivateKeyHeader\": \"Nova clau privada\",\n  \"importPrivateKeyHeader\": \"Importa clau privada\",\n  \"decryptAndImportKeyHeader\": \"Desxifra i importa\",\n  \"backUpKeyHeader\": \"Fes una còpia de seguretat de la clau\",\n  \"lockedHeader\": \"Bloquejat\",\n  \"privateKeyTextFieldHeader\": \"Clau privada\",\n  \"passwordTextFieldHeader\": \"Contrasenya\",\n  \"newPasswordTextFieldHeader\": \"nova contrasenya\",\n  \"confirmPasswordTextFieldHeader\": \"Confirma la contrassenya\",\n  \"confirmTextFieldHeader\": \"Confirmeu\",\n  \"countryCodeTextFieldHeader\": \"Codi del país\",\n  \"phoneNumberTextFieldHeader\": \"Número de telèfon\",\n  \"confirmationCodeTextFieldHeader\": \"Codi de confirmació\",\n  \"accountTextFieldHeader\": \"Compte\",\n  \"addressTextFieldHeader\": \"adreça\",\n  \"contactNameTextFieldHeader\": \"Nom de contacte\",\n  \"amountTextFieldHeader\": \"Import\",\n  \"payloadTextFieldHeader\": \"Càrrega útil\",\n  \"nameTextFieldHeader\": \"Nom\",\n  \"newAccountNameTextFieldHeader\": \"Nou nom del compte\",\n  \"publicKeyTextFieldHeader\": \"Clau pública\",\n  \"priceTextFieldHeader\": \"Preu\",\n  \"receivingAccountTextFieldHeader\": \"Compte de recepció\",\n  \"durationTextFieldHeader\": \"Durada\",\n  \"feeTextFieldHeader\": \"Comissió\",\n  \"otherOperationsHeader\": \"Altres operacions\",\n  \"warningHeader\": \"Avís\",\n  \"areYouSureHeader\": \"Estàs segur?\",\n  \"addFeeHeader\": \"Afegir tarifa\",\n  \"keyTypeNotSupportedHeader\": \"Clau no compatible\",\n  \"accountToSendFromHeader\": \"Compte per enviar des\",\n  \"sentHeader\": \"Enviat\",\n  \"receivedHeader\": \"Rebut\",\n  \"nameChangedHeader\": \"Canviat el nom\",\n  \"listedForSaleHeader\": \"Llistat en venda\",\n  \"privateSaleHeader\": \"Venda privada\",\n  \"delistedFromSaleHeader\": \"Eliminat de la venda\",\n  \"delistedHeader\": \"Suprimit\",\n  \"undefinedHeader\": \"Indefinit\",\n  \"transferredHeader\": \"Traspassat\",\n  \"balanceHeader\": \"Equilibri\",\n  \"totalBalanceHeader\": \"Saldo total\",\n  \"accountBalanceHeader\": \"Saldo del compte\",\n  \"accountsHeader\": \"Comptes\",\n  \"operationsHeader\": \"Operacions\",\n  \"encryptThePayloadHeader\": \"Xifra la càrrega útil\",\n  \"encryptPayloadHeader\": \"Xifra la càrrega útil\",\n  \"forSaleHeader\": \"A la venda\",\n  \"borrowedHeader\": \"Prestat\",\n  \"borrowedTransferredHeader\": \"Transferència pendent\",\n  \"borrowedAccountHeader\": \"Compte prestat\",\n  \"feeColonHeader\": \"Taxa:\",\n  \"pendingHeader\": \"Pendents\",\n  \"onHeader\": \"Encès\",\n  \"offHeader\": \"Desactivat\",\n  \"priceRequiredError\": \"El preu és obligatori\",\n  \"amountRequiredError\": \"Quantitat obligatòria\",\n  \"nameRequiredError\": \"El seu nom és obligatori\",\n  \"zeroPriceError\": \"El preu no pot ser 0\",\n  \"zeroAmountError\": \"La quantitat no pot ser 0\",\n  \"invalidAccountNameError\": \"El nom del compte no és vàlid\",\n  \"invalidReceivingAccountError\": \"Compte de recepció no vàlid\",\n  \"invalidPublicKeyError\": \"Clau pública no vàlida\",\n  \"invalidPrivateKeyError\": \"Clau privada no vàlida\",\n  \"invalidAddressError\": \"Adreça no vàlida\",\n  \"invalidAccountError\": \"Compte no vàlid\",\n  \"invalidDestinationError\": \"Destinació no vàlida\",\n  \"insufficientBalanceError\": \"Saldo insuficient\",\n  \"threeCharacterNameError\": \"Ha de tenir com a mínim 3 caràcters\",\n  \"contactDoesntExistError\": \"El contacte no existeix\",\n  \"contactAlreadyExistsError\": \"El contacte ja existeix\",\n  \"cantSendToYourselfError\": \"No es pot enviar a tu mateix\",\n  \"somethingWentWrongError\": \"Alguna cosa ha anat malament. Si us plau torna-ho a intentar després\",\n  \"failedToEncryptPayloadError\": \"No s'ha pogut xifrar la càrrega útil\",\n  \"emptyPasswordError\": \"La contrasenya no pot estar buida\",\n  \"noMatchPasswordError\": \"Les contrasenyes no coincideixen\",\n  \"invalidPasswordError\": \"Contrasenya invàlida\",\n  \"didNotGetResponseError\": \"No s'ha obtingut resposta del servidor\",\n  \"noContactsToExportError\": \"No hi ha contactes per exportar\",\n  \"noContactsToImportError\": \"No hi ha contactes a importar\",\n  \"failedToImportContactsError\": \"No s'ha pogut importar contactes\",\n  \"blockchainRewardOPDetails\": \"Recompensa Blockchain (% 1)\",\n  \"transactionOPDetails\": \"Transacció (% 1)\",\n  \"changeKeyOPDetails\": \"Canvia la clau (% 1)\",\n  \"recoverFundsOPDetails\": \"Recuperació de fons (% 1)\",\n  \"listAccountForSaleOPDetails\": \"Llista del compte en venda (% 1)\",\n  \"delistAccountOPDetails\": \"Suprimeix el compte (% 1)\",\n  \"buyAccountOPDetails\": \"Compra del compte (% 1)\",\n  \"changeKeySignedOPDetails\": \"Canvia la signada amb clau (% 1)\",\n  \"changeAccountInfoOPDetails\": \"Canvia la informació del compte (% 1)\",\n  \"multioperationOPDetails\": \"Multioperació (% 1)\",\n  \"unknownOPDetails\": \"Desconegut (% 1)\",\n  \"sendingAccountOPDetails\": \"Compte enviant\",\n  \"receivingAccountOPDetails\": \"Compte de recepció\",\n  \"changingAccountOPDetails\": \"Canvi de compte\",\n  \"sendAmountOPDetails\": \"Enviar import\",\n  \"payloadOPDetails\": \"Càrrega útil\",\n  \"newPublicKeyOPDetails\": \"Nova clau pública\",\n  \"newNameOPDetails\": \"Nou nom\",\n  \"sellerAccountOPDetails\": \"Compte del venedor\",\n  \"accountPriceOPDetails\": \"Preu del compte\",\n  \"lockedUntilBlockOPDetails\": \"Bloquejat fins el bloc\",\n  \"blockOPDetails\": \"bloc\",\n  \"optxtOPDetails\": \"optxt\",\n  \"timeOPDetails\": \"temps\",\n  \"naOPDetails\": \"N / A\",\n  \"ophashOPDetails\": \"ophash\",\n  \"optypeOPDetails\": \"òptic\",\n  \"maturationOPDetails\": \"maduració\",\n  \"nullOPDetails\": \"nul\",\n  \"feeOPDetails\": \"quota\",\n  \"opblockOPDetails\": \"opbloquejar\",\n  \"noperationOPDetails\": \"n_operació\",\n  \"accountOPDetails\": \"compte\",\n  \"signeraccountOPDetails\": \"signer_account\",\n  \"noResultsFound\": \"Sense resultats\",\n  \"getAccountThirdParagraphAlternative\": \"2- Podeu comprar un compte per a <colored>% 1 Pascal (% 2). </colored> <colored> Comprar només un compte està permès per usuari. </colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"2- Podeu comprar un compte per a <colored>% 1 Pascal (% 2). </colored> <colored> Podeu comprar fins a% 3 comptes. </colored>\",\n  \"receiveAccountButton\": \"Rep el compte\",\n  \"receiveAnAccountButton\": \"Rebre un compte\",\n  \"okayButton\": \"Bé\",\n  \"liveSupportButton\": \"Assistència\",\n  \"invalidPhoneNumberParagraph\": \"El número de telèfon no és vàlid\",\n  \"confirmationCodeError\": \"No s'ha pogut verificar el codi, assegureu-vos que l'heu introduït correctament\",\n  \"freepasaComplete\": \"Amb èxit, el nou compte estarà disponible després de 1 confirmació de xarxa\",\n  \"unconfirmedAccountHeader\": \"Compte no confirmat\",\n  \"unconfirmedAccountParagraph\": \"Aquest és un <colored> compte no confirmat </colored>. S'ha transferit a tu, però abans de poder utilitzar-lo cal que existeixi una confirmació de xarxa. Generalment triguen uns 5 minuts, un cop finalitzat, podreu utilitzar aquest compte.\",\n  \"connectingHeader\": \"Connectant\"\n}"
  },
  {
    "path": "lib/l10n/intl_de.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"Neuer privater Schlüssel\",\n  \"importPrivateKeyButton\": \"Schlüssel importieren\",\n  \"gotItButton\": \"Verstanden!\",\n  \"goBackButton\": \"Zurück\",\n  \"copyButton\": \"Kopieren\",\n  \"copiedButton\": \"Kopiert\",\n  \"keyCopiedButton\": \"Schlüssel kopiert\",\n  \"iHaveBackedItUpButton\": \"Ich habe ihn gesichert\",\n  \"yesImSureButton\": \"Ja, ich bin sicher\",\n  \"noGoBackButton\": \"Nein, zurück\",\n  \"getAnAccountButton\": \"Konto anlegen\",\n  \"getAFreeAccountButton\": \"Kostenloses Konto erhalten\",\n  \"buyAnAccountButton\": \"Konto kaufen\",\n  \"sendConfirmationButton\": \"Bestätigung senden\",\n  \"confirmButton\": \"Bestätigen\",\n  \"borrowAnAccountButton\": \"Konto leihen\",\n  \"importButton\": \"Importieren\",\n  \"receiveButton\": \"Empfangen\",\n  \"sendButton\": \"Senden\",\n  \"copyAddressButton\": \"Kontonummer kopieren\",\n  \"copiedAddressButton\": \"Kontonummer kopiert\",\n  \"addToContactsButton\": \"Zu Kontakten hinzufügen\",\n  \"operationDetailsButton\": \"Vorgangs-Details\",\n  \"openInExplorerButton\": \"Im explorer anzeigen\",\n  \"requestButton\": \"Anfrage\",\n  \"addAPayloadButton\": \"+ Betreff festlegen\",\n  \"addADurationButton\": \"+ Dauer festlegen\",\n  \"scanQRCodeButton\": \"QR Code scannen\",\n  \"cancelButton\": \"Abbrechen\",\n  \"closeButton\": \"Schließen\",\n  \"changeNameButton\": \"Name ändern\",\n  \"transferButton\": \"Übertragen\",\n  \"listForSaleButton\": \"Verkaufen\",\n  \"createPrivateSaleButton\": \"Private verkaufen\",\n  \"yesAddFeeButton\": \"Ja, Gebühr hinzufügen\",\n  \"unlockButton\": \"Entsperren\",\n  \"unlockWithBiometricsButton\": \"Mit Biometrie entsperren\",\n  \"unlockWithPINButton\": \"Mit PIN entsperren\",\n  \"setToDefaultButton\": \"Zurücksetzen\",\n  \"changeDaemonButton\": \"Server wechseln\",\n  \"addContactButton\": \"Kontakt hinzufügen\",\n  \"encryptedKeyButton\": \"Chiffrierter Schlüssel\",\n  \"unencryptedKeyButton\": \"Klartext Schlüssel\",\n  \"encryptButton\": \"Verschlüsseln\",\n  \"showButton\": \"Anzeigen\",\n  \"hideButton\": \"Verstecken\",\n  \"copyEncryptedKeyButton\": \"Kopieren\",\n  \"copyUnencryptedKeyButton\": \"Kopieren\",\n  \"copyKeyButton\": \"Kopieren\",\n  \"copyPublicKeyButton\": \"Öffentlichen Schlüssel kopieren\",\n  \"deletePrivateKeyAndLogoutButton\": \"Privaten Schlüssel löschen\\nund abmelden\",\n  \"searchForNameButton\": \"Suche nach Namen\",\n  \"searchAccountNameButton\": \"Suche Name\",\n  \"searchNameButton\": \"Suche Name\",\n  \"okayGoBackButton\": \"Okay, zurück\",\n  \"nextButton\": \"Weiter\",\n  \"welcomeParagraph\": \"Willkommen bei der Blaise Wallet. Um zu starten musst Du entweder einen neuen privaten Schlüssel generieren oder einen bestehenden importieren.\",\n  \"newKeySecurityParagraph\": \"Im nächsten Schritt siehst Du Deinen privaten Schlüssel. Mit diesem Schlüssel hast Du Zugriff auf Deine Pascal. Es ist wichtig, dass Du diesen Schlüssel sicherst und mit niemanden teilst!\",\n  \"uninstallDisclaimerParagraph\": \"Wenn Du Dein Gerät verlierst oder die Blaise Wallet deinstallierst, brauchst Du Deinen privaten Schlüssel für die Wiederherstellung.\",\n  \"newPrivateKeyParagraph\": \"Nachfolgend findest Du Deinen neuen privaten Schlüssel. Es ist unbedingt erforderlich, dass Du diesen sicherst - aber bitte nicht als Screenshot oder in Klartext auf Deinem Computer oder Smartphone. Wir empfehlen Dir ihn auf einem Blatt Papier zu notieren.\",\n  \"newKeyBackUpConfirmParagraph\": \"Hast Du Deinen privaten Schlüssel wirklich gesichert?\",\n  \"newWalletGreetingParagraph\": \"Willkommen bei der <colored>Blaise Wallet</colored>.\\n Zum Start musst Du Dir ein Konto anlegen.\",\n  \"getAccountFirstParagraph\": \"Es gibt 2 Möglichkeiten, um Dein erstes Konto erhalten:\",\n  \"getAccountSecondParagraph\": \"1- Du kannst ein kostenfreies Konto mit Hilfe Deiner Telefonnummer erhalten. <colored>Nur 1 Konto pro Telefonnummer erlaubt.</colored>\",\n  \"getAccountThirdParagraph\": \"2- Du kannst beliebig viele Konten für eine Gebühr von <colored>%1 Pascal (%2)</colored> erwerben.\",\n  \"enterPhoneNumberParagraph\": \"Trage Deine Telefonnummer hier ein.\",\n  \"enterConfirmationCodeParagraph\": \"Wir haben Dir einen Bestätigungs-Code gesendet. Bitte hier eintragen.\",\n  \"borrowStarted\": \"Konto-Kauf für %1 gestartet\",\n  \"borrowAccountParagraph\": \"Um ein Konto zu kaufen, musst Du Dir zu Beginn eines ausleihen. Wenn Du innerhalb von <colored>%3 Tage(n)</colored> mindestens <colored>%1 Pascal (%2)</colored> an das geliehene Konto überweist, gehört es Dir und der Betrag von <colored>%1 Pascal</colored> wird automatisch abgezogen.\\nAnsonsten geht das geliehene Konto nach <colored>%3 Tage(n)</colored> an uns zurück und ist nicht mehr Teil Deiner Wallet.\\nWir empfehlen Dir, nicht zu große Beträge an das Konto zu senden, solange es nicht Dir gehört.\",\n  \"importPrivateKeyParagraph\": \"Trage Deinen privaten Schlüssel ein\",\n  \"looksLikeEncryptedKeyParagraph\": \"Siehst aus als wäre der private Schlüssel chiffriert. Bitte trage das Passwort zum dechiffrieren ein\",\n  \"changeDaemonParagraph\": \"Trage eine Adresse zu einem anderen Pascal-Server ein\",\n  \"urlChangedToParagraph\": \"Pascal-Server geändert zu %1\",\n  \"backupKeyFirstParagraph\": \"Du hast 2 Möglichkeiten, um Deinen privaten Schlüssel zu sichern:\",\n  \"backupKeySecondParagraph\": \"1- Chiffrieren mit Hilfe eines Passworts\",\n  \"backupKeyThirdParagraph\": \"2- Nicht chiffriert, im Klartext und ungeschützt\",\n  \"backupKeyFourthParagraph\": \"Wir empfehlen Dir, die nicht chiffrierte Version des Schlüssels auf einem Blatt Papier zu notieren. Die chiffrierte Version kann in einem Passwort Manager gespeichert werden.\",\n  \"encryptKeyParagraph\": \"Neues Passwort erstellen um den privaten Schlüssel verschlüsseln.\",\n  \"backupEncryptedKeyFirstParagraph\": \"Hier ist Dein mit einem Passwort chiffrierter privater Schlüssel. Du kannst Ihn problemlos in einem Passwort Manager speichern.\",\n  \"backupEncryptedKeySecondParagraph\": \"Wenn Du das Passwort vergisst oder verlierst, kannst Du nicht mehr auf Deine Pascal zugreifen.\",\n  \"backupUnencryptedKeyParagraph\": \"Nachfolgend siehst Du Deinen privaten Schlüssel. <colored>Dieser ist nicht mit einem Passwort geschützt, deshalb ist es zwingend erforderlich, dass Du ihn sicher offline verwahrst!</colored> Wir empfehlen ihn auf Papier zu notieren.\",\n  \"publicKeyParagraph\": \"Nachfolgend siehst Du Deinen öffentlichen Schlüssel, der mit jedem geteilt und zur Verifizierung Deiner Vorgänge genutzt werden kann.\",\n  \"borrowedAccountParagraph\": \"Dies ist ein <colored>geliehenes Konto</colored>.\\nWenn Du in den nächsten <colored>%2 Tage(n), %3 Stunde(n) und %4 Minute(n)</colored> mindestens <colored>%1 Pascal</colored> an das Konto sendest gehört es Dir!\",\n  \"borrowedAccountPaidParagraph\": \"<colored>Du hast das Konto gekauft!</colored>\\nDie Übertragung läuft gerade. Dieser Vorgang dauert ungefähr <colored>15 Minuten</colored>, manchmal kann es auch etwas länger dauern. Bitte habe ein wenig Geduld, Du kannst in Kürze loslegen.\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored>Wenn Du dich abmeldest, werden Deine Schlüssel und alle Blaise bezogenen Daten von diesem Gerät gelöscht.</colored> Hast Du Deinen privaten Schlüssel gesichert? Wenn nicht, wirst Du alles verlieren. Wenn ja, brauchst Du Dir keine Sorgen zu machen.\",\n  \"logoutSecondDisclaimerParagraph\": \"Bist Du Dir sicher, dass Du Deinen privaten Schlüssel gesichert hast? <colored>Wenn ja, brauchst Du Dir keine Sorgen zu machen.</colored>\",\n  \"sendingConfirmParagraph\": \"Bitte bestätige die Überweisungsdaten.\",\n  \"sentParagraph\": \"Die Überweisung wurde erfolgreich ausgeführt.\",\n  \"changeNameParagraph\": \"Trage einen neuen Namen für Dein Konto ein.\",\n  \"changingNameParagraph\": \"Bitte bestätige den neuen Namen für Dein Konto.\",\n  \"changedNameParagraph\": \"Der Name des Kontos wurde erfolgreich geändert.\",\n  \"transferParagraph\": \"Trage nachfolgend den öffentl. Schlüssel ein, an den das Konto übertragen wird.\",\n  \"transferringParagraph\": \"Bitte bestätige den nachfolgenden öffentl. Schlüssel, um das Konto zu übertragen.\",\n  \"transferredParagraph\": \"Dein Konto wurde erfolgreich an den folgenden öffentl. Schlüssel übertragen.\",\n  \"listForSaleParagraph\": \"Trage 1. den Kaufpreis und 2. den Empfänger des Kaufpreises für dieses Konto ein.\",\n  \"listingForSaleParagraph\": \"Bitte bestätige den Betrag und den Empfänger der Überweisung.\",\n  \"listedForSaleParagraph\": \"Das Konto steht jetzt zum Verkauf. Sobald es gekauft wurde sagen wir Dir Bescheid.\",\n  \"createPrivateSaleParagraph\": \"Trage den Preis, den Empfänger des Kaufpreises und den öffentlichen Schlüssel ein, um das Konto Privat zu verkaufen.\",\n  \"creatingPrivateSaleParagraph\": \"Bitte bestätige die folgenden Angaben.\",\n  \"createdPrivateSaleParagraph\": \"Das Konto steht jetzt zum privaten Verkauf. Sobald es gekauft wurde sagen wir Dir Bescheid.\",\n  \"delistFromSaleParagraph\": \"Bitte bestätige den Abbruch des Konto-Verkaufs.\",\n  \"delistedFromSaleParagraph\": \"Der Verkauf wurde erfolgreich abgebrochen.\",\n  \"feeRequiredParagraph\": \"Für diesen Vorgang wird eine Gebühr benötigt.\",\n  \"feeConfirmAmountParagraph\": \"Bitte bestätige, dass %1 Pascal als Gebühr hinzugefügt werden.\",\n  \"keyTypeNotSupportedParagraph\": \"Dieser Schlüssel-Typ wird leider nicht unterstützt. Du kannst einen neuen privaten Schlüssel anlegen und das Konto mit Hilfe einer anderen Wallet auf diesen übertragen.\",\n  \"enterPINToUnlockParagraph\": \"PIN eintragen um die Blaise Wallet zu entsperren\",\n  \"authenticateToUnlockParagraph\": \"Authentifizieren um die Blaise Wallet zu entsperren\",\n  \"manyFailedAttemptsParagraph\": \"Zu viele fehlgeschlagene Entsperrversuche\",\n  \"authenticateToChangeNameParagraph\": \"Anmelden um den Namen des Kontos auf \\\"%1\\\" zu ändern\",\n  \"authenticateToDelistParagraph\": \"Anmelden um den Konto-Verkauf abzubrechen\",\n  \"authenticateToListForSaleParagraph\": \"Anmelden um Konto zu verkaufen\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"Anmelden um Konto privat zu verkaufen\",\n  \"authenticateToTransferParagraph\": \"Anmelden um Konto zu übertragen\",\n  \"authenticateToSendParagraph\": \"Anmelden um %1 Pascal zu senden\",\n  \"authenticateToBackUpParagraph\": \"Anmelden um den privaten Schlüssel zu sichern\",\n  \"invalidPINParagraph\": \"Ungültige PIN\",\n  \"noMatchPINParagraph\": \"Die PINs stimmen nicht überein\",\n  \"confirmPINParagraph\": \"PIN bestätigen\",\n  \"enterPINParagraph\": \"PIN eintragen\",\n  \"createPINParagraph\": \"6-stellige PIN erstellen\",\n  \"addedToContactsParagraph\": \"%1 zu den Kontakten hinzugefügt\",\n  \"removedFromContactsParagraph\": \"%1 aus den Kontakten entfernt\",\n  \"failedToRemoveFromContactsParagraph\": \"Fehler beim entfernen von %1 aus den Kontakten\",\n  \"successfullyImportedContactsParagraph\": \"%1 Kontakte erfolgreich importiert\",\n  \"checkOutBlaiseParagraph\": \"Schau Dir Blaise an! Die sichere und einfach zu bedienende Pascal Wallet für iOS und Android: https://blaisewallet.com\",\n  \"newAccountParagraph\": \"Dies ist Dein neues Konto. \\nSobald Du <colored>Pascal</colored> empfängst oder sendest, werden die Überweisungen hier aufgelistet.\",\n  \"settingsHeader\": \"Einstellungen\",\n  \"preferencesHeader\": \"Konfiguration\",\n  \"currencyHeader\": \"Währung\",\n  \"languageHeader\": \"Sprache\",\n  \"languageColonHeader\": \"Sprache:\",\n  \"systemDefaultHeader\": \"Standard\",\n  \"themeHeader\": \"Thema\",\n  \"themeLightHeader\": \"Hell\",\n  \"themeDarkHeader\": \"Dunkel\",\n  \"themeCopperHeader\": \"Kupfer\",\n  \"notificationsHeader\": \"Benachrichtigungen\",\n  \"securityHeader\": \"Sicherheit\",\n  \"authenticationMethodHeader\": \"Authentifizierung\",\n  \"authenticationPINHeader\": \"PIN\",\n  \"authenticationBiometricsHeader\": \"Biometrie\",\n  \"authenticateOnLaunchHeader\": \"Anmelden bei Start\",\n  \"yesHeader\": \"Ja\",\n  \"noHeader\": \"Nein\",\n  \"automaticallyLockHeader\": \"Automatisch sperren\",\n  \"lockInstantHeader\": \"Sofort\",\n  \"lock1Header\": \"Nach %1 Minute\",\n  \"lock5Header\": \"Nach %1 Minuten\",\n  \"lock15Header\": \"Nach %1 Minuten\",\n  \"lock30Header\": \"Nach %1 Minuten\",\n  \"lock60Header\": \"Nach %1 Minuten\",\n  \"daemonHeader\": \"Server\",\n  \"defaultHeader\": \"Standard\",\n  \"manageHeader\": \"Verwalten\",\n  \"contactsHeader\": \"Kontakte\",\n  \"backUpPrivateKeyHeader\": \"Privaten Schlüssel sichern\",\n  \"viewPublicKeyHeader\": \"Öffentlichen Schlüssel anzeigen\",\n  \"shareHeader\": \"Blaise teilen\",\n  \"logoutHeader\": \"Abmelden\",\n  \"privacyPolicyHeader\": \"Datenschutzrichtlinie\",\n  \"changeAccountNameHeader\": \"Konto Name ändern\",\n  \"transferAccountHeader\": \"Konto übertragen\",\n  \"listAccountForSaleHeader\": \"Konto verkaufen\",\n  \"createPrivateSaleHeader\": \"Privat verkaufen\",\n  \"delistFromSaleHeader\": \"Verkauf stoppen\",\n  \"getAccountSheetHeader\": \"Konto anlegen\",\n  \"freeAccountSheetHeader\": \"Kostenfreies Konto\",\n  \"buyAccountSheetHeader\": \"Konto kaufen\",\n  \"sendSheetHeader\": \"Senden\",\n  \"sendingSheetHeader\": \"Sende\",\n  \"sentSheetHeader\": \"Gesendet\",\n  \"requestSheetHeader\": \"Anfragen\",\n  \"changeNameSheetHeader\": \"Name ändern\",\n  \"changingNameSheetHeader\": \"Speichere\",\n  \"changedNameSheetHeader\": \"Geändert\",\n  \"transferSheetHeader\": \"Übertragen\",\n  \"transferringSheetHeader\": \"Übertrage\",\n  \"transferredSheetHeader\": \"Übertragen\",\n  \"listForSaleSheetHeader\": \"Verkaufen\",\n  \"listingForSaleSheetHeader\": \"Verkaufen\",\n  \"listedForSaleSheetHeader\": \"Zum Verkauf gelistet\",\n  \"createPrivateSaleSheetHeader\": \"Privatverkauf\",\n  \"creatingPrivateSaleSheetHeader\": \"Erstelle\",\n  \"createdPrivateSaleSheetHeader\": \"Erstellt\",\n  \"delistingSheetHeader\": \"Breche Verkauf ab\",\n  \"delistedSheetHeader\": \"Verkauf abgebrochen\",\n  \"addContactSheetHeader\": \"Kontakt hinzufügen\",\n  \"contactSheetHeader\": \"Kontakt\",\n  \"publicKeySheetHeader\": \"Öffentlicher Schlüssel\",\n  \"privateKeySheetHeader\": \"Privater Schlüssel\",\n  \"backUpSheetHeader\": \"Sicherung\",\n  \"encryptSheetHeader\": \"Verschlüsseln\",\n  \"changeDaemonSheetHeader\": \"Server wechseln\",\n  \"securityFirstHeader\": \"Sicherheit zuerst!\",\n  \"newPrivateKeyHeader\": \"Neues Schlüsselpaar\",\n  \"importPrivateKeyHeader\": \"Schlüssel importieren\",\n  \"decryptAndImportKeyHeader\": \"Entschlüsseln und importieren\",\n  \"backUpKeyHeader\": \"Schlüssel gesichert?\",\n  \"lockedHeader\": \"Gesperrt\",\n  \"privateKeyTextFieldHeader\": \"Privater Schlüssel\",\n  \"passwordTextFieldHeader\": \"Passwort\",\n  \"newPasswordTextFieldHeader\": \"Neues Passwort\",\n  \"confirmPasswordTextFieldHeader\": \"Passwort bestätigen\",\n  \"confirmTextFieldHeader\": \"Bestätigen\",\n  \"countryCodeTextFieldHeader\": \"Länder-Code\",\n  \"phoneNumberTextFieldHeader\": \"Telefon-Nummer\",\n  \"confirmationCodeTextFieldHeader\": \"Bestätigungs-Code\",\n  \"accountTextFieldHeader\": \"Konto\",\n  \"addressTextFieldHeader\": \"Kontonummer\",\n  \"contactNameTextFieldHeader\": \"Name\",\n  \"amountTextFieldHeader\": \"Betrag\",\n  \"payloadTextFieldHeader\": \"Betreff\",\n  \"nameTextFieldHeader\": \"Name\",\n  \"newAccountNameTextFieldHeader\": \"Neuer Konto Name\",\n  \"publicKeyTextFieldHeader\": \"Öffentlicher Schlüssel\",\n  \"priceTextFieldHeader\": \"Preis\",\n  \"receivingAccountTextFieldHeader\": \"Empfänger\",\n  \"durationTextFieldHeader\": \"Dauer\",\n  \"feeTextFieldHeader\": \"Gebühr\",\n  \"otherOperationsHeader\": \"Andere Vorgänge\",\n  \"warningHeader\": \"Warnung\",\n  \"areYouSureHeader\": \"Bist Du sicher?\",\n  \"addFeeHeader\": \"Gebühr hinzufügen\",\n  \"keyTypeNotSupportedHeader\": \"Schlüssel nicht unterstützt\",\n  \"accountToSendFromHeader\": \"Absender\",\n  \"sentHeader\": \"Gesendet\",\n  \"receivedHeader\": \"Empfangen\",\n  \"nameChangedHeader\": \"Name geändert\",\n  \"listedForSaleHeader\": \"Zu verkaufen\",\n  \"privateSaleHeader\": \"Privater Verkauf\",\n  \"delistedFromSaleHeader\": \"Verkauf abgebrochen\",\n  \"delistedHeader\": \"Verkauf abgebrochen\",\n  \"undefinedHeader\": \"Unbekannt\",\n  \"transferredHeader\": \"Übertragen\",\n  \"balanceHeader\": \"Saldo\",\n  \"totalBalanceHeader\": \"Kontostand aller Konten\",\n  \"accountBalanceHeader\": \"Kontostand\",\n  \"accountsHeader\": \"Konten\",\n  \"operationsHeader\": \"Vorgänge\",\n  \"encryptThePayloadHeader\": \"Betreff verschlüsseln\",\n  \"encryptPayloadHeader\": \"Betreff verschlüsseln\",\n  \"forSaleHeader\": \"zu verkaufen\",\n  \"borrowedHeader\": \"geliehen\",\n  \"borrowedTransferredHeader\": \"Übertragung wartend\",\n  \"borrowedAccountHeader\": \"Geliehenes Konto\",\n  \"feeColonHeader\": \"Gebühr:\",\n  \"pendingHeader\": \"ausstehend\",\n  \"onHeader\": \"An\",\n  \"offHeader\": \"Aus\",\n  \"priceRequiredError\": \"Preis wird benötigt\",\n  \"amountRequiredError\": \"Betrag wird benötigt\",\n  \"nameRequiredError\": \"Name wird benötigt\",\n  \"zeroPriceError\": \"Preis kann nicht 0 sein\",\n  \"zeroAmountError\": \"Betrag kann nicht 0 sein\",\n  \"invalidAccountNameError\": \"Ungültiger Konto Name\",\n  \"invalidReceivingAccountError\": \"Ungültiger Empfänger\",\n  \"invalidPublicKeyError\": \"Ungültiger öffentl. Schlüssel\",\n  \"invalidPrivateKeyError\": \"Ungültiger privater Schlüssel\",\n  \"invalidAddressError\": \"Ungültiges Konto\",\n  \"invalidAccountError\": \"Ungültiges Konto\",\n  \"invalidDestinationError\": \"Ungültiger Empfänger\",\n  \"insufficientBalanceError\": \"Ungültiger Betrag\",\n  \"threeCharacterNameError\": \"Muss aus mindestens 3 Zeichen bestehen\",\n  \"contactDoesntExistError\": \"Kontakt existiert nicht\",\n  \"contactAlreadyExistsError\": \"Kontakt existiert bereits\",\n  \"cantSendToYourselfError\": \"Du kannst nicht an dich selbst senden\",\n  \"somethingWentWrongError\": \"Etwas ist schief gelaufen, probiere es später erneut\",\n  \"failedToEncryptPayloadError\": \"Fehler beim verschlüsseln des Betreffs\",\n  \"emptyPasswordError\": \"Das Passwort darf nicht leer sein\",\n  \"noMatchPasswordError\": \"Die Passwörter stimmen nicht überein\",\n  \"invalidPasswordError\": \"Falsches Passwort\",\n  \"didNotGetResponseError\": \"Der Server antwortet nicht\",\n  \"noContactsToExportError\": \"Keine Kontakte zum exportieren\",\n  \"noContactsToImportError\": \"Keine Kontakte zum importieren\",\n  \"failedToImportContactsError\": \"Fehler beim importieren der Kontakte\",\n  \"blockchainRewardOPDetails\": \"Blockchain Reward (%1)\",\n  \"transactionOPDetails\": \"Überweisung (%1)\",\n  \"changeKeyOPDetails\": \"Konto-Übertragung (%1)\",\n  \"recoverFundsOPDetails\": \"Recover Funds (%1)\",\n  \"listAccountForSaleOPDetails\": \"Konto zum Verkauf (%1)\",\n  \"delistAccountOPDetails\": \"Verkauf abgebrochen (%1)\",\n  \"buyAccountOPDetails\": \"Konto gekauft (%1)\",\n  \"changeKeySignedOPDetails\": \"Fremde Konto-Übertragung (%1)\",\n  \"changeAccountInfoOPDetails\": \"Konto Daten geändert (%1)\",\n  \"multioperationOPDetails\": \"Multi-Vorgang (%1)\",\n  \"unknownOPDetails\": \"Unbekannt (%1)\",\n  \"sendingAccountOPDetails\": \"Absender\",\n  \"receivingAccountOPDetails\": \"Empfänger\",\n  \"changingAccountOPDetails\": \"Ändere Konto\",\n  \"sendAmountOPDetails\": \"Betrag senden\",\n  \"payloadOPDetails\": \"Betreff\",\n  \"newPublicKeyOPDetails\": \"Neuer öffentl. Schlüssel\",\n  \"newNameOPDetails\": \"Neuer Name\",\n  \"sellerAccountOPDetails\": \"Verkäufer\",\n  \"accountPriceOPDetails\": \"Konto Preis\",\n  \"lockedUntilBlockOPDetails\": \"Gesperrt bis Block\",\n  \"blockOPDetails\": \"Block\",\n  \"optxtOPDetails\": \"Vorgangs-Info\",\n  \"timeOPDetails\": \"Zeitpunkt\",\n  \"naOPDetails\": \"n.a.\",\n  \"ophashOPDetails\": \"Vorgangs-Prüfsumme\",\n  \"optypeOPDetails\": \"Vorgangstyp\",\n  \"maturationOPDetails\": \"Alter (in Blöcken)\",\n  \"nullOPDetails\": \"null\",\n  \"feeOPDetails\": \"Gebühr\",\n  \"opblockOPDetails\": \"Position in Block\",\n  \"noperationOPDetails\": \"Konto Vorgangsnummer\",\n  \"accountOPDetails\": \"Konto\",\n  \"signeraccountOPDetails\": \"Signierer\",\n  \"noResultsFound\": \"Keine Ergebnisse\",\n  \"getAccountThirdParagraphAlternative\": \"2- Du kannst ein Konto für <colored>%1 Pascal (%2)</colored> kaufen.<colored> Der Blaise-Service erlaubt den Erwerb von einem Konto pro Benutzer. Im Normalfall brauchst Du auch nur eins.</colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"2- Du kannst ein Konto für <colored>%1 Pascal (%2)</colored> kaufen.<colored> Der Blaise-Service erlaubt den Erwerb von 3 Konten pro Benutzer. Im Normalfall brauchst Du lediglich eins.</colored>\",\n  \"receiveAccountButton\": \"Konto erhalten\",\n  \"receiveAnAccountButton\": \"Ein Konto erhalten\",\n  \"okayButton\": \"Okay\",\n  \"liveSupportButton\": \"Hilfe\",\n  \"invalidPhoneNumberParagraph\": \"Keine valide Telefonnummer\",\n  \"confirmationCodeError\": \"Der Code war falsch, bitte probiere es erneut\",\n  \"freepasaComplete\": \"Dein neues Konto wird nach dem nächsten Block zur Verfügung stehen\",\n  \"unconfirmedAccountHeader\": \"Noch nicht bestätigtes Konto\",\n  \"unconfirmedAccountParagraph\": \"Dies ist ein <colored>nicht bestätigtes Konto</colored>. Es wurde Dir bereits zugeordnet, aber Du musst noch einen Block lang warten. Das dauert in der Regel ungefähr 5 Minuten. Sobald der Block abgeschlossen ist, hast Du vollen Zugriff auf dieses Konto.\",\n  \"connectingHeader\": \"Verbinde\"\n}"
  },
  {
    "path": "lib/l10n/intl_en.arb",
    "content": "{\n  \"@@last_modified\": \"2019-10-18T09:27:20.827100\",\n  \"newPrivateKeyButton\": \"New Private Key\",\n  \"@newPrivateKeyButton\": {\n    \"description\": \"A button that creates a new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyButton\": \"Import Private Key\",\n  \"@importPrivateKeyButton\": {\n    \"description\": \"A button that imports a private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"gotItButton\": \"Got It!\",\n  \"@gotItButton\": {\n    \"description\": \"A button that implies a message is understood\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"goBackButton\": \"Go Back\",\n  \"@goBackButton\": {\n    \"description\": \"A button to go back to previous screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyButton\": \"Copy\",\n  \"@copyButton\": {\n    \"description\": \"A button to copy something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copiedButton\": \"Copied\",\n  \"@copiedButton\": {\n    \"description\": \"A button to inform the user that something has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyCopiedButton\": \"Key Copied\",\n  \"@keyCopiedButton\": {\n    \"description\": \"A button to inform the user that the key has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"iHaveBackedItUpButton\": \"I've Backed It Up\",\n  \"@iHaveBackedItUpButton\": {\n    \"description\": \"A button to confirm that something is backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesImSureButton\": \"Yes, I'm Sure\",\n  \"@yesImSureButton\": {\n    \"description\": \"A button to confirm if the user is sure\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noGoBackButton\": \"No, Go Back\",\n  \"@noGoBackButton\": {\n    \"description\": \"A button to go back to previous screen if the user didnt do what the question asks\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAnAccountButton\": \"Get an Account\",\n  \"@getAnAccountButton\": {\n    \"description\": \"A button to start the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAFreeAccountButton\": \"Get a Free Account\",\n  \"@getAFreeAccountButton\": {\n    \"description\": \"A button to start the process of getting a free account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAnAccountButton\": \"Buy an Account\",\n  \"@buyAnAccountButton\": {\n    \"description\": \"A button to start the process of buying an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendConfirmationButton\": \"Send Confirmation\",\n  \"@sendConfirmationButton\": {\n    \"description\": \"A button to request a confirmation to be sent\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmButton\": \"Confirm\",\n  \"@confirmButton\": {\n    \"description\": \"A button to confirm that a process should be executed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowAnAccountButton\": \"Borrow An Account\",\n  \"@borrowAnAccountButton\": {\n    \"description\": \"A button to borrow an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importButton\": \"Import\",\n  \"@importButton\": {\n    \"description\": \"A button to import something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveButton\": \"Receive\",\n  \"@receiveButton\": {\n    \"description\": \"A button to receive Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendButton\": \"Send\",\n  \"@sendButton\": {\n    \"description\": \"A button to send Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyAddressButton\": \"Copy Address\",\n  \"@copyAddressButton\": {\n    \"description\": \"A button to copy an address\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copiedAddressButton\": \"Address Copied\",\n  \"@copiedAddressButton\": {\n    \"description\": \"A button to inform the user that the address has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addToContactsButton\": \"Add to Contacts\",\n  \"@addToContactsButton\": {\n    \"description\": \"A button to add an account to contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"operationDetailsButton\": \"Operation Details\",\n  \"@operationDetailsButton\": {\n    \"description\": \"A button to view the details of an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"openInExplorerButton\": \"Open in Explorer\",\n  \"@openInExplorerButton\": {\n    \"description\": \"A button to view the details of an operation on the Pascal explorer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"requestButton\": \"Request\",\n  \"@requestButton\": {\n    \"description\": \"A button to request something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addAPayloadButton\": \"+ Add a Payload\",\n  \"@addAPayloadButton\": {\n    \"description\": \"A button to add a payload (note) to an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addADurationButton\": \"+ Add a Duration\",\n  \"@addADurationButton\": {\n    \"description\": \"A button to add a duration to the sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"scanQRCodeButton\": \"Scan QR Code\",\n  \"@scanQRCodeButton\": {\n    \"description\": \"A button to scan a QR Code\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"cancelButton\": \"Cancel\",\n  \"@cancelButton\": {\n    \"description\": \"A button to cancel a process\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"closeButton\": \"Close\",\n  \"@closeButton\": {\n    \"description\": \"A button to close a screen or a pop-up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameButton\": \"Change Name\",\n  \"@changeNameButton\": {\n    \"description\": \"A button to change the name of an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferButton\": \"Transfer\",\n  \"@transferButton\": {\n    \"description\": \"A button to transfer the ownership of an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleButton\": \"List for Sale\",\n  \"@listForSaleButton\": {\n    \"description\": \"A button to list an account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleButton\": \"Create Private Sale\",\n  \"@createPrivateSaleButton\": {\n    \"description\": \"A button to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesAddFeeButton\": \"Yes, Add Fee\",\n  \"@yesAddFeeButton\": {\n    \"description\": \"A button to confirm the addition of a fee to an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockButton\": \"Unlock\",\n  \"@unlockButton\": {\n    \"description\": \"A button to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockWithBiometricsButton\": \"Unlock with Biometrics\",\n  \"@unlockWithBiometricsButton\": {\n    \"description\": \"A button to unlock the wallet using biometrics\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockWithPINButton\": \"Unlock with PIN\",\n  \"@unlockWithPINButton\": {\n    \"description\": \"A button to unlock the wallet using PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"setToDefaultButton\": \"Set to Default\",\n  \"@setToDefaultButton\": {\n    \"description\": \"A button to set something to its default\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonButton\": \"Change Daemon\",\n  \"@changeDaemonButton\": {\n    \"description\": \"A button to change the Pascal daemon for RPC requests\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addContactButton\": \"Add Contact\",\n  \"@addContactButton\": {\n    \"description\": \"A button to add a contact\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptedKeyButton\": \"Encrypted Key\",\n  \"@encryptedKeyButton\": {\n    \"description\": \"A button to view the encrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unencryptedKeyButton\": \"Unencrypted Key\",\n  \"@unencryptedKeyButton\": {\n    \"description\": \"A button to view the unencrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptButton\": \"Encrypt\",\n  \"@encryptButton\": {\n    \"description\": \"A button to encrypt the private key with a password\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"showButton\": \"Show\",\n  \"@showButton\": {\n    \"description\": \"A button to show something that is hidden\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"hideButton\": \"Hide\",\n  \"@hideButton\": {\n    \"description\": \"A button to hide something that is shown\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyEncryptedKeyButton\": \"Copy Encrypted Key\",\n  \"@copyEncryptedKeyButton\": {\n    \"description\": \"A button to copy an encrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyUnencryptedKeyButton\": \"Copy Unencrypted Key\",\n  \"@copyUnencryptedKeyButton\": {\n    \"description\": \"A button to copy an unencrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyKeyButton\": \"Copy Key\",\n  \"@copyKeyButton\": {\n    \"description\": \"A button to copy a key (private or public key)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyPublicKeyButton\": \"Copy Public Key\",\n  \"@copyPublicKeyButton\": {\n    \"description\": \"A button to copy a public key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"deletePrivateKeyAndLogoutButton\": \"Delete Private Key\\nAnd Logout\",\n  \"@deletePrivateKeyAndLogoutButton\": {\n    \"description\": \"A button to delete the private key and logout\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchForNameButton\": \"Search For Name\",\n  \"@searchForNameButton\": {\n    \"description\": \"A button to search for an account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchAccountNameButton\": \"Search Account Name\",\n  \"@searchAccountNameButton\": {\n    \"description\": \"A button to search an account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchNameButton\": \"Search Name\",\n  \"@searchNameButton\": {\n    \"description\": \"A button to search name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"okayGoBackButton\": \"Okay, Go Back\",\n  \"@okayGoBackButton\": {\n    \"description\": \"A button to confirm and go back\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"okayButton\": \"Okay\",\n  \"@okayButton\": {\n    \"description\": \"A button that simply indicates a neutral action, like closing an informative dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nextButton\": \"Next\",\n  \"@nextButton\": {\n    \"description\": \"A button to the next screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveAccountButton\": \"Receive Account\",\n  \"@receiveAccountButton\": {\n    \"description\": \"A button to open up the public key sheet(screen) that displays a QR code to receive an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveAnAccountButton\": \"Receive an Account\",\n  \"@receiveAnAccountButton\": {\n    \"description\": \"A button to open up the public key sheet(screen) that displays a QR code to receive an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"supportButton\": \"Support\",\n  \"@supportButton\": {\n    \"description\": \"A button to open up the live support window\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"liveSupportButton\": \"Support\",\n  \"@liveSupportButton\": {\n    \"description\": \"A button to open up the live support window\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"welcomeParagraph\": \"Welcome to Blaise Wallet. To begin, you can create a new private key or import one.\",\n  \"@welcomeParagraph\": {\n    \"description\": \"A paragraph that greets the user in the initial opening\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newKeySecurityParagraph\": \"In the next screen, you'll see your new private key. It is a password to access your funds. It is crucial that you back it up and never share it with anyone.\",\n  \"@newKeySecurityParagraph\": {\n    \"description\": \"A paragraph that explains what users should do with their new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"uninstallDisclaimerParagraph\": \"If you lose your device or uninstall Blaise Wallet, you'll need your private key to recover your funds.\",\n  \"@uninstallDisclaimerParagraph\": {\n    \"description\": \"A paragraph that gives a security disclaimer about what happens if the wallet is uninstalled\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPrivateKeyParagraph\": \"Below is your new wallet’s private key. It is crucial that you backup your private key and never store it as plaintext or a screenshot. We recommend writing it on a piece of paper and storing it offline.\",\n  \"@newPrivateKeyParagraph\": {\n    \"description\": \"A paragraph that explains what users should do with their new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newKeyBackUpConfirmParagraph\": \"Are you sure that you have backed up your new wallet’s private key?\",\n  \"@newKeyBackUpConfirmParagraph\": {\n    \"description\": \"A paragraph to confirm if the new private key is backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newWalletGreetingParagraph\": \"Welcome to <colored>Blaise Wallet</colored>.\\nYou can start by getting an account.\",\n  \"@newWalletGreetingParagraph\": {\n    \"description\": \"A paragraph to greet the user when a new wallet is created\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountFirstParagraph\": \"There are 2 options for getting your first account:\",\n  \"@getAccountFirstParagraph\": {\n    \"description\": \"The first paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountSecondParagraph\": \"1- You can get a free account using your phone number. <colored>Only 1 account per phone number is allowed.</colored>\",\n  \"@getAccountSecondParagraph\": {\n    \"description\": \"The second paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraph\": \"2- You can buy as many accounts as you want for <colored>%1 Pascal (%2).</colored>\",\n  \"@getAccountThirdParagraph\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraphAlternative\": \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> Buying only 1 account is allowed per user.</colored>\",\n  \"@getAccountThirdParagraphAlternative\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraphAlternative2\": \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> You can buy up to %3 accounts.</colored>\",\n  \"@getAccountThirdParagraphAlternative2\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPhoneNumberParagraph\": \"Enter your phone number below.\",\n  \"@enterPhoneNumberParagraph\": {\n    \"description\": \"A paragraph that tells users to enter their phone number to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPhoneNumberParagraph\": \"Phone number is not valid\",\n  \"@invalidPhoneNumberParagraph\": {\n    \"description\": \"User has entered an invalid phone number\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterConfirmationCodeParagraph\": \"We have sent you a confirmation code, please enter it below.\",\n  \"@enterConfirmationCodeParagraph\": {\n    \"description\": \"A paragraph that tells users to enter the confirmation code to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmationCodeError\": \"Failed to verify code, ensure you've entered it correctly\",\n  \"@confirmationCodeError\": {\n    \"description\": \"When a user enters their freepasa SMS code but it can't be verified\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"freepasaComplete\": \"Success, your new account will be available after 1 network confirmation\",\n  \"@freepasaComplete\": {\n    \"description\": \"After the freepasa process is complete\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unconfirmedAccountHeader\": \"Unconfirmed Account\",\n  \"@unconfirmedAccountHeader\": {\n    \"description\": \"A user has an account in their wallet that has been transferred to them, but isnt confirmed yet. This is the info dialog header.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unconfirmedAccountParagraph\": \"This is an <colored>unconfirmed account</colored>. It has been transferred to you, but there needs to be 1 network confirmation before you can use it. This usually takes about 5 minutes, once it's complete you'll be able to use this account.\",\n  \"@unconfirmedAccountParagraph\": {\n    \"description\": \"Explaining that an account can't be used until 1 network confirmation to the user.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowStarted\": \"Purchase Started for %1\",\n  \"@borrowStarted\": {\n    \"description\": \"Users may see this after starting the account purchase process\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowAccountParagraph\": \"To buy an account, first you’ll need to borrow one for free. If you send at least <colored>%1 Pascal (%2)</colored> to the account within <colored>%3 days</colored>, the account will be yours and <colored>%1 Pascal</colored> will be deducted from your balance automatically.\\nOtherwise, it’ll return back to us at the end of <colored>%3 days</colored> and won’t belong to your wallet anymore.\\nIt is recommended you only send a small amount of coins until you own the account.\",\n  \"@borrowAccountParagraph\": {\n    \"description\": \"A paragraph that explains the process of borrowing & buying an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyParagraph\": \"Enter your private key below.\",\n  \"@importPrivateKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter their private key to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"looksLikeEncryptedKeyParagraph\": \"This looks like an encrypted private key, please enter the password to decrypt and import it.\",\n  \"@looksLikeEncryptedKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user that the key looks like an encrypted one and it needs to be decrypted to import\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonParagraph\": \"Enter an address to use a different Pascal daemon for RPC requests.\",\n  \"@changeDaemonParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a new daemon address below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"urlChangedToParagraph\": \"URL changed to %1\",\n  \"@urlChangedToParagraph\": {\n    \"description\": \"A paragraph that tells the user that the URL is changed to the entered URL\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyFirstParagraph\": \"You have 2 options for backing up your private key:\",\n  \"@backupKeyFirstParagraph\": {\n    \"description\": \"The first paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeySecondParagraph\": \"1- Encrypted, which means it is protected by a password.\",\n  \"@backupKeySecondParagraph\": {\n    \"description\": \"The second paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyThirdParagraph\": \"2- Unencrypted, which means it is raw and not protected by a password.\",\n  \"@backupKeyThirdParagraph\": {\n    \"description\": \"The third paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyFourthParagraph\": \"We recommend storing the unencrypted version offline, by writing it on a piece of paper. You can store the encrypted version on a password manager for your convenience.\",\n  \"@backupKeyFourthParagraph\": {\n    \"description\": \"The fourth paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptKeyParagraph\": \"Create a new password to encrypt your private key.\",\n  \"@encryptKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user to create a new password to encrypt their key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupEncryptedKeyFirstParagraph\": \"Below is your encrypted private key. It is protected by a password. You can store it safely on a password manager for your convenience.\",\n  \"@backupEncryptedKeyFirstParagraph\": {\n    \"description\": \"A paragraph that explains how an encrypted private key can be backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupEncryptedKeySecondParagraph\": \"Since it is encrypted with your password, if you lose or forget your password, you won't be able to decrypt it and access your funds.\",\n  \"@backupEncryptedKeySecondParagraph\": {\n    \"description\": \"A paragraph that gives a disclaimer about what would happen in case the password that was used to encrypt the private key is lost or forgotten\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupUnencryptedKeyParagraph\": \"Below is your unencrypted private key. <colored>It is not protected by a password, which means it is crucial that you store it somewhere safe and offline.</colored> We recommend writing it on a piece of paper.\",\n  \"@backupUnencryptedKeyParagraph\": {\n    \"description\": \"A paragraph that explains the process of backing up the unencrypted private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeyParagraph\": \"Below is your public key. As the name suggests, it is intended to be shared publicly and prove that a particular operation belongs to your private key.\",\n  \"@publicKeyParagraph\": {\n    \"description\": \"A paragraph that explains what a public key is\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountParagraph\": \"This is a <colored>borrowed account</colored>.\\nIf you send at least <colored>%1 Pascal</colored> to it in the next <colored>%2 days, %3 hours, and %4 minutes</colored>, it’ll be yours.\",\n  \"@borrowedAccountParagraph\": {\n    \"description\": \"A paragraph that explains what a borrowed account is\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountPaidParagraph\": \"<colored>Your account has been purchased!</colored>\\nThe transfer is currently processing. This process usually takes about <colored>15 minutes</colored>, in some cases it may take slightly longer.\",\n  \"@borrowedAccountPaidParagraph\": {\n    \"description\": \"A paragraph that explains that the account has been purchased and transfer is currently processing\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutFirstDisclaimerParagraph\": \"<colored>Logging out will remove your private key and all Blaise related data from this device.</colored> If your private key is not backed up, you will never be able to access your funds again. If your private key is backed up, you have nothing to worry about.\",\n  \"@logoutFirstDisclaimerParagraph\": {\n    \"description\": \"The first part of the disclaimer that is shown when the user tries to log out.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutSecondDisclaimerParagraph\": \"Are you sure that you've backed up your private key? <colored>As long as you've backed up your private key, you have nothing to worry about.</colored>\",\n  \"@logoutSecondDisclaimerParagraph\": {\n    \"description\": \"The second part of the disclaimer that is shown when the user tries to log out.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noResultsFound\": \"No results found\",\n  \"@noResultsFound\": {\n    \"description\": \"When searching for account name has returned 0 results\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingConfirmParagraph\": \"Confirm the transaction details to send.\",\n  \"@sendingConfirmParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the info below to send\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentParagraph\": \"Transaction has been sent succesfully.\",\n  \"@sentParagraph\": {\n    \"description\": \"A paragraph that informs the user that the transaction has been sent succesfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameParagraph\": \"Enter a name below to change your account's name.\",\n  \"@changeNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a new account name below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingNameParagraph\": \"Confirm your new account name to proceed.\",\n  \"@changingNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the new account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changedNameParagraph\": \"Your account name has been changed successfully.\",\n  \"@changedNameParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account name has been changed successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferParagraph\": \"Enter a public key below to transfer the ownership of this account to it.\",\n  \"@transferParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a public key to the text field below to transfer the ownership of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferringParagraph\": \"Confirm the public key below to transfer the ownership of this account to it.\",\n  \"@transferringParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the public key below to proceed with the transfer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredParagraph\": \"Your account has been transferred successfully to the public key below.\",\n  \"@transferredParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account transfer has been completed successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleParagraph\": \"Enter a price and an account that will be receiving the payment to list this account for sale.\",\n  \"@listForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a price and a receiver account to list the account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listingForSaleParagraph\": \"Confirm the price and the account that will be receiving the payment.\",\n  \"@listingForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the price and the receiver account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleParagraph\": \"Your account has been successfully listed for sale. We’ll let you know if someone buys it.\",\n  \"@listedForSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account has been listed for sale successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleParagraph\": \"Enter a price, a receiving account, and a public key below to create a private sale for this account.\",\n  \"@createPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a price, a receiver account, and a public key to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"creatingPrivateSaleParagraph\": \"Confirm the information below.\",\n  \"@creatingPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the information below.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createdPrivateSaleParagraph\": \"The private sale has been created successfully. We’ll let you know if it is bought.\",\n  \"@createdPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the private sale has been created successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistFromSaleParagraph\": \"Confirm that you would like to delist this account from sale.\",\n  \"@delistFromSaleParagraph\": {\n    \"description\": \"A paragraph that tells the users to confirm that they would like to delist the account from sale.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedFromSaleParagraph\": \"Your account has been successfully delisted from sale.\",\n  \"@delistedFromSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account has been delisted from sale successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeRequiredParagraph\": \"This operation requires a fee.\",\n  \"@feeRequiredParagraph\": {\n    \"description\": \"A paragraph to indicate that the operation requires a fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeConfirmAmountParagraph\": \"Please confirm the addition of %1 Pascal fee to this operation to continue.\",\n  \"@feeConfirmAmountParagraph\": {\n    \"description\": \"A paragraph to tell the user to confirm the addition of a fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyTypeNotSupportedParagraph\": \"This type of private key is not yet supported by Blaise. You may create a new private key and transfer your accounts to it using a different wallet.\",\n  \"@keyTypeNotSupportedParagraph\": {\n    \"description\": \"A paragraph to tell the user that the private key type is not supported\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPINToUnlockParagraph\": \"Enter PIN to unlock Blaise\",\n  \"@enterPINToUnlockParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter the PIN to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToUnlockParagraph\": \"Authenticate to Unlock Blaise\",\n  \"@authenticateToUnlockParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"manyFailedAttemptsParagraph\": \"Too many failed unlock attempts\",\n  \"@manyFailedAttemptsParagraph\": {\n    \"description\": \"A paragraph to inform the user that there was too many failed unlock attempts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToChangeNameParagraph\": \"Authenticate to change account name to \\\"%1\\\"\",\n  \"@authenticateToChangeNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to change the name of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToDelistParagraph\": \"Authenticate to delist the account from sale\",\n  \"@authenticateToDelistParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to delist the account from sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToListForSaleParagraph\": \"Authenticate to list account for sale\",\n  \"@authenticateToListForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to list the account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToCreatePrivateSaleParagraph\": \"Authenticate to create private sale\",\n  \"@authenticateToCreatePrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToTransferParagraph\": \"Authenticate to transfer account\",\n  \"@authenticateToTransferParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to transfer the ownership of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToSendParagraph\": \"Authenticate to send %1 Pascal\",\n  \"@authenticateToSendParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to send a specified amount of Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToBackUpParagraph\": \"Authenticate to back up private key\",\n  \"@authenticateToBackUpParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to back up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPINParagraph\": \"Invalid PIN\",\n  \"@invalidPINParagraph\": {\n    \"description\": \"A paragraph that tells the user that the entered PIN is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noMatchPINParagraph\": \"PINs do not match\",\n  \"@noMatchPINParagraph\": {\n    \"description\": \"A paragraph that tells the user that the entered PINs do not match\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmPINParagraph\": \"Confirm your PIN\",\n  \"@confirmPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPINParagraph\": \"Enter PIN\",\n  \"@enterPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter the PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPINParagraph\": \"Create a 6-digit PIN\",\n  \"@createPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to create a PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addedToContactsParagraph\": \"%1 added to contacts\",\n  \"@addedToContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact has been added to contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"removedFromContactsParagraph\": \"Removed %1 from contacts\",\n  \"@removedFromContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact has been removed from contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToRemoveFromContactsParagraph\": \"Failed to remove %1 from contacts\",\n  \"@failedToRemoveFromContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact removel process is failed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"successfullyImportedContactsParagraph\": \"Successfully imported %1 contacts\",\n  \"@successfullyImportedContactsParagraph\": {\n    \"description\": \"A paragraph to tell the user that a specific number of contacts was successfully imported\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"checkOutBlaiseParagraph\": \"Check out Blaise! Simple, sleek & secure Pascal wallet for iOS and Android: https://blaisewallet.com\",\n  \"@checkOutBlaiseParagraph\": {\n    \"description\": \"A paragraph that is shared when the user shares Blaise with others via the option in the settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newAccountParagraph\": \"This is your new account.\\nOnce you receive <colored>Pascal</colored>, operations will show up like below.\",\n  \"@newAccountParagraph\": {\n    \"description\": \"A paragraph that is shown in the operations list of a new account as an explainer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"settingsHeader\": \"Settings\",\n  \"@settingsHeader\": {\n    \"description\": \"Header for the settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"preferencesHeader\": \"Preferences\",\n  \"@preferencesHeader\": {\n    \"description\": \"Header for the preferences section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"currencyHeader\": \"Currency\",\n  \"@currencyHeader\": {\n    \"description\": \"Header for the currencies\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"languageHeader\": \"Language\",\n  \"@languageHeader\": {\n    \"description\": \"Header for the languages\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"languageColonHeader\": \"Language:\",\n  \"@languageColonHeader\": {\n    \"description\": \"Header for the language option on welcome page\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"systemDefaultHeader\": \"System Default\",\n  \"@systemDefaultHeader\": {\n    \"description\": \"Header for system default\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeHeader\": \"Theme\",\n  \"@themeHeader\": {\n    \"description\": \"Header for the themes\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeLightHeader\": \"Light\",\n  \"@themeLightHeader\": {\n    \"description\": \"Header for the light theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeDarkHeader\": \"Dark\",\n  \"@themeDarkHeader\": {\n    \"description\": \"Header for the dark theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeCopperHeader\": \"Copper\",\n  \"@themeCopperHeader\": {\n    \"description\": \"Header for the copper theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"notificationsHeader\": \"Notifications\",\n  \"@notificationsHeader\": {\n    \"description\": \"Header for the notifications\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"securityHeader\": \"Security\",\n  \"@securityHeader\": {\n    \"description\": \"Header for the security section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationMethodHeader\": \"Authentication Method\",\n  \"@authenticationMethodHeader\": {\n    \"description\": \"Header for the authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationPINHeader\": \"PIN\",\n  \"@authenticationPINHeader\": {\n    \"description\": \"Header for the PIN authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationBiometricsHeader\": \"Biometrics\",\n  \"@authenticationBiometricsHeader\": {\n    \"description\": \"Header for the biometric authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateOnLaunchHeader\": \"Authenticate on Launch\",\n  \"@authenticateOnLaunchHeader\": {\n    \"description\": \"Header for the authenticate on launch option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesHeader\": \"Yes\",\n  \"@yesHeader\": {\n    \"description\": \"Header for the yes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noHeader\": \"No\",\n  \"@noHeader\": {\n    \"description\": \"Header for the no option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"automaticallyLockHeader\": \"Automatically Lock\",\n  \"@automaticallyLockHeader\": {\n    \"description\": \"Header for the automatically lock option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockInstantHeader\": \"Instantly\",\n  \"@lockInstantHeader\": {\n    \"description\": \"Header for instantly locking option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock1Header\": \"After %1 minute\",\n  \"@lock1Header\": {\n    \"description\": \"Header for locking after 1 minute option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock5Header\": \"After %1 minutes\",\n  \"@lock5Header\": {\n    \"description\": \"Header for locking after 5 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock15Header\": \"After %1 minutes\",\n  \"@lock15Header\": {\n    \"description\": \"Header for locking after 15 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock30Header\": \"After %1 minutes\",\n  \"@lock30Header\": {\n    \"description\": \"Header for locking after 30 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock60Header\": \"After %1 minutes\",\n  \"@lock60Header\": {\n    \"description\": \"Header for locking after 60 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"daemonHeader\": \"Daemon\",\n  \"@daemonHeader\": {\n    \"description\": \"Header for Pascal daemon setting\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"defaultHeader\": \"Default\",\n  \"@defaultHeader\": {\n    \"description\": \"Header for default option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"manageHeader\": \"Manage\",\n  \"@manageHeader\": {\n    \"description\": \"Header for the manage section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactsHeader\": \"Contacts\",\n  \"@contactsHeader\": {\n    \"description\": \"Header for the contacts section in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpPrivateKeyHeader\": \"Back Up Private Key\",\n  \"@backUpPrivateKeyHeader\": {\n    \"description\": \"Header for the back up private key option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"viewPublicKeyHeader\": \"View Public Key\",\n  \"@viewPublicKeyHeader\": {\n    \"description\": \"Header for the view public key option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"shareHeader\": \"Share Blaise\",\n  \"@shareHeader\": {\n    \"description\": \"Header for the share Blaise option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutHeader\": \"Logout\",\n  \"@logoutHeader\": {\n    \"description\": \"Header for the logout option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privacyPolicyHeader\": \"Privacy Policy\",\n  \"@privacyPolicyHeader\": {\n    \"description\": \"Header for the privacy policy option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeAccountNameHeader\": \"Change Account Name\",\n  \"@changeAccountNameHeader\": {\n    \"description\": \"Header for the change account name option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferAccountHeader\": \"Transfer Account\",\n  \"@transferAccountHeader\": {\n    \"description\": \"Header for the transfer account option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listAccountForSaleHeader\": \"List Account For Sale\",\n  \"@listAccountForSaleHeader\": {\n    \"description\": \"Header for the list account for sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleHeader\": \"Create Private Sale\",\n  \"@createPrivateSaleHeader\": {\n    \"description\": \"Header for the create private sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistFromSaleHeader\": \"Delist From Sale\",\n  \"@delistFromSaleHeader\": {\n    \"description\": \"Header for the delist from sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountSheetHeader\": \"Get Account\",\n  \"@getAccountSheetHeader\": {\n    \"description\": \"Header for the get account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"freeAccountSheetHeader\": \"Free Account\",\n  \"@freeAccountSheetHeader\": {\n    \"description\": \"Header for the free account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAccountSheetHeader\": \"Buy Account\",\n  \"@buyAccountSheetHeader\": {\n    \"description\": \"Header for the buy account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendSheetHeader\": \"Send\",\n  \"@sendSheetHeader\": {\n    \"description\": \"Header for send sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingSheetHeader\": \"Sending\",\n  \"@sendingSheetHeader\": {\n    \"description\": \"Header for sending sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentSheetHeader\": \"Sent\",\n  \"@sentSheetHeader\": {\n    \"description\": \"Header for sent sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"requestSheetHeader\": \"Request\",\n  \"@requestSheetHeader\": {\n    \"description\": \"Header for request sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameSheetHeader\": \"Change Name\",\n  \"@changeNameSheetHeader\": {\n    \"description\": \"Header for change name sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingNameSheetHeader\": \"Changing\",\n  \"@changingNameSheetHeader\": {\n    \"description\": \"Header for name changing sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changedNameSheetHeader\": \"Changed\",\n  \"@changedNameSheetHeader\": {\n    \"description\": \"Header for name changed sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferSheetHeader\": \"Transfer\",\n  \"@transferSheetHeader\": {\n    \"description\": \"Header for transfer sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferringSheetHeader\": \"Transferring\",\n  \"@transferringSheetHeader\": {\n    \"description\": \"Header for transferring sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredSheetHeader\": \"Transferred\",\n  \"@transferredSheetHeader\": {\n    \"description\": \"Header for transferred sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleSheetHeader\": \"List For Sale\",\n  \"@listForSaleSheetHeader\": {\n    \"description\": \"Header for list for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listingForSaleSheetHeader\": \"Listing\",\n  \"@listingForSaleSheetHeader\": {\n    \"description\": \"Header for listing for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleSheetHeader\": \"Listed\",\n  \"@listedForSaleSheetHeader\": {\n    \"description\": \"Header for listed for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleSheetHeader\": \"Private Sale\",\n  \"@createPrivateSaleSheetHeader\": {\n    \"description\": \"Header for create private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"creatingPrivateSaleSheetHeader\": \"Creating\",\n  \"@creatingPrivateSaleSheetHeader\": {\n    \"description\": \"Header for creating private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createdPrivateSaleSheetHeader\": \"Created\",\n  \"@createdPrivateSaleSheetHeader\": {\n    \"description\": \"Header for created private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistingSheetHeader\": \"Delisting\",\n  \"@delistingSheetHeader\": {\n    \"description\": \"Header for delisting sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedSheetHeader\": \"Delisted\",\n  \"@delistedSheetHeader\": {\n    \"description\": \"Header for delisted sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addContactSheetHeader\": \"Add Contact\",\n  \"@addContactSheetHeader\": {\n    \"description\": \"Header for add contact sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactSheetHeader\": \"Contact\",\n  \"@contactSheetHeader\": {\n    \"description\": \"Header for contact details sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeySheetHeader\": \"Public Key\",\n  \"@publicKeySheetHeader\": {\n    \"description\": \"Header for public key sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateKeySheetHeader\": \"Private Key\",\n  \"@privateKeySheetHeader\": {\n    \"description\": \"Header for private key sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpSheetHeader\": \"Back Up\",\n  \"@backUpSheetHeader\": {\n    \"description\": \"Header for back up sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptSheetHeader\": \"Encrypt\",\n  \"@encryptSheetHeader\": {\n    \"description\": \"Header for encrypt sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonSheetHeader\": \"Change Daemon\",\n  \"@changeDaemonSheetHeader\": {\n    \"description\": \"Header for change daemon sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"securityFirstHeader\": \"Security First!\",\n  \"@securityFirstHeader\": {\n    \"description\": \"Header for security first screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPrivateKeyHeader\": \"New Private Key\",\n  \"@newPrivateKeyHeader\": {\n    \"description\": \"Header for new private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyHeader\": \"Import Private Key\",\n  \"@importPrivateKeyHeader\": {\n    \"description\": \"Header for import private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"decryptAndImportKeyHeader\": \"Decrypt & Import\",\n  \"@decryptAndImportKeyHeader\": {\n    \"description\": \"Header for decrypt & import private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpKeyHeader\": \"Back Up Your Key!\",\n  \"@backUpKeyHeader\": {\n    \"description\": \"Header for back up your key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockedHeader\": \"Locked\",\n  \"@lockedHeader\": {\n    \"description\": \"Header for locked screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateKeyTextFieldHeader\": \"Private Key\",\n  \"@privateKeyTextFieldHeader\": {\n    \"description\": \"Header for private key text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"passwordTextFieldHeader\": \"Password\",\n  \"@passwordTextFieldHeader\": {\n    \"description\": \"Header for password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPasswordTextFieldHeader\": \"New Password\",\n  \"@newPasswordTextFieldHeader\": {\n    \"description\": \"Header for new password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmPasswordTextFieldHeader\": \"Confirm Password\",\n  \"@confirmPasswordTextFieldHeader\": {\n    \"description\": \"Header for confirm password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmTextFieldHeader\": \"Confirm\",\n  \"@confirmTextFieldHeader\": {\n    \"description\": \"Header for confirm text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"countryCodeTextFieldHeader\": \"Country Code\",\n  \"@countryCodeTextFieldHeader\": {\n    \"description\": \"Header for country code text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"phoneNumberTextFieldHeader\": \"Phone Number\",\n  \"@phoneNumberTextFieldHeader\": {\n    \"description\": \"Header for phone number text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmationCodeTextFieldHeader\": \"Confirmation Code\",\n  \"@confirmationCodeTextFieldHeader\": {\n    \"description\": \"Header for confirmation code text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountTextFieldHeader\": \"Account\",\n  \"@accountTextFieldHeader\": {\n    \"description\": \"Header for account text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addressTextFieldHeader\": \"Address\",\n  \"@addressTextFieldHeader\": {\n    \"description\": \"Header for address text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactNameTextFieldHeader\": \"Contact Name\",\n  \"@contactNameTextFieldHeader\": {\n    \"description\": \"Header for contact name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"amountTextFieldHeader\": \"Amount\",\n  \"@amountTextFieldHeader\": {\n    \"description\": \"Header for amount text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"payloadTextFieldHeader\": \"Payload\",\n  \"@payloadTextFieldHeader\": {\n    \"description\": \"Header for payload text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameTextFieldHeader\": \"Name\",\n  \"@nameTextFieldHeader\": {\n    \"description\": \"Header for name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newAccountNameTextFieldHeader\": \"New Account Name\",\n  \"@newAccountNameTextFieldHeader\": {\n    \"description\": \"Header for new account name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeyTextFieldHeader\": \"Public Key\",\n  \"@publicKeyTextFieldHeader\": {\n    \"description\": \"Header for public key text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"priceTextFieldHeader\": \"Price\",\n  \"@priceTextFieldHeader\": {\n    \"description\": \"Header for price text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivingAccountTextFieldHeader\": \"Receiving Account\",\n  \"@receivingAccountTextFieldHeader\": {\n    \"description\": \"Header for receiving account text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"durationTextFieldHeader\": \"Duration\",\n  \"@durationTextFieldHeader\": {\n    \"description\": \"Header for duration text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeTextFieldHeader\": \"Fee\",\n  \"@feeTextFieldHeader\": {\n    \"description\": \"Header for fee text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"otherOperationsHeader\": \"Other Operations\",\n  \"@otherOperationsHeader\": {\n    \"description\": \"Header for other operations dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"warningHeader\": \"Warning\",\n  \"@warningHeader\": {\n    \"description\": \"Header for warning dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"areYouSureHeader\": \"Are You Sure?\",\n  \"@areYouSureHeader\": {\n    \"description\": \"Header for are you sure dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addFeeHeader\": \"Add Fee\",\n  \"@addFeeHeader\": {\n    \"description\": \"Header for add fee dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyTypeNotSupportedHeader\": \"Key Not Supported\",\n  \"@keyTypeNotSupportedHeader\": {\n    \"description\": \"Header for key not supported dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountToSendFromHeader\": \"Account to Send From\",\n  \"@accountToSendFromHeader\": {\n    \"description\": \"Header for account to send from dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentHeader\": \"Sent\",\n  \"@sentHeader\": {\n    \"description\": \"Header for sent type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivedHeader\": \"Received\",\n  \"@receivedHeader\": {\n    \"description\": \"Header for received type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameChangedHeader\": \"Name Changed\",\n  \"@nameChangedHeader\": {\n    \"description\": \"Header for listed for sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleHeader\": \"Listed For Sale\",\n  \"@listedForSaleHeader\": {\n    \"description\": \"Header for listed for sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateSaleHeader\": \"Private Sale\",\n  \"@privateSaleHeader\": {\n    \"description\": \"Header for private sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedFromSaleHeader\": \"Delisted From Sale\",\n  \"@delistedFromSaleHeader\": {\n    \"description\": \"Header for delisted from sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedHeader\": \"Delisted\",\n  \"@delistedHeader\": {\n    \"description\": \"Header for delisted type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"undefinedHeader\": \"Undefined\",\n  \"@undefinedHeader\": {\n    \"description\": \"Header for undefined type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredHeader\": \"Transferred\",\n  \"@transferredHeader\": {\n    \"description\": \"Header for transferred type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"connectingHeader\": \"Connecting\",\n  \"@connectingHeader\": {\n    \"description\": \"A header to let the user now that Blaise is currently connecting to (or loading) live chat.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"balanceHeader\": \"Balance\",\n  \"@balanceHeader\": {\n    \"description\": \"Header for balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"totalBalanceHeader\": \"Total Balance\",\n  \"@totalBalanceHeader\": {\n    \"description\": \"Header for total balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountBalanceHeader\": \"Account Balance\",\n  \"@accountBalanceHeader\": {\n    \"description\": \"Header for account balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountsHeader\": \"Accounts\",\n  \"@accountsHeader\": {\n    \"description\": \"Header for accounts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"operationsHeader\": \"Operations\",\n  \"@operationsHeader\": {\n    \"description\": \"Header for operations\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptThePayloadHeader\": \"Encrypt the Payload\",\n  \"@encryptThePayloadHeader\": {\n    \"description\": \"Header for encrypt the payload switch\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptPayloadHeader\": \"Encrypt Payload\",\n  \"@encryptPayloadHeader\": {\n    \"description\": \"Header for encrypt payload switch\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"forSaleHeader\": \"For Sale\",\n  \"@forSaleHeader\": {\n    \"description\": \"Header of for sale tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedHeader\": \"Borrowed\",\n  \"@borrowedHeader\": {\n    \"description\": \"Header for borrowed tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedTransferredHeader\": \"Transfer Pending\",\n  \"@borrowedTransferredHeader\": {\n    \"description\": \"Header for borrowed tag, after account is transferred but not confirmed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountHeader\": \"Borrowed Account\",\n  \"@borrowedAccountHeader\": {\n    \"description\": \"Header for borrowed account tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeColonHeader\": \"Fee:\",\n  \"@feeColonHeader\": {\n    \"description\": \"Header for fee amount\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"pendingHeader\": \"Pending\",\n  \"@pendingHeader\": {\n    \"description\": \"Header to indicate that an operation is pending\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"onHeader\": \"On\",\n  \"@onHeader\": {\n    \"description\": \"A header to indicate that something is on\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"offHeader\": \"Off\",\n  \"@offHeader\": {\n    \"description\": \"A header to indicate that something is off\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"priceRequiredError\": \"Price is required\",\n  \"@priceRequiredError\": {\n    \"description\": \"Error that tells the user that the price is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"amountRequiredError\": \"Amount is required\",\n  \"@amountRequiredError\": {\n    \"description\": \"Error that tells the user that the amount is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameRequiredError\": \"Name is required\",\n  \"@nameRequiredError\": {\n    \"description\": \"Error that tells the user that the name is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"zeroPriceError\": \"Price can't be 0\",\n  \"@zeroPriceError\": {\n    \"description\": \"Error that tells the user that the price cant be zero\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"zeroAmountError\": \"Amount can't be 0\",\n  \"@zeroAmountError\": {\n    \"description\": \"Error that tells the user that the amount cant be zero\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAccountNameError\": \"Invalid account name\",\n  \"@invalidAccountNameError\": {\n    \"description\": \"Error that tells the user that the account name is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidReceivingAccountError\": \"Invalid receiving account\",\n  \"@invalidReceivingAccountError\": {\n    \"description\": \"Error that tells the user that the receiving account is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPublicKeyError\": \"Invalid public key\",\n  \"@invalidPublicKeyError\": {\n    \"description\": \"Error that tells the user that the public key is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPrivateKeyError\": \"Invalid private key\",\n  \"@invalidPrivateKeyError\": {\n    \"description\": \"Error that tells the user that the private key is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAddressError\": \"Invalid address\",\n  \"@invalidAddressError\": {\n    \"description\": \"Error that tells the user that the address is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAccountError\": \"Invalid account\",\n  \"@invalidAccountError\": {\n    \"description\": \"Error that tells the user that the account is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidDestinationError\": \"Invalid destination\",\n  \"@invalidDestinationError\": {\n    \"description\": \"Error that tells the user that the destination is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"insufficientBalanceError\": \"Insufficient balance\",\n  \"@insufficientBalanceError\": {\n    \"description\": \"Error that tells the user that the balance is insufficient\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"threeCharacterNameError\": \"Must be at least 3 characters\",\n  \"@threeCharacterNameError\": {\n    \"description\": \"Error that tells the user that the account name cant be shorter than 3 characters\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactDoesntExistError\": \"Contact doesn't exist\",\n  \"@contactDoesntExistError\": {\n    \"description\": \"Error that tells the user that the contact doesnt exist\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactAlreadyExistsError\": \"Contact already exists\",\n  \"@contactAlreadyExistsError\": {\n    \"description\": \"Error that tells the user that the contact already exists\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"cantSendToYourselfError\": \"Can't send to yourself\",\n  \"@cantSendToYourselfError\": {\n    \"description\": \"Error that tells the user that you cant send to yourself\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"somethingWentWrongError\": \"Something went wrong, please try again later\",\n  \"@somethingWentWrongError\": {\n    \"description\": \"Error that tells the user that something went wrong\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToEncryptPayloadError\": \"Failed to encrypt the payload\",\n  \"@failedToEncryptPayloadError\": {\n    \"description\": \"Error that tells the user that payload encrypt is failed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"emptyPasswordError\": \"Password can't be empty\",\n  \"@emptyPasswordError\": {\n    \"description\": \"Error that tells the user that the password cant be empty\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noMatchPasswordError\": \"Passwords don't match\",\n  \"@noMatchPasswordError\": {\n    \"description\": \"Error that tells the user that the passwords dont match\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPasswordError\": \"Invalid password\",\n  \"@invalidPasswordError\": {\n    \"description\": \"Error that tells the user that the password is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"didNotGetResponseError\": \"Did not get a response from server\",\n  \"@didNotGetResponseError\": {\n    \"description\": \"Error that tells the user that there is no response from the server\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noContactsToExportError\": \"No contacts to export\",\n  \"@noContactsToExportError\": {\n    \"description\": \"Error that tells the user that there is no contacts to export\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noContactsToImportError\": \"No contacts to import\",\n  \"@noContactsToImportError\": {\n    \"description\": \"Error that tells the user that there is no contacts to import\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToImportContactsError\": \"Failed to import contacts\",\n  \"@failedToImportContactsError\": {\n    \"description\": \"Error that tells the user that there is no contacts to export\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"blockchainRewardOPDetails\": \"Blockchain Reward (%1)\",\n  \"@blockchainRewardOPDetails\": {\n    \"description\": \"Operation details header for blockchain reward\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transactionOPDetails\": \"Transaction (%1)\",\n  \"@transactionOPDetails\": {\n    \"description\": \"Operation details header for transaction\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeKeyOPDetails\": \"Change key (%1)\",\n  \"@changeKeyOPDetails\": {\n    \"description\": \"Operation details header for change key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"recoverFundsOPDetails\": \"Recover Funds (%1)\",\n  \"@recoverFundsOPDetails\": {\n    \"description\": \"Operation details header for recover funds\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listAccountForSaleOPDetails\": \"List Account for Sale (%1)\",\n  \"@listAccountForSaleOPDetails\": {\n    \"description\": \"Operation details header for list account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistAccountOPDetails\": \"Delist Account (%1)\",\n  \"@delistAccountOPDetails\": {\n    \"description\": \"Operation details header for delist account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAccountOPDetails\": \"Buy Account (%1)\",\n  \"@buyAccountOPDetails\": {\n    \"description\": \"Operation details header for buy account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeKeySignedOPDetails\": \"Change Key Signed (%1)\",\n  \"@changeKeySignedOPDetails\": {\n    \"description\": \"Operation details header for change key signed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeAccountInfoOPDetails\": \"Change Account Info (%1)\",\n  \"@changeAccountInfoOPDetails\": {\n    \"description\": \"Operation details header for change account info\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"multioperationOPDetails\": \"Multioperation (%1)\",\n  \"@multioperationOPDetails\": {\n    \"description\": \"Operation details header for multioperation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unknownOPDetails\": \"Unknown (%1)\",\n  \"@unknownOPDetails\": {\n    \"description\": \"Operation details header for unknown\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingAccountOPDetails\": \"Sending Account\",\n  \"@sendingAccountOPDetails\": {\n    \"description\": \"Operation details header for sending account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivingAccountOPDetails\": \"Receiving Account\",\n  \"@receivingAccountOPDetails\": {\n    \"description\": \"Operation details header for receiving account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingAccountOPDetails\": \"Changing Account\",\n  \"@changingAccountOPDetails\": {\n    \"description\": \"Operation details header for changing account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendAmountOPDetails\": \"Send Amount\",\n  \"@sendAmountOPDetails\": {\n    \"description\": \"Operation details header for send amount\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"payloadOPDetails\": \"Payload\",\n  \"@payloadOPDetails\": {\n    \"description\": \"Operation details header for payload\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPublicKeyOPDetails\": \"New Public Key\",\n  \"@newPublicKeyOPDetails\": {\n    \"description\": \"Operation details header for new public key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newNameOPDetails\": \"New Name\",\n  \"@newNameOPDetails\": {\n    \"description\": \"Operation details header for new name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sellerAccountOPDetails\": \"Seller Account\",\n  \"@sellerAccountOPDetails\": {\n    \"description\": \"Operation details header for seller account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountPriceOPDetails\": \"Account Price\",\n  \"@accountPriceOPDetails\": {\n    \"description\": \"Operation details header for account price\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockedUntilBlockOPDetails\": \"Locked Until Block\",\n  \"@lockedUntilBlockOPDetails\": {\n    \"description\": \"Operation details header for locked until block\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"blockOPDetails\": \"block\",\n  \"@blockOPDetails\": {\n    \"description\": \"Operation details header for block\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"optxtOPDetails\": \"optxt\",\n  \"@optxtOPDetails\": {\n    \"description\": \"Operation details header for optxt\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"timeOPDetails\": \"time\",\n  \"@timeOPDetails\": {\n    \"description\": \"Operation details header for time\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"naOPDetails\": \"N/A\",\n  \"@naOPDetails\": {\n    \"description\": \"Operation details header for N/A\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"ophashOPDetails\": \"ophash\",\n  \"@ophashOPDetails\": {\n    \"description\": \"Operation details header for ophash\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"optypeOPDetails\": \"optype\",\n  \"@optypeOPDetails\": {\n    \"description\": \"Operation details header for optype\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"maturationOPDetails\": \"maturation\",\n  \"@maturationOPDetails\": {\n    \"description\": \"Operation details header for maturation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nullOPDetails\": \"null\",\n  \"@nullOPDetails\": {\n    \"description\": \"Operation details header for null\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeOPDetails\": \"fee\",\n  \"@feeOPDetails\": {\n    \"description\": \"Operation details header for fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"opblockOPDetails\": \"opblock\",\n  \"@opblockOPDetails\": {\n    \"description\": \"Operation details header for opblock\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noperationOPDetails\": \"n_operation\",\n  \"@noperationOPDetails\": {\n    \"description\": \"Operation details header for n_operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountOPDetails\": \"account\",\n  \"@accountOPDetails\": {\n    \"description\": \"Operation details header for account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"signeraccountOPDetails\": \"signer_account\",\n  \"@signeraccountOPDetails\": {\n    \"description\": \"Operation details header for signer_account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  }\n}"
  },
  {
    "path": "lib/l10n/intl_es.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"Nueva clave privada\",\n  \"importPrivateKeyButton\": \"Importar clave privada\",\n  \"gotItButton\": \"¡De acuerdo!\",\n  \"goBackButton\": \"Volver\",\n  \"copyButton\": \"Copiar\",\n  \"copiedButton\": \"Copiado\",\n  \"keyCopiedButton\": \"Clave Copiada\",\n  \"iHaveBackedItUpButton\": \"Lo he respaldado\",\n  \"yesImSureButton\": \"Si, estoy seguro\",\n  \"noGoBackButton\": \"No, volver\",\n  \"getAnAccountButton\": \"Obtener una cuenta\",\n  \"getAFreeAccountButton\": \"Obtener una cuenta gratuita\",\n  \"buyAnAccountButton\": \"Comprar una cuenta\",\n  \"sendConfirmationButton\": \"Enviar confirmación\",\n  \"confirmButton\": \"Confirmar\",\n  \"borrowAnAccountButton\": \"Pedir prestada una cuenta\",\n  \"importButton\": \"Importar\",\n  \"receiveButton\": \"Recibir\",\n  \"sendButton\": \"Enviar\",\n  \"copyAddressButton\": \"Copiar dirección\",\n  \"copiedAddressButton\": \"Dirección copiada\",\n  \"addToContactsButton\": \"Agregar a contactos\",\n  \"operationDetailsButton\": \"Detalles de la operación\",\n  \"openInExplorerButton\": \"Abrir en el explorador\",\n  \"requestButton\": \"Solicitar\",\n  \"addAPayloadButton\": \"+ Agregar un Payload\",\n  \"addADurationButton\": \"+ Agregar una duración\",\n  \"scanQRCodeButton\": \"Escanear código QR\",\n  \"cancelButton\": \"Cancelar\",\n  \"closeButton\": \"Cerrar\",\n  \"changeNameButton\": \"Cambiar nombre\",\n  \"transferButton\": \"Transferir\",\n  \"listForSaleButton\": \"Publicar a la venta\",\n  \"createPrivateSaleButton\": \"Crear venta privada\",\n  \"yesAddFeeButton\": \"Si, agregar tarifa\",\n  \"unlockButton\": \"Desbloquear\",\n  \"unlockWithBiometricsButton\": \"Desbloquear con datos biométricos\",\n  \"unlockWithPINButton\": \"Desbloquear con PIN\",\n  \"setToDefaultButton\": \"Establecer predeterminado\",\n  \"changeDaemonButton\": \"Cambiar Daemon\",\n  \"addContactButton\": \"Agregar contacto\",\n  \"encryptedKeyButton\": \"Clave encriptada\",\n  \"unencryptedKeyButton\": \"Clave no encriptada\",\n  \"encryptButton\": \"Encriptar\",\n  \"showButton\": \"Mostrar\",\n  \"hideButton\": \"Ocultar\",\n  \"copyEncryptedKeyButton\": \"Copiar clave encriptada\",\n  \"copyUnencryptedKeyButton\": \"Copiar clave no encriptada\",\n  \"copyKeyButton\": \"Copiar clave\",\n  \"copyPublicKeyButton\": \"Copiar clave pública\",\n  \"deletePrivateKeyAndLogoutButton\": \"Borrar clave privada\\ny cerrar sesión\",\n  \"searchForNameButton\": \"Buscar por nombre\",\n  \"searchAccountNameButton\": \"Buscar por nombre de cuenta\",\n  \"searchNameButton\": \"Buscar nombre\",\n  \"okayGoBackButton\": \"Ok, volver\",\n  \"nextButton\": \"Siguiente\",\n  \"welcomeParagraph\": \"Bienvenido a Blaise Wallet. Para empezar, puede crear una nueva clave privada o importar una.\",\n  \"newKeySecurityParagraph\": \"En la siguiente pantalla, verá su nueva clave privada. Es una contraseña para acceder a sus fondos. Es crucial que la respalde y nunca la comparta con nadie.\",\n  \"uninstallDisclaimerParagraph\": \"Si pierde su dispositivo o desinstala Blaise Wallet, necesitará su clave privada para recuperar sus fondos.\",\n  \"newPrivateKeyParagraph\": \"A continuación se muestra la clave privada de su nueva billetera. Es crucial que haga una copia de seguridad de su clave privada y nunca la almacene como texto plano o como una captura de pantalla. Recomendamos escribirla en una hoja de papel y almacenarla sin conexión.\",\n  \"newKeyBackUpConfirmParagraph\": \"¿Estás seguro de que has respaldado la clave privada de tu nueva billetera?\",\n  \"newWalletGreetingParagraph\": \"Bienvenido a <colored>Blaise Wallet</colored>.\\nPuede comenzar obteniendo una cuenta.\",\n  \"getAccountFirstParagraph\": \"Existen dos opciones para obtener su primera cuenta:\",\n  \"getAccountSecondParagraph\": \"1- Puede obtener una cuenta gratuita usando su número telefónico.\\n<colored>Se permite una sola cuenta por número telefónico.</colored>\",\n  \"getAccountThirdParagraph\": \"2- Puede comprar tantas cuentas como quiera por <colored>%1 Pascal (%2).</colored>\",\n  \"enterPhoneNumberParagraph\": \"Ingrese su número telefónico a continuación.\",\n  \"enterConfirmationCodeParagraph\": \"Hemos enviado un código de confirmación, por favor ingréselo a continuación.\",\n  \"borrowStarted\": \"Compra iniciada por %1\",\n  \"borrowAccountParagraph\": \"Para comprar una cuenta, primero deberá pedir prestada una de forma gratuita. Si envía al menos <colored>%1 Pascal (%2)</colored> a la cuenta dentro de <colored>%3 días</colored>, la cuenta será suya y <colored>%1 Pascal</colored> se deducirá de su saldo automáticamente. \\nDe lo contrario, volverá a nosotros al final de <colored>%3 días</colored> y ya no pertenecerá a su billetera.\\nSe recomienda solo enviar una pequeña cantidad de monedas hasta que posea la cuenta.\",\n  \"importPrivateKeyParagraph\": \"Ingrese su clave privada a continuación.\",\n  \"looksLikeEncryptedKeyParagraph\": \"Esta parece una clave privada encriptada, ingrese la contraseña para descifrarla e importarla.\",\n  \"changeDaemonParagraph\": \"Ingrese una dirección para usar un daemon Pascal diferente para solicitudes RPC.\",\n  \"urlChangedToParagraph\": \"URL cambiada a %1\",\n  \"backupKeyFirstParagraph\": \"Tiene dos opciones para respaldar su clave privada:\",\n  \"backupKeySecondParagraph\": \"1- Encriptada, significa que está protegida por una contraseña.\",\n  \"backupKeyThirdParagraph\": \"2- Sin encriptar, lo que significa que se encuentra sin formato y no está protegida por una contraseña.\",\n  \"backupKeyFourthParagraph\": \"Recomendamos almacenar la versión sin encriptar sin conexión, escribiéndola en una hoja de papel. Puede almacenar la versión encriptada en un administrador de contraseñas para su conveniencia.\",\n  \"encryptKeyParagraph\": \"Crear una nueva contraseña para encriptar su clave privada.\",\n  \"backupEncryptedKeyFirstParagraph\": \"A continuación se muestra su clave privada encriptada. Está protegida por una contraseña. Puede almacenarla de forma segura en un administrador de contraseñas para su conveniencia.\",\n  \"backupEncryptedKeySecondParagraph\": \"Como está encriptada con su contraseña, si la pierde o la olvida, no podrá descifrarla ni acceder a sus fondos.\",\n  \"backupUnencryptedKeyParagraph\": \"A continuación se muestra su clave privada sin encriptar. <colored>No está protegida por una contraseña, lo que significa que es crucial que la guarde en un lugar seguro y sin conexión.</colored> Recomendamos escribirla en una hoja de papel.\",\n  \"publicKeyParagraph\": \"A continuación se muestra su clave pública. Como su nombre lo indica, está destinada a ser compartida públicamente y probar que una operación particular pertenece a su clave privada.\",\n  \"borrowedAccountParagraph\": \"Esta es una <colored>cuenta prestada </colored>.\\nSi le envía al menos <colored>%1 Pascal</colored> en los próximos <colored>%2 días,%3 horas y %4 minutos</colored>, será suya.\",\n  \"borrowedAccountPaidParagraph\": \"<colored>¡Su cuenta ha sido comprada!</colored>\\nLa transferencia se está procesando actualmente. Este proceso generalmente toma unos <colored>15 minutos</colored>, en algunos casos puede tardar un poco más.\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored>Cerrar sesión eliminará su clave privada y todos los datos relacionados con Blaise de este dispositivo.</colored> Si no se realiza una copia de seguridad de su clave privada, nunca podrá volver a acceder a sus fondos. Si su clave privada está respaldada, no tiene nada de qué preocuparse.\",\n  \"logoutSecondDisclaimerParagraph\": \"¿Está seguro de que ha hecho una copia de seguridad de su clave privada? <colored>Mientras haya hecho una copia de seguridad de su clave privada, no tiene nada de qué preocuparse.</colored>\",\n  \"sendingConfirmParagraph\": \"Confirme los detalles de la transacción para enviar.\",\n  \"sentParagraph\": \"La transacción ha sido enviada con éxito.\",\n  \"changeNameParagraph\": \"Ingrese un nombre a continuación para modificar el nombre de su cuenta.\",\n  \"changingNameParagraph\": \"Confirme su nuevo nombre de cuenta para continuar.\",\n  \"changedNameParagraph\": \"Su nombre de cuenta ha sido modificado exitosamente.\",\n  \"transferParagraph\": \"Ingrese una clave pública a continuación para transferirle la propiedad de esta cuenta.\",\n  \"transferringParagraph\": \"Confirme la clave pública a continuación para transferirle la propiedad de esta cuenta.\",\n  \"transferredParagraph\": \"Su cuenta ha sido transferida exitosamente a la clave pública que se muestra a continuación.\",\n  \"listForSaleParagraph\": \"Ingrese un precio y una cuenta que recibirá el pago para publicar a la venta esta cuenta.\",\n  \"listingForSaleParagraph\": \"Confirme el precio y la cuenta que recibirá el pago.\",\n  \"listedForSaleParagraph\": \"Su cuenta ha sido exitosamente publicada a la venta. Le avisaremos si alguien la compra.\",\n  \"createPrivateSaleParagraph\": \"Ingrese un precio, una cuenta receptora y una clave pública a continuación para crear una venta privada para esta cuenta.\",\n  \"creatingPrivateSaleParagraph\": \"Confirme la información a continuación.\",\n  \"createdPrivateSaleParagraph\": \"La venta privada se ha creado con éxito. Le haremos saber si se compra.\",\n  \"delistFromSaleParagraph\": \"Confirme que desea retirar de la venta esta cuenta.\",\n  \"delistedFromSaleParagraph\": \"Su cuenta ha sido retirada de la venta con éxito.\",\n  \"feeRequiredParagraph\": \"Está operación requiere una tarifa\",\n  \"feeConfirmAmountParagraph\": \"Confirme la adición de una comisión de %1 Pascal en operación para continuar.\",\n  \"keyTypeNotSupportedParagraph\": \"Blaise aún no admite este tipo de clave privada. Puede crear una nueva clave privada y transferir sus cuentas a esta utilizando una billetera diferente.\",\n  \"enterPINToUnlockParagraph\": \"Introduzca el PIN para desbloquear Blaise\",\n  \"authenticateToUnlockParagraph\": \"Autenticar para desbloquear a Blaise\",\n  \"manyFailedAttemptsParagraph\": \"Demasiados intentos de desbloqueo fallidos\",\n  \"authenticateToChangeNameParagraph\": \"Autenticar para cambiar el nombre de la cuenta por \\\"%1\\\"\",\n  \"authenticateToDelistParagraph\": \"Autenticar para quitar la cuenta de la venta\",\n  \"authenticateToListForSaleParagraph\": \"Autenticar para agregar la cuenta a la venta\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"Autenticar para crear una venta privada\",\n  \"authenticateToTransferParagraph\": \"Autenticar para transferir cuenta\",\n  \"authenticateToSendParagraph\": \"Autenticar para enviar %1 Pascal\",\n  \"authenticateToBackUpParagraph\": \"Autenticar para hacer una copia de seguridad de la clave privada\",\n  \"invalidPINParagraph\": \"PIN inválido\",\n  \"noMatchPINParagraph\": \"Los PIN no coinciden\",\n  \"confirmPINParagraph\": \"Confirme su PIN\",\n  \"enterPINParagraph\": \"Introduzca PIN\",\n  \"createPINParagraph\": \"Crear un PIN de 6 dígitos\",\n  \"addedToContactsParagraph\": \"%1 agregado a contactos\",\n  \"removedFromContactsParagraph\": \"%1 removido de contactos\",\n  \"failedToRemoveFromContactsParagraph\": \"Error al remover %1 de contactos\",\n  \"successfullyImportedContactsParagraph\": \"Exitosamente importados %1 contactos\",\n  \"checkOutBlaiseParagraph\": \"¡Vea Blaise! Cartera Pascal simple, elegante y segura para iOS y Android: https://blaisewallet.com\",\n  \"newAccountParagraph\": \"Esta es su nueva cuenta.\\nUna vez que reciba <colored>Pascal</colored>, las operaciones se mostrarán como a continuación.\",\n  \"settingsHeader\": \"Configuración\",\n  \"preferencesHeader\": \"Preferencias\",\n  \"currencyHeader\": \"Moneda\",\n  \"languageHeader\": \"Idioma\",\n  \"languageColonHeader\": \"Idioma:\",\n  \"systemDefaultHeader\": \"Sistema por defecto\",\n  \"themeHeader\": \"Tema\",\n  \"themeLightHeader\": \"Claro\",\n  \"themeDarkHeader\": \"Oscuro\",\n  \"themeCopperHeader\": \"Cobre\",\n  \"notificationsHeader\": \"Notificaciones\",\n  \"securityHeader\": \"Seguridad\",\n  \"authenticationMethodHeader\": \"Método de autenticación\",\n  \"authenticationPINHeader\": \"PIN\",\n  \"authenticationBiometricsHeader\": \"Datos biométricos\",\n  \"authenticateOnLaunchHeader\": \"Autenticar al iniciar\",\n  \"yesHeader\": \"Si\",\n  \"noHeader\": \"No\",\n  \"automaticallyLockHeader\": \"Bloqueo automático\",\n  \"lockInstantHeader\": \"Instantáneamente\",\n  \"lock1Header\": \"Después de %1 minuto\",\n  \"lock5Header\": \"Después de %1 minutos\",\n  \"lock15Header\": \"Después de %1 minutos\",\n  \"lock30Header\": \"Después de %1 minutos\",\n  \"lock60Header\": \"Después de %1 minutos\",\n  \"daemonHeader\": \"Daemon\",\n  \"defaultHeader\": \"Por defecto\",\n  \"manageHeader\": \"Gestionar\",\n  \"contactsHeader\": \"Contactos\",\n  \"backUpPrivateKeyHeader\": \"Respaldar clave privada\",\n  \"viewPublicKeyHeader\": \"Ver clave pública\",\n  \"shareHeader\": \"Compartir Blaise\",\n  \"logoutHeader\": \"Cerrar sesión\",\n  \"privacyPolicyHeader\": \"Política de privacidad\",\n  \"changeAccountNameHeader\": \"Cambiar nombre de cuenta\",\n  \"transferAccountHeader\": \"Transferir cuenta\",\n  \"listAccountForSaleHeader\": \"Publicar cuenta a la venta\",\n  \"createPrivateSaleHeader\": \"Crear venta privada\",\n  \"delistFromSaleHeader\": \"Quitar de listado de venta\",\n  \"getAccountSheetHeader\": \"Obtener cuenta\",\n  \"freeAccountSheetHeader\": \"Cuenta gratuita\",\n  \"buyAccountSheetHeader\": \"Comprar cuenta\",\n  \"sendSheetHeader\": \"Enviar\",\n  \"sendingSheetHeader\": \"Enviando\",\n  \"sentSheetHeader\": \"Enviado\",\n  \"requestSheetHeader\": \"Solicitar\",\n  \"changeNameSheetHeader\": \"Cambiar nombre\",\n  \"changingNameSheetHeader\": \"Cambiando\",\n  \"changedNameSheetHeader\": \"Cambiado\",\n  \"transferSheetHeader\": \"Transferir\",\n  \"transferringSheetHeader\": \"Transfiriendo\",\n  \"transferredSheetHeader\": \"Transferido\",\n  \"listForSaleSheetHeader\": \"Publicar a la venta\",\n  \"listingForSaleSheetHeader\": \"Publicando\",\n  \"listedForSaleSheetHeader\": \"Publicada\",\n  \"createPrivateSaleSheetHeader\": \"Venta privada\",\n  \"creatingPrivateSaleSheetHeader\": \"Creando\",\n  \"createdPrivateSaleSheetHeader\": \"Creada\",\n  \"delistingSheetHeader\": \"Quietar de la venta\",\n  \"delistedSheetHeader\": \"Removida de la venta\",\n  \"addContactSheetHeader\": \"Agregar contacto\",\n  \"contactSheetHeader\": \"Contacto\",\n  \"publicKeySheetHeader\": \"Clave pública\",\n  \"privateKeySheetHeader\": \"Clave privada\",\n  \"backUpSheetHeader\": \"Respaldo\",\n  \"encryptSheetHeader\": \"Encriptar\",\n  \"changeDaemonSheetHeader\": \"Cambiar daemon\",\n  \"securityFirstHeader\": \"¡La seguridad primero!\",\n  \"newPrivateKeyHeader\": \"Nueva clave privada\",\n  \"importPrivateKeyHeader\": \"Importar clave privada\",\n  \"decryptAndImportKeyHeader\": \"Descifrar e importar\",\n  \"backUpKeyHeader\": \"¡Resguarde su clave!\",\n  \"lockedHeader\": \"Bloqueada\",\n  \"privateKeyTextFieldHeader\": \"Clave privada\",\n  \"passwordTextFieldHeader\": \"Contraseña\",\n  \"newPasswordTextFieldHeader\": \"Nueva contraseña\",\n  \"confirmPasswordTextFieldHeader\": \"Confirmar contraseña\",\n  \"confirmTextFieldHeader\": \"Confirmar\",\n  \"countryCodeTextFieldHeader\": \"Código de país\",\n  \"phoneNumberTextFieldHeader\": \"Número telefónico\",\n  \"confirmationCodeTextFieldHeader\": \"Código de confirmación\",\n  \"accountTextFieldHeader\": \"Cuenta\",\n  \"addressTextFieldHeader\": \"Dirección\",\n  \"contactNameTextFieldHeader\": \"Nombre de contacto\",\n  \"amountTextFieldHeader\": \"Monto\",\n  \"payloadTextFieldHeader\": \"Payload\",\n  \"nameTextFieldHeader\": \"Nombre\",\n  \"newAccountNameTextFieldHeader\": \"Nuevo nombre de cuenta\",\n  \"publicKeyTextFieldHeader\": \"Clave pública\",\n  \"priceTextFieldHeader\": \"Precio\",\n  \"receivingAccountTextFieldHeader\": \"Cuenta receptora\",\n  \"durationTextFieldHeader\": \"Duración\",\n  \"feeTextFieldHeader\": \"Tarifa\",\n  \"otherOperationsHeader\": \"Otras operaciones\",\n  \"warningHeader\": \"Advertencia\",\n  \"areYouSureHeader\": \"¿Está seguro?\",\n  \"addFeeHeader\": \"Agregar tarifa\",\n  \"keyTypeNotSupportedHeader\": \"Clave no soportada\",\n  \"accountToSendFromHeader\": \"Cuenta desde la cual enviar\",\n  \"sentHeader\": \"Enviado\",\n  \"receivedHeader\": \"Recibido\",\n  \"nameChangedHeader\": \"Nombre modificado\",\n  \"listedForSaleHeader\": \"Publicada a la venta\",\n  \"privateSaleHeader\": \"Venta privada\",\n  \"delistedFromSaleHeader\": \"Retirada de la venta\",\n  \"delistedHeader\": \"Retirada de llistado\",\n  \"undefinedHeader\": \"Indefinida\",\n  \"transferredHeader\": \"Transferido\",\n  \"balanceHeader\": \"Balance\",\n  \"totalBalanceHeader\": \"Balance total\",\n  \"accountBalanceHeader\": \"Balance de cuenta\",\n  \"accountsHeader\": \"Cuentas\",\n  \"operationsHeader\": \"Operaciones\",\n  \"encryptThePayloadHeader\": \"Encriptar el Payload\",\n  \"encryptPayloadHeader\": \"Encriptar Payload\",\n  \"forSaleHeader\": \"A la venta\",\n  \"borrowedHeader\": \"Prestada\",\n  \"borrowedTransferredHeader\": \"Transferencia pendiente\",\n  \"borrowedAccountHeader\": \"Cuenta prestada\",\n  \"feeColonHeader\": \"Tarifa:\",\n  \"pendingHeader\": \"Pendiente\",\n  \"onHeader\": \"Encendido\",\n  \"offHeader\": \"Apagado\",\n  \"priceRequiredError\": \"El precio es obligatorio\",\n  \"amountRequiredError\": \"El monto es obligatorio\",\n  \"nameRequiredError\": \"El nombre es obligatorio\",\n  \"zeroPriceError\": \"El precio no puede ser 0\",\n  \"zeroAmountError\": \"El monto no puede ser 0\",\n  \"invalidAccountNameError\": \"Nombre de cuenta inválido\",\n  \"invalidReceivingAccountError\": \"Cuenta de recepción inválida\",\n  \"invalidPublicKeyError\": \"Clave pública inválida\",\n  \"invalidPrivateKeyError\": \"Clave privada inválida\",\n  \"invalidAddressError\": \"Dirección inválida\",\n  \"invalidAccountError\": \"Cuenta inválida\",\n  \"invalidDestinationError\": \"Destino inválido\",\n  \"insufficientBalanceError\": \"Balance insuficiente\",\n  \"threeCharacterNameError\": \"Debe tener al menos 3 caracteres\",\n  \"contactDoesntExistError\": \"El contacto no existe\",\n  \"contactAlreadyExistsError\": \"El contacto ya existe\",\n  \"cantSendToYourselfError\": \"No puede enviar a usted mismo\",\n  \"somethingWentWrongError\": \"Algo anduvo mal, por favor intente más tarde\",\n  \"failedToEncryptPayloadError\": \"Error al encriptar el payload\",\n  \"emptyPasswordError\": \"La contraseña no puede estar vacía\",\n  \"noMatchPasswordError\": \"Contraseñan no coinciden\",\n  \"invalidPasswordError\": \"Contraseña inválida\",\n  \"didNotGetResponseError\": \"No se recibe respuesta del servidor\",\n  \"noContactsToExportError\": \"No hay contactos para exportar\",\n  \"noContactsToImportError\": \"No hay contactos para importar\",\n  \"failedToImportContactsError\": \"Error al importar contactos\",\n  \"blockchainRewardOPDetails\": \"Recompensa Blockchain (%1)\",\n  \"transactionOPDetails\": \"Transacción (%1)\",\n  \"changeKeyOPDetails\": \"Cambiar clave (%1)\",\n  \"recoverFundsOPDetails\": \"Recuperar fondos (%1)\",\n  \"listAccountForSaleOPDetails\": \"Publicar cuenta a la venta (%1)\",\n  \"delistAccountOPDetails\": \"Quitar cuenta de la venta (%1)\",\n  \"buyAccountOPDetails\": \"Comprar cuenta (%1)\",\n  \"changeKeySignedOPDetails\": \"Cambiar clave firmada (%1)\",\n  \"changeAccountInfoOPDetails\": \"Cambiar información de la cuenta (%1)\",\n  \"multioperationOPDetails\": \"Multioperación (%1)\",\n  \"unknownOPDetails\": \"Desconocido (%1)\",\n  \"sendingAccountOPDetails\": \"Cuenta de envío\",\n  \"receivingAccountOPDetails\": \"Cuenta receptora\",\n  \"changingAccountOPDetails\": \"Cambio de cuenta\",\n  \"sendAmountOPDetails\": \"Cantidad a enviar\",\n  \"payloadOPDetails\": \"Payload\",\n  \"newPublicKeyOPDetails\": \"Nueva clave pública\",\n  \"newNameOPDetails\": \"Nuevo nombre\",\n  \"sellerAccountOPDetails\": \"Cuenta vendedora\",\n  \"accountPriceOPDetails\": \"Precio de la cuenta\",\n  \"lockedUntilBlockOPDetails\": \"Bloqueado hasta el bloque\",\n  \"blockOPDetails\": \"bloque\",\n  \"optxtOPDetails\": \"optxt\",\n  \"timeOPDetails\": \"Fecha\",\n  \"naOPDetails\": \"N/A\",\n  \"ophashOPDetails\": \"ophash\",\n  \"optypeOPDetails\": \"optype\",\n  \"maturationOPDetails\": \"maduración\",\n  \"nullOPDetails\": \"null\",\n  \"feeOPDetails\": \"tarifa\",\n  \"opblockOPDetails\": \"opblock\",\n  \"noperationOPDetails\": \"n_operation\",\n  \"accountOPDetails\": \"cuenta\",\n  \"signeraccountOPDetails\": \"signer_account\",\n  \"noResultsFound\": \"No se han encontrado resultados\",\n  \"getAccountThirdParagraphAlternative\": \"2- Puede comprar una cuenta por <colored>%1 Pascal (%2).</colored><colored> Se permite comprar solo 1 cuenta por usuario.</colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"2- Puede comprar una cuenta por <colored>%1 Pascal (%2).</colored><colored> Puede comprar hasta %3 cuentas.</colored>\",\n  \"receiveAccountButton\": \"Recibir cuenta\",\n  \"receiveAnAccountButton\": \"Recibir una cuenta\"\n}"
  },
  {
    "path": "lib/l10n/intl_messages.arb",
    "content": "{\n  \"@@last_modified\": \"2019-10-25T14:47:22.704586\",\n  \"newPrivateKeyButton\": \"New Private Key\",\n  \"@newPrivateKeyButton\": {\n    \"description\": \"A button that creates a new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyButton\": \"Import Private Key\",\n  \"@importPrivateKeyButton\": {\n    \"description\": \"A button that imports a private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"gotItButton\": \"Got It!\",\n  \"@gotItButton\": {\n    \"description\": \"A button that implies a message is understood\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"goBackButton\": \"Go Back\",\n  \"@goBackButton\": {\n    \"description\": \"A button to go back to previous screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyButton\": \"Copy\",\n  \"@copyButton\": {\n    \"description\": \"A button to copy something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copiedButton\": \"Copied\",\n  \"@copiedButton\": {\n    \"description\": \"A button to inform the user that something has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyCopiedButton\": \"Key Copied\",\n  \"@keyCopiedButton\": {\n    \"description\": \"A button to inform the user that the key has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"iHaveBackedItUpButton\": \"I've Backed It Up\",\n  \"@iHaveBackedItUpButton\": {\n    \"description\": \"A button to confirm that something is backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesImSureButton\": \"Yes, I'm Sure\",\n  \"@yesImSureButton\": {\n    \"description\": \"A button to confirm if the user is sure\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noGoBackButton\": \"No, Go Back\",\n  \"@noGoBackButton\": {\n    \"description\": \"A button to go back to previous screen if the user didnt do what the question asks\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAnAccountButton\": \"Get an Account\",\n  \"@getAnAccountButton\": {\n    \"description\": \"A button to start the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAFreeAccountButton\": \"Get a Free Account\",\n  \"@getAFreeAccountButton\": {\n    \"description\": \"A button to start the process of getting a free account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAnAccountButton\": \"Buy an Account\",\n  \"@buyAnAccountButton\": {\n    \"description\": \"A button to start the process of buying an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendConfirmationButton\": \"Send Confirmation\",\n  \"@sendConfirmationButton\": {\n    \"description\": \"A button to request a confirmation to be sent\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmButton\": \"Confirm\",\n  \"@confirmButton\": {\n    \"description\": \"A button to confirm that a process should be executed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowAnAccountButton\": \"Borrow An Account\",\n  \"@borrowAnAccountButton\": {\n    \"description\": \"A button to borrow an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importButton\": \"Import\",\n  \"@importButton\": {\n    \"description\": \"A button to import something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveButton\": \"Receive\",\n  \"@receiveButton\": {\n    \"description\": \"A button to receive Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendButton\": \"Send\",\n  \"@sendButton\": {\n    \"description\": \"A button to send Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyAddressButton\": \"Copy Address\",\n  \"@copyAddressButton\": {\n    \"description\": \"A button to copy an address\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copiedAddressButton\": \"Address Copied\",\n  \"@copiedAddressButton\": {\n    \"description\": \"A button to inform the user that the address has been copied\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addToContactsButton\": \"Add to Contacts\",\n  \"@addToContactsButton\": {\n    \"description\": \"A button to add an account to contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"operationDetailsButton\": \"Operation Details\",\n  \"@operationDetailsButton\": {\n    \"description\": \"A button to view the details of an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"openInExplorerButton\": \"Open in Explorer\",\n  \"@openInExplorerButton\": {\n    \"description\": \"A button to view the details of an operation on the Pascal explorer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"requestButton\": \"Request\",\n  \"@requestButton\": {\n    \"description\": \"A button to request something\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addAPayloadButton\": \"+ Add a Payload\",\n  \"@addAPayloadButton\": {\n    \"description\": \"A button to add a payload (note) to an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addADurationButton\": \"+ Add a Duration\",\n  \"@addADurationButton\": {\n    \"description\": \"A button to add a duration to the sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"scanQRCodeButton\": \"Scan QR Code\",\n  \"@scanQRCodeButton\": {\n    \"description\": \"A button to scan a QR Code\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"cancelButton\": \"Cancel\",\n  \"@cancelButton\": {\n    \"description\": \"A button to cancel a process\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"closeButton\": \"Close\",\n  \"@closeButton\": {\n    \"description\": \"A button to close a screen or a pop-up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameButton\": \"Change Name\",\n  \"@changeNameButton\": {\n    \"description\": \"A button to change the name of an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferButton\": \"Transfer\",\n  \"@transferButton\": {\n    \"description\": \"A button to transfer the ownership of an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleButton\": \"List for Sale\",\n  \"@listForSaleButton\": {\n    \"description\": \"A button to list an account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleButton\": \"Create Private Sale\",\n  \"@createPrivateSaleButton\": {\n    \"description\": \"A button to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesAddFeeButton\": \"Yes, Add Fee\",\n  \"@yesAddFeeButton\": {\n    \"description\": \"A button to confirm the addition of a fee to an operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockButton\": \"Unlock\",\n  \"@unlockButton\": {\n    \"description\": \"A button to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockWithBiometricsButton\": \"Unlock with Biometrics\",\n  \"@unlockWithBiometricsButton\": {\n    \"description\": \"A button to unlock the wallet using biometrics\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unlockWithPINButton\": \"Unlock with PIN\",\n  \"@unlockWithPINButton\": {\n    \"description\": \"A button to unlock the wallet using PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"setToDefaultButton\": \"Set to Default\",\n  \"@setToDefaultButton\": {\n    \"description\": \"A button to set something to its default\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonButton\": \"Change Daemon\",\n  \"@changeDaemonButton\": {\n    \"description\": \"A button to change the Pascal daemon for RPC requests\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addContactButton\": \"Add Contact\",\n  \"@addContactButton\": {\n    \"description\": \"A button to add a contact\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptedKeyButton\": \"Encrypted Key\",\n  \"@encryptedKeyButton\": {\n    \"description\": \"A button to view the encrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unencryptedKeyButton\": \"Unencrypted Key\",\n  \"@unencryptedKeyButton\": {\n    \"description\": \"A button to view the unencrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptButton\": \"Encrypt\",\n  \"@encryptButton\": {\n    \"description\": \"A button to encrypt the private key with a password\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"showButton\": \"Show\",\n  \"@showButton\": {\n    \"description\": \"A button to show something that is hidden\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"hideButton\": \"Hide\",\n  \"@hideButton\": {\n    \"description\": \"A button to hide something that is shown\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyEncryptedKeyButton\": \"Copy Encrypted Key\",\n  \"@copyEncryptedKeyButton\": {\n    \"description\": \"A button to copy an encrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyUnencryptedKeyButton\": \"Copy Unencrypted Key\",\n  \"@copyUnencryptedKeyButton\": {\n    \"description\": \"A button to copy an unencrypted key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyKeyButton\": \"Copy Key\",\n  \"@copyKeyButton\": {\n    \"description\": \"A button to copy a key (private or public key)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"copyPublicKeyButton\": \"Copy Public Key\",\n  \"@copyPublicKeyButton\": {\n    \"description\": \"A button to copy a public key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"deletePrivateKeyAndLogoutButton\": \"Delete Private Key\\nAnd Logout\",\n  \"@deletePrivateKeyAndLogoutButton\": {\n    \"description\": \"A button to delete the private key and logout\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchForNameButton\": \"Search For Name\",\n  \"@searchForNameButton\": {\n    \"description\": \"A button to search for an account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchAccountNameButton\": \"Search Account Name\",\n  \"@searchAccountNameButton\": {\n    \"description\": \"A button to search an account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"searchNameButton\": \"Search Name\",\n  \"@searchNameButton\": {\n    \"description\": \"A button to search name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"okayGoBackButton\": \"Okay, Go Back\",\n  \"@okayGoBackButton\": {\n    \"description\": \"A button to confirm and go back\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"okayButton\": \"Okay\",\n  \"@okayButton\": {\n    \"description\": \"A button that simply indicates a neutral action, like closing an informative dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nextButton\": \"Next\",\n  \"@nextButton\": {\n    \"description\": \"A button to the next screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveAccountButton\": \"Receive Account\",\n  \"@receiveAccountButton\": {\n    \"description\": \"A button to open up the public key sheet(screen) that displays a QR code to receive an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receiveAnAccountButton\": \"Receive an Account\",\n  \"@receiveAnAccountButton\": {\n    \"description\": \"A button to open up the public key sheet(screen) that displays a QR code to receive an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"supportButton\": \"Support\",\n  \"@supportButton\": {\n    \"description\": \"A button to open up the live support window\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"liveSupportButton\": \"Support\",\n  \"@liveSupportButton\": {\n    \"description\": \"A button to open up the live support window\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"welcomeParagraph\": \"Welcome to Blaise Wallet. To begin, you can create a new private key or import one.\",\n  \"@welcomeParagraph\": {\n    \"description\": \"A paragraph that greets the user in the initial opening\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newKeySecurityParagraph\": \"In the next screen, you'll see your new private key. It is a password to access your funds. It is crucial that you back it up and never share it with anyone.\",\n  \"@newKeySecurityParagraph\": {\n    \"description\": \"A paragraph that explains what users should do with their new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"uninstallDisclaimerParagraph\": \"If you lose your device or uninstall Blaise Wallet, you'll need your private key to recover your funds.\",\n  \"@uninstallDisclaimerParagraph\": {\n    \"description\": \"A paragraph that gives a security disclaimer about what happens if the wallet is uninstalled\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPrivateKeyParagraph\": \"Below is your new wallet’s private key. It is crucial that you backup your private key and never store it as plaintext or a screenshot. We recommend writing it on a piece of paper and storing it offline.\",\n  \"@newPrivateKeyParagraph\": {\n    \"description\": \"A paragraph that explains what users should do with their new private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newKeyBackUpConfirmParagraph\": \"Are you sure that you have backed up your new wallet’s private key?\",\n  \"@newKeyBackUpConfirmParagraph\": {\n    \"description\": \"A paragraph to confirm if the new private key is backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newWalletGreetingParagraph\": \"Welcome to <colored>Blaise Wallet</colored>.\\nYou can start by getting an account.\",\n  \"@newWalletGreetingParagraph\": {\n    \"description\": \"A paragraph to greet the user when a new wallet is created\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountFirstParagraph\": \"There are 2 options for getting your first account:\",\n  \"@getAccountFirstParagraph\": {\n    \"description\": \"The first paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountSecondParagraph\": \"1- You can get a free account using your phone number. <colored>Only 1 account per phone number is allowed.</colored>\",\n  \"@getAccountSecondParagraph\": {\n    \"description\": \"The second paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraph\": \"2- You can buy as many accounts as you want for <colored>%1 Pascal (%2).</colored>\",\n  \"@getAccountThirdParagraph\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraphAlternative\": \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> Buying only 1 account is allowed per user.</colored>\",\n  \"@getAccountThirdParagraphAlternative\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountThirdParagraphAlternative2\": \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> You can buy up to %3 accounts.</colored>\",\n  \"@getAccountThirdParagraphAlternative2\": {\n    \"description\": \"The third paragraph of the explanation for the process of getting an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPhoneNumberParagraph\": \"Enter your phone number below.\",\n  \"@enterPhoneNumberParagraph\": {\n    \"description\": \"A paragraph that tells users to enter their phone number to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPhoneNumberParagraph\": \"Phone number is not valid\",\n  \"@invalidPhoneNumberParagraph\": {\n    \"description\": \"User has entered an invalid phone number\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterConfirmationCodeParagraph\": \"We have sent you a confirmation code, please enter it below.\",\n  \"@enterConfirmationCodeParagraph\": {\n    \"description\": \"A paragraph that tells users to enter the confirmation code to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmationCodeError\": \"Failed to verify code, ensure you've entered it correctly\",\n  \"@confirmationCodeError\": {\n    \"description\": \"When a user enters their freepasa SMS code but it can't be verified\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"freepasaComplete\": \"Success, your new account will be available after 1 network confirmation\",\n  \"@freepasaComplete\": {\n    \"description\": \"After the freepasa process is complete\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unconfirmedAccountHeader\": \"Unconfirmed Account\",\n  \"@unconfirmedAccountHeader\": {\n    \"description\": \"A user has an account in their wallet that has been transferred to them, but isnt confirmed yet. This is the info dialog header.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unconfirmedAccountParagraph\": \"This is an <colored>unconfirmed account</colored>. It has been transferred to you, but there needs to be 1 network confirmation before you can use it. This usually takes about 5 minutes, once it's complete you'll be able to use this account.\",\n  \"@unconfirmedAccountParagraph\": {\n    \"description\": \"Explaining that an account can't be used until 1 network confirmation to the user.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowStarted\": \"Purchase Started for %1\",\n  \"@borrowStarted\": {\n    \"description\": \"Users may see this after starting the account purchase process\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowAccountParagraph\": \"To buy an account, first you’ll need to borrow one for free. If you send at least <colored>%1 Pascal (%2)</colored> to the account within <colored>%3 days</colored>, the account will be yours and <colored>%1 Pascal</colored> will be deducted from your balance automatically.\\nOtherwise, it’ll return back to us at the end of <colored>%3 days</colored> and won’t belong to your wallet anymore.\\nIt is recommended you only send a small amount of coins until you own the account.\",\n  \"@borrowAccountParagraph\": {\n    \"description\": \"A paragraph that explains the process of borrowing & buying an account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyParagraph\": \"Enter your private key below.\",\n  \"@importPrivateKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter their private key to the text field below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"looksLikeEncryptedKeyParagraph\": \"This looks like an encrypted private key, please enter the password to decrypt and import it.\",\n  \"@looksLikeEncryptedKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user that the key looks like an encrypted one and it needs to be decrypted to import\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonParagraph\": \"Enter an address to use a different Pascal daemon for RPC requests.\",\n  \"@changeDaemonParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a new daemon address below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"urlChangedToParagraph\": \"URL changed to %1\",\n  \"@urlChangedToParagraph\": {\n    \"description\": \"A paragraph that tells the user that the URL is changed to the entered URL\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyFirstParagraph\": \"You have 2 options for backing up your private key:\",\n  \"@backupKeyFirstParagraph\": {\n    \"description\": \"The first paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeySecondParagraph\": \"1- Encrypted, which means it is protected by a password.\",\n  \"@backupKeySecondParagraph\": {\n    \"description\": \"The second paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyThirdParagraph\": \"2- Unencrypted, which means it is raw and not protected by a password.\",\n  \"@backupKeyThirdParagraph\": {\n    \"description\": \"The third paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupKeyFourthParagraph\": \"We recommend storing the unencrypted version offline, by writing it on a piece of paper. You can store the encrypted version on a password manager for your convenience.\",\n  \"@backupKeyFourthParagraph\": {\n    \"description\": \"The fourth paragraph of the explanation for the process of backing up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptKeyParagraph\": \"Create a new password to encrypt your private key.\",\n  \"@encryptKeyParagraph\": {\n    \"description\": \"A paragraph that tells the user to create a new password to encrypt their key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupEncryptedKeyFirstParagraph\": \"Below is your encrypted private key. It is protected by a password. You can store it safely on a password manager for your convenience.\",\n  \"@backupEncryptedKeyFirstParagraph\": {\n    \"description\": \"A paragraph that explains how an encrypted private key can be backed up\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupEncryptedKeySecondParagraph\": \"Since it is encrypted with your password, if you lose or forget your password, you won't be able to decrypt it and access your funds.\",\n  \"@backupEncryptedKeySecondParagraph\": {\n    \"description\": \"A paragraph that gives a disclaimer about what would happen in case the password that was used to encrypt the private key is lost or forgotten\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backupUnencryptedKeyParagraph\": \"Below is your unencrypted private key. <colored>It is not protected by a password, which means it is crucial that you store it somewhere safe and offline.</colored> We recommend writing it on a piece of paper.\",\n  \"@backupUnencryptedKeyParagraph\": {\n    \"description\": \"A paragraph that explains the process of backing up the unencrypted private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeyParagraph\": \"Below is your public key. As the name suggests, it is intended to be shared publicly and prove that a particular operation belongs to your private key.\",\n  \"@publicKeyParagraph\": {\n    \"description\": \"A paragraph that explains what a public key is\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountParagraph\": \"This is a <colored>borrowed account</colored>.\\nIf you send at least <colored>%1 Pascal</colored> to it in the next <colored>%2 days, %3 hours, and %4 minutes</colored>, it’ll be yours.\",\n  \"@borrowedAccountParagraph\": {\n    \"description\": \"A paragraph that explains what a borrowed account is\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountPaidParagraph\": \"<colored>Your account has been purchased!</colored>\\nThe transfer is currently processing. This process usually takes about <colored>15 minutes</colored>, in some cases it may take slightly longer.\",\n  \"@borrowedAccountPaidParagraph\": {\n    \"description\": \"A paragraph that explains that the account has been purchased and transfer is currently processing\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutFirstDisclaimerParagraph\": \"<colored>Logging out will remove your private key and all Blaise related data from this device.</colored> If your private key is not backed up, you will never be able to access your funds again. If your private key is backed up, you have nothing to worry about.\",\n  \"@logoutFirstDisclaimerParagraph\": {\n    \"description\": \"The first part of the disclaimer that is shown when the user tries to log out.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutSecondDisclaimerParagraph\": \"Are you sure that you've backed up your private key? <colored>As long as you've backed up your private key, you have nothing to worry about.</colored>\",\n  \"@logoutSecondDisclaimerParagraph\": {\n    \"description\": \"The second part of the disclaimer that is shown when the user tries to log out.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noResultsFound\": \"No results found\",\n  \"@noResultsFound\": {\n    \"description\": \"When searching for account name has returned 0 results\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingConfirmParagraph\": \"Confirm the transaction details to send.\",\n  \"@sendingConfirmParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the info below to send\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentParagraph\": \"Transaction has been sent succesfully.\",\n  \"@sentParagraph\": {\n    \"description\": \"A paragraph that informs the user that the transaction has been sent succesfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameParagraph\": \"Enter a name below to change your account's name.\",\n  \"@changeNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a new account name below\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingNameParagraph\": \"Confirm your new account name to proceed.\",\n  \"@changingNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the new account name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changedNameParagraph\": \"Your account name has been changed successfully.\",\n  \"@changedNameParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account name has been changed successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferParagraph\": \"Enter a public key below to transfer the ownership of this account to it.\",\n  \"@transferParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a public key to the text field below to transfer the ownership of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferringParagraph\": \"Confirm the public key below to transfer the ownership of this account to it.\",\n  \"@transferringParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the public key below to proceed with the transfer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredParagraph\": \"Your account has been transferred successfully to the public key below.\",\n  \"@transferredParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account transfer has been completed successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleParagraph\": \"Enter a price and an account that will be receiving the payment to list this account for sale.\",\n  \"@listForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a price and a receiver account to list the account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listingForSaleParagraph\": \"Confirm the price and the account that will be receiving the payment.\",\n  \"@listingForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the price and the receiver account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleParagraph\": \"Your account has been successfully listed for sale. We’ll let you know if someone buys it.\",\n  \"@listedForSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account has been listed for sale successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleParagraph\": \"Enter a price, a receiving account, and a public key below to create a private sale for this account.\",\n  \"@createPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter a price, a receiver account, and a public key to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"creatingPrivateSaleParagraph\": \"Confirm the information below.\",\n  \"@creatingPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the information below.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createdPrivateSaleParagraph\": \"The private sale has been created successfully. We’ll let you know if it is bought.\",\n  \"@createdPrivateSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the private sale has been created successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistFromSaleParagraph\": \"Confirm that you would like to delist this account from sale.\",\n  \"@delistFromSaleParagraph\": {\n    \"description\": \"A paragraph that tells the users to confirm that they would like to delist the account from sale.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedFromSaleParagraph\": \"Your account has been successfully delisted from sale.\",\n  \"@delistedFromSaleParagraph\": {\n    \"description\": \"A paragraph that informs the user that the account has been delisted from sale successfully\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeRequiredParagraph\": \"This operation requires a fee.\",\n  \"@feeRequiredParagraph\": {\n    \"description\": \"A paragraph to indicate that the operation requires a fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeConfirmAmountParagraph\": \"Please confirm the addition of %1 Pascal fee to this operation to continue.\",\n  \"@feeConfirmAmountParagraph\": {\n    \"description\": \"A paragraph to tell the user to confirm the addition of a fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyTypeNotSupportedParagraph\": \"This type of private key is not yet supported by Blaise. You may create a new private key and transfer your accounts to it using a different wallet.\",\n  \"@keyTypeNotSupportedParagraph\": {\n    \"description\": \"A paragraph to tell the user that the private key type is not supported\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPINToUnlockParagraph\": \"Enter PIN to unlock Blaise\",\n  \"@enterPINToUnlockParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter the PIN to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToUnlockParagraph\": \"Authenticate to Unlock Blaise\",\n  \"@authenticateToUnlockParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to unlock the wallet\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"manyFailedAttemptsParagraph\": \"Too many failed unlock attempts\",\n  \"@manyFailedAttemptsParagraph\": {\n    \"description\": \"A paragraph to inform the user that there was too many failed unlock attempts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToChangeNameParagraph\": \"Authenticate to change account name to \\\"%1\\\"\",\n  \"@authenticateToChangeNameParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to change the name of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToDelistParagraph\": \"Authenticate to delist the account from sale\",\n  \"@authenticateToDelistParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to delist the account from sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToListForSaleParagraph\": \"Authenticate to list account for sale\",\n  \"@authenticateToListForSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to list the account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToCreatePrivateSaleParagraph\": \"Authenticate to create private sale\",\n  \"@authenticateToCreatePrivateSaleParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to create a private sale for the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToTransferParagraph\": \"Authenticate to transfer account\",\n  \"@authenticateToTransferParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to transfer the ownership of the account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToSendParagraph\": \"Authenticate to send %1 Pascal\",\n  \"@authenticateToSendParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to send a specified amount of Pascal\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateToBackUpParagraph\": \"Authenticate to back up private key\",\n  \"@authenticateToBackUpParagraph\": {\n    \"description\": \"A paragraph that tells the user to authenticate to back up the private key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPINParagraph\": \"Invalid PIN\",\n  \"@invalidPINParagraph\": {\n    \"description\": \"A paragraph that tells the user that the entered PIN is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noMatchPINParagraph\": \"PINs do not match\",\n  \"@noMatchPINParagraph\": {\n    \"description\": \"A paragraph that tells the user that the entered PINs do not match\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmPINParagraph\": \"Confirm your PIN\",\n  \"@confirmPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to confirm the PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"enterPINParagraph\": \"Enter PIN\",\n  \"@enterPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to enter the PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPINParagraph\": \"Create a 6-digit PIN\",\n  \"@createPINParagraph\": {\n    \"description\": \"A paragraph that tells the user to create a PIN\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addedToContactsParagraph\": \"%1 added to contacts\",\n  \"@addedToContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact has been added to contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"removedFromContactsParagraph\": \"Removed %1 from contacts\",\n  \"@removedFromContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact has been removed from contacts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToRemoveFromContactsParagraph\": \"Failed to remove %1 from contacts\",\n  \"@failedToRemoveFromContactsParagraph\": {\n    \"description\": \"A paragraph that tells the user that the contact removel process is failed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"successfullyImportedContactsParagraph\": \"Successfully imported %1 contacts\",\n  \"@successfullyImportedContactsParagraph\": {\n    \"description\": \"A paragraph to tell the user that a specific number of contacts was successfully imported\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"checkOutBlaiseParagraph\": \"Check out Blaise! Simple, sleek & secure Pascal wallet for iOS and Android: https://blaisewallet.com\",\n  \"@checkOutBlaiseParagraph\": {\n    \"description\": \"A paragraph that is shared when the user shares Blaise with others via the option in the settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newAccountParagraph\": \"This is your new account.\\nOnce you receive <colored>Pascal</colored>, operations will show up like below.\",\n  \"@newAccountParagraph\": {\n    \"description\": \"A paragraph that is shown in the operations list of a new account as an explainer\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"settingsHeader\": \"Settings\",\n  \"@settingsHeader\": {\n    \"description\": \"Header for the settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"preferencesHeader\": \"Preferences\",\n  \"@preferencesHeader\": {\n    \"description\": \"Header for the preferences section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"currencyHeader\": \"Currency\",\n  \"@currencyHeader\": {\n    \"description\": \"Header for the currencies\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"languageHeader\": \"Language\",\n  \"@languageHeader\": {\n    \"description\": \"Header for the languages\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"languageColonHeader\": \"Language:\",\n  \"@languageColonHeader\": {\n    \"description\": \"Header for the language option on welcome page\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"systemDefaultHeader\": \"System Default\",\n  \"@systemDefaultHeader\": {\n    \"description\": \"Header for system default\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeHeader\": \"Theme\",\n  \"@themeHeader\": {\n    \"description\": \"Header for the themes\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeLightHeader\": \"Light\",\n  \"@themeLightHeader\": {\n    \"description\": \"Header for the light theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeDarkHeader\": \"Dark\",\n  \"@themeDarkHeader\": {\n    \"description\": \"Header for the dark theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"themeCopperHeader\": \"Copper\",\n  \"@themeCopperHeader\": {\n    \"description\": \"Header for the copper theme\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"notificationsHeader\": \"Notifications\",\n  \"@notificationsHeader\": {\n    \"description\": \"Header for the notifications\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"securityHeader\": \"Security\",\n  \"@securityHeader\": {\n    \"description\": \"Header for the security section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationMethodHeader\": \"Authentication Method\",\n  \"@authenticationMethodHeader\": {\n    \"description\": \"Header for the authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationPINHeader\": \"PIN\",\n  \"@authenticationPINHeader\": {\n    \"description\": \"Header for the PIN authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticationBiometricsHeader\": \"Biometrics\",\n  \"@authenticationBiometricsHeader\": {\n    \"description\": \"Header for the biometric authentication method\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"authenticateOnLaunchHeader\": \"Authenticate on Launch\",\n  \"@authenticateOnLaunchHeader\": {\n    \"description\": \"Header for the authenticate on launch option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"yesHeader\": \"Yes\",\n  \"@yesHeader\": {\n    \"description\": \"Header for the yes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noHeader\": \"No\",\n  \"@noHeader\": {\n    \"description\": \"Header for the no option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"automaticallyLockHeader\": \"Automatically Lock\",\n  \"@automaticallyLockHeader\": {\n    \"description\": \"Header for the automatically lock option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockInstantHeader\": \"Instantly\",\n  \"@lockInstantHeader\": {\n    \"description\": \"Header for instantly locking option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock1Header\": \"After %1 minute\",\n  \"@lock1Header\": {\n    \"description\": \"Header for locking after 1 minute option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock5Header\": \"After %1 minutes\",\n  \"@lock5Header\": {\n    \"description\": \"Header for locking after 5 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock15Header\": \"After %1 minutes\",\n  \"@lock15Header\": {\n    \"description\": \"Header for locking after 15 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock30Header\": \"After %1 minutes\",\n  \"@lock30Header\": {\n    \"description\": \"Header for locking after 30 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lock60Header\": \"After %1 minutes\",\n  \"@lock60Header\": {\n    \"description\": \"Header for locking after 60 minutes option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"daemonHeader\": \"Daemon\",\n  \"@daemonHeader\": {\n    \"description\": \"Header for Pascal daemon setting\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"defaultHeader\": \"Default\",\n  \"@defaultHeader\": {\n    \"description\": \"Header for default option\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"manageHeader\": \"Manage\",\n  \"@manageHeader\": {\n    \"description\": \"Header for the manage section\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactsHeader\": \"Contacts\",\n  \"@contactsHeader\": {\n    \"description\": \"Header for the contacts section in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpPrivateKeyHeader\": \"Back Up Private Key\",\n  \"@backUpPrivateKeyHeader\": {\n    \"description\": \"Header for the back up private key option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"viewPublicKeyHeader\": \"View Public Key\",\n  \"@viewPublicKeyHeader\": {\n    \"description\": \"Header for the view public key option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"shareHeader\": \"Share Blaise\",\n  \"@shareHeader\": {\n    \"description\": \"Header for the share Blaise option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"logoutHeader\": \"Logout\",\n  \"@logoutHeader\": {\n    \"description\": \"Header for the logout option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privacyPolicyHeader\": \"Privacy Policy\",\n  \"@privacyPolicyHeader\": {\n    \"description\": \"Header for the privacy policy option in settings\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeAccountNameHeader\": \"Change Account Name\",\n  \"@changeAccountNameHeader\": {\n    \"description\": \"Header for the change account name option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferAccountHeader\": \"Transfer Account\",\n  \"@transferAccountHeader\": {\n    \"description\": \"Header for the transfer account option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listAccountForSaleHeader\": \"List Account For Sale\",\n  \"@listAccountForSaleHeader\": {\n    \"description\": \"Header for the list account for sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleHeader\": \"Create Private Sale\",\n  \"@createPrivateSaleHeader\": {\n    \"description\": \"Header for the create private sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistFromSaleHeader\": \"Delist From Sale\",\n  \"@delistFromSaleHeader\": {\n    \"description\": \"Header for the delist from sale option in other operations list\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"getAccountSheetHeader\": \"Get Account\",\n  \"@getAccountSheetHeader\": {\n    \"description\": \"Header for the get account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"freeAccountSheetHeader\": \"Free Account\",\n  \"@freeAccountSheetHeader\": {\n    \"description\": \"Header for the free account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAccountSheetHeader\": \"Buy Account\",\n  \"@buyAccountSheetHeader\": {\n    \"description\": \"Header for the buy account sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendSheetHeader\": \"Send\",\n  \"@sendSheetHeader\": {\n    \"description\": \"Header for send sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingSheetHeader\": \"Sending\",\n  \"@sendingSheetHeader\": {\n    \"description\": \"Header for sending sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentSheetHeader\": \"Sent\",\n  \"@sentSheetHeader\": {\n    \"description\": \"Header for sent sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"requestSheetHeader\": \"Request\",\n  \"@requestSheetHeader\": {\n    \"description\": \"Header for request sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeNameSheetHeader\": \"Change Name\",\n  \"@changeNameSheetHeader\": {\n    \"description\": \"Header for change name sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingNameSheetHeader\": \"Changing\",\n  \"@changingNameSheetHeader\": {\n    \"description\": \"Header for name changing sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changedNameSheetHeader\": \"Changed\",\n  \"@changedNameSheetHeader\": {\n    \"description\": \"Header for name changed sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferSheetHeader\": \"Transfer\",\n  \"@transferSheetHeader\": {\n    \"description\": \"Header for transfer sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferringSheetHeader\": \"Transferring\",\n  \"@transferringSheetHeader\": {\n    \"description\": \"Header for transferring sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredSheetHeader\": \"Transferred\",\n  \"@transferredSheetHeader\": {\n    \"description\": \"Header for transferred sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listForSaleSheetHeader\": \"List For Sale\",\n  \"@listForSaleSheetHeader\": {\n    \"description\": \"Header for list for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listingForSaleSheetHeader\": \"Listing\",\n  \"@listingForSaleSheetHeader\": {\n    \"description\": \"Header for listing for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleSheetHeader\": \"Listed\",\n  \"@listedForSaleSheetHeader\": {\n    \"description\": \"Header for listed for sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createPrivateSaleSheetHeader\": \"Private Sale\",\n  \"@createPrivateSaleSheetHeader\": {\n    \"description\": \"Header for create private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"creatingPrivateSaleSheetHeader\": \"Creating\",\n  \"@creatingPrivateSaleSheetHeader\": {\n    \"description\": \"Header for creating private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"createdPrivateSaleSheetHeader\": \"Created\",\n  \"@createdPrivateSaleSheetHeader\": {\n    \"description\": \"Header for created private sale sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistingSheetHeader\": \"Delisting\",\n  \"@delistingSheetHeader\": {\n    \"description\": \"Header for delisting sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedSheetHeader\": \"Delisted\",\n  \"@delistedSheetHeader\": {\n    \"description\": \"Header for delisted sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addContactSheetHeader\": \"Add Contact\",\n  \"@addContactSheetHeader\": {\n    \"description\": \"Header for add contact sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactSheetHeader\": \"Contact\",\n  \"@contactSheetHeader\": {\n    \"description\": \"Header for contact details sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeySheetHeader\": \"Public Key\",\n  \"@publicKeySheetHeader\": {\n    \"description\": \"Header for public key sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateKeySheetHeader\": \"Private Key\",\n  \"@privateKeySheetHeader\": {\n    \"description\": \"Header for private key sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpSheetHeader\": \"Back Up\",\n  \"@backUpSheetHeader\": {\n    \"description\": \"Header for back up sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptSheetHeader\": \"Encrypt\",\n  \"@encryptSheetHeader\": {\n    \"description\": \"Header for encrypt sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeDaemonSheetHeader\": \"Change Daemon\",\n  \"@changeDaemonSheetHeader\": {\n    \"description\": \"Header for change daemon sheet (screen)\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"securityFirstHeader\": \"Security First!\",\n  \"@securityFirstHeader\": {\n    \"description\": \"Header for security first screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPrivateKeyHeader\": \"New Private Key\",\n  \"@newPrivateKeyHeader\": {\n    \"description\": \"Header for new private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"importPrivateKeyHeader\": \"Import Private Key\",\n  \"@importPrivateKeyHeader\": {\n    \"description\": \"Header for import private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"decryptAndImportKeyHeader\": \"Decrypt & Import\",\n  \"@decryptAndImportKeyHeader\": {\n    \"description\": \"Header for decrypt & import private key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"backUpKeyHeader\": \"Back Up Your Key!\",\n  \"@backUpKeyHeader\": {\n    \"description\": \"Header for back up your key screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockedHeader\": \"Locked\",\n  \"@lockedHeader\": {\n    \"description\": \"Header for locked screen\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateKeyTextFieldHeader\": \"Private Key\",\n  \"@privateKeyTextFieldHeader\": {\n    \"description\": \"Header for private key text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"passwordTextFieldHeader\": \"Password\",\n  \"@passwordTextFieldHeader\": {\n    \"description\": \"Header for password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPasswordTextFieldHeader\": \"New Password\",\n  \"@newPasswordTextFieldHeader\": {\n    \"description\": \"Header for new password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmPasswordTextFieldHeader\": \"Confirm Password\",\n  \"@confirmPasswordTextFieldHeader\": {\n    \"description\": \"Header for confirm password text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmTextFieldHeader\": \"Confirm\",\n  \"@confirmTextFieldHeader\": {\n    \"description\": \"Header for confirm text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"countryCodeTextFieldHeader\": \"Country Code\",\n  \"@countryCodeTextFieldHeader\": {\n    \"description\": \"Header for country code text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"phoneNumberTextFieldHeader\": \"Phone Number\",\n  \"@phoneNumberTextFieldHeader\": {\n    \"description\": \"Header for phone number text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"confirmationCodeTextFieldHeader\": \"Confirmation Code\",\n  \"@confirmationCodeTextFieldHeader\": {\n    \"description\": \"Header for confirmation code text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountTextFieldHeader\": \"Account\",\n  \"@accountTextFieldHeader\": {\n    \"description\": \"Header for account text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addressTextFieldHeader\": \"Address\",\n  \"@addressTextFieldHeader\": {\n    \"description\": \"Header for address text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactNameTextFieldHeader\": \"Contact Name\",\n  \"@contactNameTextFieldHeader\": {\n    \"description\": \"Header for contact name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"amountTextFieldHeader\": \"Amount\",\n  \"@amountTextFieldHeader\": {\n    \"description\": \"Header for amount text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"payloadTextFieldHeader\": \"Payload\",\n  \"@payloadTextFieldHeader\": {\n    \"description\": \"Header for payload text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameTextFieldHeader\": \"Name\",\n  \"@nameTextFieldHeader\": {\n    \"description\": \"Header for name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newAccountNameTextFieldHeader\": \"New Account Name\",\n  \"@newAccountNameTextFieldHeader\": {\n    \"description\": \"Header for new account name text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"publicKeyTextFieldHeader\": \"Public Key\",\n  \"@publicKeyTextFieldHeader\": {\n    \"description\": \"Header for public key text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"priceTextFieldHeader\": \"Price\",\n  \"@priceTextFieldHeader\": {\n    \"description\": \"Header for price text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivingAccountTextFieldHeader\": \"Receiving Account\",\n  \"@receivingAccountTextFieldHeader\": {\n    \"description\": \"Header for receiving account text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"durationTextFieldHeader\": \"Duration\",\n  \"@durationTextFieldHeader\": {\n    \"description\": \"Header for duration text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeTextFieldHeader\": \"Fee\",\n  \"@feeTextFieldHeader\": {\n    \"description\": \"Header for fee text field\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"otherOperationsHeader\": \"Other Operations\",\n  \"@otherOperationsHeader\": {\n    \"description\": \"Header for other operations dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"warningHeader\": \"Warning\",\n  \"@warningHeader\": {\n    \"description\": \"Header for warning dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"areYouSureHeader\": \"Are You Sure?\",\n  \"@areYouSureHeader\": {\n    \"description\": \"Header for are you sure dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"addFeeHeader\": \"Add Fee\",\n  \"@addFeeHeader\": {\n    \"description\": \"Header for add fee dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"keyTypeNotSupportedHeader\": \"Key Not Supported\",\n  \"@keyTypeNotSupportedHeader\": {\n    \"description\": \"Header for key not supported dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountToSendFromHeader\": \"Account to Send From\",\n  \"@accountToSendFromHeader\": {\n    \"description\": \"Header for account to send from dialog\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sentHeader\": \"Sent\",\n  \"@sentHeader\": {\n    \"description\": \"Header for sent type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivedHeader\": \"Received\",\n  \"@receivedHeader\": {\n    \"description\": \"Header for received type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameChangedHeader\": \"Name Changed\",\n  \"@nameChangedHeader\": {\n    \"description\": \"Header for listed for sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listedForSaleHeader\": \"Listed For Sale\",\n  \"@listedForSaleHeader\": {\n    \"description\": \"Header for listed for sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"privateSaleHeader\": \"Private Sale\",\n  \"@privateSaleHeader\": {\n    \"description\": \"Header for private sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedFromSaleHeader\": \"Delisted From Sale\",\n  \"@delistedFromSaleHeader\": {\n    \"description\": \"Header for delisted from sale type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistedHeader\": \"Delisted\",\n  \"@delistedHeader\": {\n    \"description\": \"Header for delisted type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"undefinedHeader\": \"Undefined\",\n  \"@undefinedHeader\": {\n    \"description\": \"Header for undefined type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transferredHeader\": \"Transferred\",\n  \"@transferredHeader\": {\n    \"description\": \"Header for transferred type operation list item\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"connectingHeader\": \"Connecting\",\n  \"@connectingHeader\": {\n    \"description\": \"A header to let the user now that Blaise is currently connecting to (or loading) live chat.\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"balanceHeader\": \"Balance\",\n  \"@balanceHeader\": {\n    \"description\": \"Header for balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"totalBalanceHeader\": \"Total Balance\",\n  \"@totalBalanceHeader\": {\n    \"description\": \"Header for total balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountBalanceHeader\": \"Account Balance\",\n  \"@accountBalanceHeader\": {\n    \"description\": \"Header for account balance\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountsHeader\": \"Accounts\",\n  \"@accountsHeader\": {\n    \"description\": \"Header for accounts\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"operationsHeader\": \"Operations\",\n  \"@operationsHeader\": {\n    \"description\": \"Header for operations\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptThePayloadHeader\": \"Encrypt the Payload\",\n  \"@encryptThePayloadHeader\": {\n    \"description\": \"Header for encrypt the payload switch\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"encryptPayloadHeader\": \"Encrypt Payload\",\n  \"@encryptPayloadHeader\": {\n    \"description\": \"Header for encrypt payload switch\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"forSaleHeader\": \"For Sale\",\n  \"@forSaleHeader\": {\n    \"description\": \"Header of for sale tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedHeader\": \"Borrowed\",\n  \"@borrowedHeader\": {\n    \"description\": \"Header for borrowed tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedTransferredHeader\": \"Transfer Pending\",\n  \"@borrowedTransferredHeader\": {\n    \"description\": \"Header for borrowed tag, after account is transferred but not confirmed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"borrowedAccountHeader\": \"Borrowed Account\",\n  \"@borrowedAccountHeader\": {\n    \"description\": \"Header for borrowed account tag\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeColonHeader\": \"Fee:\",\n  \"@feeColonHeader\": {\n    \"description\": \"Header for fee amount\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"pendingHeader\": \"Pending\",\n  \"@pendingHeader\": {\n    \"description\": \"Header to indicate that an operation is pending\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"onHeader\": \"On\",\n  \"@onHeader\": {\n    \"description\": \"A header to indicate that something is on\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"offHeader\": \"Off\",\n  \"@offHeader\": {\n    \"description\": \"A header to indicate that something is off\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"priceRequiredError\": \"Price is required\",\n  \"@priceRequiredError\": {\n    \"description\": \"Error that tells the user that the price is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"amountRequiredError\": \"Amount is required\",\n  \"@amountRequiredError\": {\n    \"description\": \"Error that tells the user that the amount is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nameRequiredError\": \"Name is required\",\n  \"@nameRequiredError\": {\n    \"description\": \"Error that tells the user that the name is required\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"zeroPriceError\": \"Price can't be 0\",\n  \"@zeroPriceError\": {\n    \"description\": \"Error that tells the user that the price cant be zero\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"zeroAmountError\": \"Amount can't be 0\",\n  \"@zeroAmountError\": {\n    \"description\": \"Error that tells the user that the amount cant be zero\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAccountNameError\": \"Invalid account name\",\n  \"@invalidAccountNameError\": {\n    \"description\": \"Error that tells the user that the account name is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidReceivingAccountError\": \"Invalid receiving account\",\n  \"@invalidReceivingAccountError\": {\n    \"description\": \"Error that tells the user that the receiving account is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPublicKeyError\": \"Invalid public key\",\n  \"@invalidPublicKeyError\": {\n    \"description\": \"Error that tells the user that the public key is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPrivateKeyError\": \"Invalid private key\",\n  \"@invalidPrivateKeyError\": {\n    \"description\": \"Error that tells the user that the private key is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAddressError\": \"Invalid address\",\n  \"@invalidAddressError\": {\n    \"description\": \"Error that tells the user that the address is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidAccountError\": \"Invalid account\",\n  \"@invalidAccountError\": {\n    \"description\": \"Error that tells the user that the account is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidDestinationError\": \"Invalid destination\",\n  \"@invalidDestinationError\": {\n    \"description\": \"Error that tells the user that the destination is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"insufficientBalanceError\": \"Insufficient balance\",\n  \"@insufficientBalanceError\": {\n    \"description\": \"Error that tells the user that the balance is insufficient\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"threeCharacterNameError\": \"Must be at least 3 characters\",\n  \"@threeCharacterNameError\": {\n    \"description\": \"Error that tells the user that the account name cant be shorter than 3 characters\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactDoesntExistError\": \"Contact doesn't exist\",\n  \"@contactDoesntExistError\": {\n    \"description\": \"Error that tells the user that the contact doesnt exist\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"contactAlreadyExistsError\": \"Contact already exists\",\n  \"@contactAlreadyExistsError\": {\n    \"description\": \"Error that tells the user that the contact already exists\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"cantSendToYourselfError\": \"Can't send to yourself\",\n  \"@cantSendToYourselfError\": {\n    \"description\": \"Error that tells the user that you cant send to yourself\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"somethingWentWrongError\": \"Something went wrong, please try again later\",\n  \"@somethingWentWrongError\": {\n    \"description\": \"Error that tells the user that something went wrong\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToEncryptPayloadError\": \"Failed to encrypt the payload\",\n  \"@failedToEncryptPayloadError\": {\n    \"description\": \"Error that tells the user that payload encrypt is failed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"emptyPasswordError\": \"Password can't be empty\",\n  \"@emptyPasswordError\": {\n    \"description\": \"Error that tells the user that the password cant be empty\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noMatchPasswordError\": \"Passwords don't match\",\n  \"@noMatchPasswordError\": {\n    \"description\": \"Error that tells the user that the passwords dont match\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"invalidPasswordError\": \"Invalid password\",\n  \"@invalidPasswordError\": {\n    \"description\": \"Error that tells the user that the password is invalid\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"didNotGetResponseError\": \"Did not get a response from server\",\n  \"@didNotGetResponseError\": {\n    \"description\": \"Error that tells the user that there is no response from the server\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noContactsToExportError\": \"No contacts to export\",\n  \"@noContactsToExportError\": {\n    \"description\": \"Error that tells the user that there is no contacts to export\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noContactsToImportError\": \"No contacts to import\",\n  \"@noContactsToImportError\": {\n    \"description\": \"Error that tells the user that there is no contacts to import\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"failedToImportContactsError\": \"Failed to import contacts\",\n  \"@failedToImportContactsError\": {\n    \"description\": \"Error that tells the user that there is no contacts to export\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"blockchainRewardOPDetails\": \"Blockchain Reward (%1)\",\n  \"@blockchainRewardOPDetails\": {\n    \"description\": \"Operation details header for blockchain reward\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"transactionOPDetails\": \"Transaction (%1)\",\n  \"@transactionOPDetails\": {\n    \"description\": \"Operation details header for transaction\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeKeyOPDetails\": \"Change key (%1)\",\n  \"@changeKeyOPDetails\": {\n    \"description\": \"Operation details header for change key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"recoverFundsOPDetails\": \"Recover Funds (%1)\",\n  \"@recoverFundsOPDetails\": {\n    \"description\": \"Operation details header for recover funds\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"listAccountForSaleOPDetails\": \"List Account for Sale (%1)\",\n  \"@listAccountForSaleOPDetails\": {\n    \"description\": \"Operation details header for list account for sale\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"delistAccountOPDetails\": \"Delist Account (%1)\",\n  \"@delistAccountOPDetails\": {\n    \"description\": \"Operation details header for delist account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"buyAccountOPDetails\": \"Buy Account (%1)\",\n  \"@buyAccountOPDetails\": {\n    \"description\": \"Operation details header for buy account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeKeySignedOPDetails\": \"Change Key Signed (%1)\",\n  \"@changeKeySignedOPDetails\": {\n    \"description\": \"Operation details header for change key signed\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changeAccountInfoOPDetails\": \"Change Account Info (%1)\",\n  \"@changeAccountInfoOPDetails\": {\n    \"description\": \"Operation details header for change account info\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"multioperationOPDetails\": \"Multioperation (%1)\",\n  \"@multioperationOPDetails\": {\n    \"description\": \"Operation details header for multioperation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"unknownOPDetails\": \"Unknown (%1)\",\n  \"@unknownOPDetails\": {\n    \"description\": \"Operation details header for unknown\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendingAccountOPDetails\": \"Sending Account\",\n  \"@sendingAccountOPDetails\": {\n    \"description\": \"Operation details header for sending account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"receivingAccountOPDetails\": \"Receiving Account\",\n  \"@receivingAccountOPDetails\": {\n    \"description\": \"Operation details header for receiving account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"changingAccountOPDetails\": \"Changing Account\",\n  \"@changingAccountOPDetails\": {\n    \"description\": \"Operation details header for changing account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sendAmountOPDetails\": \"Send Amount\",\n  \"@sendAmountOPDetails\": {\n    \"description\": \"Operation details header for send amount\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"payloadOPDetails\": \"Payload\",\n  \"@payloadOPDetails\": {\n    \"description\": \"Operation details header for payload\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newPublicKeyOPDetails\": \"New Public Key\",\n  \"@newPublicKeyOPDetails\": {\n    \"description\": \"Operation details header for new public key\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"newNameOPDetails\": \"New Name\",\n  \"@newNameOPDetails\": {\n    \"description\": \"Operation details header for new name\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"sellerAccountOPDetails\": \"Seller Account\",\n  \"@sellerAccountOPDetails\": {\n    \"description\": \"Operation details header for seller account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountPriceOPDetails\": \"Account Price\",\n  \"@accountPriceOPDetails\": {\n    \"description\": \"Operation details header for account price\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"lockedUntilBlockOPDetails\": \"Locked Until Block\",\n  \"@lockedUntilBlockOPDetails\": {\n    \"description\": \"Operation details header for locked until block\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"blockOPDetails\": \"block\",\n  \"@blockOPDetails\": {\n    \"description\": \"Operation details header for block\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"optxtOPDetails\": \"optxt\",\n  \"@optxtOPDetails\": {\n    \"description\": \"Operation details header for optxt\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"timeOPDetails\": \"time\",\n  \"@timeOPDetails\": {\n    \"description\": \"Operation details header for time\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"naOPDetails\": \"N/A\",\n  \"@naOPDetails\": {\n    \"description\": \"Operation details header for N/A\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"ophashOPDetails\": \"ophash\",\n  \"@ophashOPDetails\": {\n    \"description\": \"Operation details header for ophash\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"optypeOPDetails\": \"optype\",\n  \"@optypeOPDetails\": {\n    \"description\": \"Operation details header for optype\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"maturationOPDetails\": \"maturation\",\n  \"@maturationOPDetails\": {\n    \"description\": \"Operation details header for maturation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"nullOPDetails\": \"null\",\n  \"@nullOPDetails\": {\n    \"description\": \"Operation details header for null\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"feeOPDetails\": \"fee\",\n  \"@feeOPDetails\": {\n    \"description\": \"Operation details header for fee\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"opblockOPDetails\": \"opblock\",\n  \"@opblockOPDetails\": {\n    \"description\": \"Operation details header for opblock\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"noperationOPDetails\": \"n_operation\",\n  \"@noperationOPDetails\": {\n    \"description\": \"Operation details header for n_operation\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"accountOPDetails\": \"account\",\n  \"@accountOPDetails\": {\n    \"description\": \"Operation details header for account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  },\n  \"signeraccountOPDetails\": \"signer_account\",\n  \"@signeraccountOPDetails\": {\n    \"description\": \"Operation details header for signer_account\",\n    \"type\": \"text\",\n    \"placeholders\": {}\n  }\n}"
  },
  {
    "path": "lib/l10n/intl_tr.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"Yeni Gizli Anahtar\",\n  \"importPrivateKeyButton\": \"Anahtarı İçe Aktar\",\n  \"gotItButton\": \"Tamamdır!\",\n  \"goBackButton\": \"Geri Dön\",\n  \"copyButton\": \"Kopyala\",\n  \"copiedButton\": \"Kopyalandı\",\n  \"keyCopiedButton\": \"Anahtar Kopyalandı\",\n  \"iHaveBackedItUpButton\": \"Yedekledim\",\n  \"yesImSureButton\": \"Evet, Eminim\",\n  \"noGoBackButton\": \"Hayır, Geri Dön\",\n  \"getAnAccountButton\": \"Hesap Al\",\n  \"getAFreeAccountButton\": \"Ücretsiz Hesap Al\",\n  \"buyAnAccountButton\": \"Hesap Satın Al\",\n  \"sendConfirmationButton\": \"Onay Kodu Gönder\",\n  \"confirmButton\": \"Onayla\",\n  \"borrowAnAccountButton\": \"Ödünç Hesap Al\",\n  \"importButton\": \"İçe Aktar\",\n  \"receiveButton\": \"İste\",\n  \"sendButton\": \"Gönder\",\n  \"copyAddressButton\": \"Adresi Kopyala\",\n  \"copiedAddressButton\": \"Adres Kopyalandı\",\n  \"addToContactsButton\": \"Rehbere Ekle\",\n  \"operationDetailsButton\": \"Operasyon detayları\",\n  \"openInExplorerButton\": \"Tarayıcıda Aç\",\n  \"requestButton\": \"İste\",\n  \"addAPayloadButton\": \"+ Not Ekle\",\n  \"addADurationButton\": \"+ Süre Ekle\",\n  \"scanQRCodeButton\": \"QR Kodu Tara\",\n  \"cancelButton\": \"İptal\",\n  \"closeButton\": \"Kapat\",\n  \"changeNameButton\": \"Adı Değiştir\",\n  \"transferButton\": \"Transfer Et\",\n  \"listForSaleButton\": \"Şatışa Çıkar\",\n  \"createPrivateSaleButton\": \"Özel Satış Oluştur\",\n  \"yesAddFeeButton\": \"Evet, Ücreti Ekle\",\n  \"unlockButton\": \"Kilidi Aç\",\n  \"unlockWithBiometricsButton\": \"Biometrik ile Aç\",\n  \"unlockWithPINButton\": \"PIN ile Aç\",\n  \"setToDefaultButton\": \"Varsayılan\",\n  \"changeDaemonButton\": \"Değiştir\",\n  \"addContactButton\": \"Kişi Ekle\",\n  \"encryptedKeyButton\": \"Şifreli Anahtar\",\n  \"unencryptedKeyButton\": \"Ham Anahtar\",\n  \"encryptButton\": \"Şifrele\",\n  \"showButton\": \"Göster\",\n  \"hideButton\": \"Gizle\",\n  \"copyEncryptedKeyButton\": \"Şifreli Anahtarı Kopyala\",\n  \"copyUnencryptedKeyButton\": \"Ham Anahtarı Kopyala\",\n  \"copyKeyButton\": \"Anahtarı Kopyala\",\n  \"copyPublicKeyButton\": \"Açık Anahtarı Kopyala\",\n  \"deletePrivateKeyAndLogoutButton\": \"Gizli Anahtarı Sil\\nve Çık\",\n  \"searchForNameButton\": \"Adı Ara\",\n  \"searchAccountNameButton\": \"Hesap Adı Ara\",\n  \"searchNameButton\": \"Adı Ara\",\n  \"okayGoBackButton\": \"Tamamdır, Geri Dön\",\n  \"nextButton\": \"İleri\",\n  \"welcomeParagraph\": \"Blaise'e hoşgeldin. Başlamak için yeni bir gizli anahtar oluştur veya zaten bir gizli anahtarın varsa içe aktar.\",\n  \"newKeySecurityParagraph\": \"Bir sonraki ekranda yeni gizli anahtarını göreceksin. Bu, cüzdanına ve bakiyene ulaşmanı sağlayan bir çeşit şifre. Anahtarı yedeklemen ve kimseyle paylaşmaman çok önemli.\",\n  \"uninstallDisclaimerParagraph\": \"Cihazını kaybedersen veya Blaise'i silersen, bakiyene ve cüzdanına tekrar ulaşmak için gizli anahtarına ihtiyaç duyacaksın.\",\n  \"newPrivateKeyParagraph\": \"Aşağıda cüzdanın yeni gizli anahtarını görebilirsin. Anahtarını yedeklemen çok önemli. Anahtarı kesinlikle ekran görüntüsü olarak saklamamalısın. Anahtarı bir kağıda yazmanı ve çevrim dışı olarak saklamanı tavsiye ediyoruz.\",\n  \"newKeyBackUpConfirmParagraph\": \"Yeni cüzdanının gizli anahtarını yedeklediğine emin misin?\",\n  \"newWalletGreetingParagraph\": \"<colored>Blaise</colored>'e hoşgeldin.\\nBir hesap alarak başlayabilirsin.\",\n  \"getAccountFirstParagraph\": \"İlk hesabını almak için 2 seçeneğin var:\",\n  \"getAccountSecondParagraph\": \"1- Telefon numaranı kullanarak ücretsiz olarak bir hesap alabilirsin. <colored> Her telefon numarası için en fazla 1 hesap alabilirsin.</colored>\",\n  \"getAccountThirdParagraph\": \"2- <colored>%1 Pascal (%2)</colored> karşılığında istediğin kadar hesap satın alabilirsin.\",\n  \"enterPhoneNumberParagraph\": \"Telefon numaranı aşağıya gir.\",\n  \"enterConfirmationCodeParagraph\": \"Sana bir onay kodu yolladık, lütfen kodu aşağıya gir.\",\n  \"borrowStarted\": \"%1 için alım işlemi başladı\",\n  \"borrowAccountParagraph\": \"Bir hesap satın almak için, öncelikle bu hesabı ödünç alman gerekiyor. Ödünç aldığın hesaba <colored>%3 gün</colored> içinde <colored>%1 Pascal (%2)</colored> gönderirsen, hesap tamamen senin olacak ve hesaptan otomatik olarak <colored>%1 Pascal</colored> ücret kesilecek.\\nAksi takdirde hesap <colored>%3 günün</colored> sonunda bize geri dönecek.\\nHesap tamamen senin olmadan, hesaba fazla miktarda gönderi yapmamanı tavsiye ediyoruz.\",\n  \"importPrivateKeyParagraph\": \"Gizli anahtarını aşağıya gir.\",\n  \"looksLikeEncryptedKeyParagraph\": \"Bu, şifreli bir gizli anahtara benziyor. Şifrelemeyi çözmek ve anahtarı içe aktarmak için şifreni gir.\",\n  \"changeDaemonParagraph\": \"Pascal erişim noktasını değiştirmek için yeni bir erişim noktası gir.\",\n  \"urlChangedToParagraph\": \"URL %1 olarak değiştirildi\",\n  \"backupKeyFirstParagraph\": \"Gizli anahtarını yedeklemek için iki seçeneğin var:\",\n  \"backupKeySecondParagraph\": \"2- Şifreli, yani bir şifre ile korunan.\",\n  \"backupKeyThirdParagraph\": \"2- Ham, yani bir şifre ile korunmayan.\",\n  \"backupKeyFourthParagraph\": \"Anahtarın ham halini bir kağıda yazıp çevrim dışı olarak saklamanı, şifreli halini de kolayca erişebilmen için bir şifre yöneticisinde saklamanı tavsiye ediyoruz.\",\n  \"encryptKeyParagraph\": \"Gizli anahtarını şifrelemek için yeni bir parola oluştur.\",\n  \"backupEncryptedKeyFirstParagraph\": \"Şifreli gizli anahtarını aşağıda görebilirsin. Bir şifre ile korunduğu için, anahtarını güvenle bir şifre yöneticisinde saklayabilirsin.\",\n  \"backupEncryptedKeySecondParagraph\": \"Anahtar şifreli olduğu için, şifreni unutman veya kaybetmen durumunda, şifrelemeyi açıp cüzdanına erişmen mümkün olmayacak.\",\n  \"backupUnencryptedKeyParagraph\": \"Ham gizli anahtarını aşağıda görebilirsin. <colored>Bir şifre ile korunmadığı için, ham anahtarını güvenli ve çevrim dışı bir yerde saklaman çok önemli.</colored> Anahtarını bir kağıda yazarak saklamanı tavsiye ediyoruz.\",\n  \"publicKeyParagraph\": \"Açık anahtarını aşağıda görebilirsin. Bu anahtar, herkese açık şekilde paylaşılmak ve bir operasyonun senin gizli anahtarına ait olduğu kanıtlamak için var.\",\n  \"borrowedAccountParagraph\": \"Bu bir <colored>ödünç hesap</colored>.\\n<colored>%2 gün, %3 saat, %4 dakika içinde bu hesaba en az </colored>%1 Pascal</colored> gönderirsen, hesap senin olacak.\",\n  \"borrowedAccountPaidParagraph\": \"<colored>Hesap satın alındı!</colored>\\nTransfer işlemi şuan devam ediyor. Transfer genellikle <colored>15 dakika</colored>, bazen ise biraz daha uzun sürebilir.\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored>Çıkış yaparsan, gizli anahtarın ve Blaise ile alakalı tüm veriler bu cihazdan silinecek.</colored> Gizli anahtarını yedeklemediysen, cüzdanına ve bakiyene bir daha ulaşamazsın. Yedeklediysen, endişelenecek hiçbir şey yok.\",\n  \"logoutSecondDisclaimerParagraph\": \"Gizli anahtarını yedeklediğine emin misin? <colored>Yedeklediysen endişelenecek bir şey yok.</colored>\",\n  \"sendingConfirmParagraph\": \"Göndermek için işlem detaylarını onayla.\",\n  \"sentParagraph\": \"Gönderme işlemi başarıyla tamamlandı.\",\n  \"changeNameParagraph\": \"Hesap adını değiştirmek için aşağıya yeni bir hesap adı gir.\",\n  \"changingNameParagraph\": \"İlerlemek için hesabın yeni adını onayla.\",\n  \"changedNameParagraph\": \"Hesap adı başarıyla değiştirildi.\",\n  \"transferParagraph\": \"Bu hesabı transfer etmek istediğin açık anahtarı aşağıya gir.\",\n  \"transferringParagraph\": \"Bu hesabı transfer etmek istediğin açık anahtarı onayla.\",\n  \"transferredParagraph\": \"Hesabın aşağıdaki açık anahtara başarıyla transfer edildi.\",\n  \"listForSaleParagraph\": \"Bu hesabı satışa çıkarmak için aşağıya bir fiyat ve ödemeyi alacak hesabı gir.\",\n  \"listingForSaleParagraph\": \"Fiyatı ve ödemeyi alacak hesabı onayla.\",\n  \"listedForSaleParagraph\": \"Hesabın satışa çıkarıldı. Satın alınırsa seni haberdar ederiz.\",\n  \"createPrivateSaleParagraph\": \"Özel satış oluşturmak için fiyatı, ödemeyi alacak hesabı ve müşterinin açık anahtarını gir.\",\n  \"creatingPrivateSaleParagraph\": \"Aşağıdaki bilgileri doğrula.\",\n  \"createdPrivateSaleParagraph\": \"Özel satış başarıyla oluşturuldu. Hesap satın alınırsa seni haberdar ederiz.\",\n  \"delistFromSaleParagraph\": \"Hesabı satıştan kaldırmak istediğini onayla.\",\n  \"delistedFromSaleParagraph\": \"Hesap satıştan başarıyla kaldırıldı.\",\n  \"feeRequiredParagraph\": \"Bu operasyon bir ücret gerektiriyor.\",\n  \"feeConfirmAmountParagraph\": \"Devam etmek için %1 Pascal tutarında bir ücret eklenmesini onayla.\",\n  \"keyTypeNotSupportedParagraph\": \"Blaise henüz bu türdeki gizli anahtarları desteklemiyor. Yeni bir gizli anahtar oluşturup, hesaplarını başka bir cüzdan kullanarak yeni gizli anahtarına transfer edebilirsin.\",\n  \"enterPINToUnlockParagraph\": \"Blaise'i açmak için PIN'i gir\",\n  \"authenticateToUnlockParagraph\": \"Blaise'i açmak için doğrula\",\n  \"manyFailedAttemptsParagraph\": \"Çok fazla başarısız giriş denemesi yapıldı\",\n  \"authenticateToChangeNameParagraph\": \"Hesap adını \\\"%1\\\" olarak değiştirmek için doğrula\",\n  \"authenticateToDelistParagraph\": \"Hesabı satıştan kaldırmak için doğrula\",\n  \"authenticateToListForSaleParagraph\": \"Hesabı satışa çıkarmak için doğrula\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"Özel satış oluşturmak için doğrula\",\n  \"authenticateToTransferParagraph\": \"Hesabı transfer etmek için doğrula\",\n  \"authenticateToSendParagraph\": \"%1 Pascal göndermek için doğrula\",\n  \"authenticateToBackUpParagraph\": \"Gizli anahtarını yedeklemek için doğrula\",\n  \"invalidPINParagraph\": \"Geçersiz PIN\",\n  \"noMatchPINParagraph\": \"PIN'ler uyuşmuyor\",\n  \"confirmPINParagraph\": \"PIN'i onayla\",\n  \"enterPINParagraph\": \"PIN'i gir\",\n  \"createPINParagraph\": \"6 haneli bir PIN oluştur\",\n  \"addedToContactsParagraph\": \"%1 rehbere eklendi\",\n  \"removedFromContactsParagraph\": \"%1 rehberden silindi\",\n  \"failedToRemoveFromContactsParagraph\": \"%1 rehberden silinemedi\",\n  \"successfullyImportedContactsParagraph\": \"%1 kişi rehbere başarıyla eklendi\",\n  \"checkOutBlaiseParagraph\": \"Blaise'i Dene! Sade, şık & güvenli bir Pascal cüzdanı. Hem iOS, hem Android'de: https://blaisewallet.com\",\n  \"newAccountParagraph\": \"Yeni hesabına hoşgeldin.\\n<colored>Pascal</colored> aldığında veya gönderdiğinde, operasyonların aşağıdaki gibi görünecek.\",\n  \"settingsHeader\": \"Ayarlar\",\n  \"preferencesHeader\": \"Tercihler\",\n  \"currencyHeader\": \"Para Birimi\",\n  \"languageHeader\": \"Dil\",\n  \"languageColonHeader\": \"Dil:\",\n  \"systemDefaultHeader\": \"Sistem Varsayılanı\",\n  \"themeHeader\": \"Tema\",\n  \"themeLightHeader\": \"Açık\",\n  \"themeDarkHeader\": \"Koyu\",\n  \"themeCopperHeader\": \"Bakır\",\n  \"notificationsHeader\": \"Bildirimler\",\n  \"securityHeader\": \"Güvenlik\",\n  \"authenticationMethodHeader\": \"Doğrulama Metodu\",\n  \"authenticationPINHeader\": \"PIN\",\n  \"authenticationBiometricsHeader\": \"Biometrik\",\n  \"authenticateOnLaunchHeader\": \"Başlangıçta Doğrula\",\n  \"yesHeader\": \"Evet\",\n  \"noHeader\": \"Hayır\",\n  \"automaticallyLockHeader\": \"Otomatik Kilitle\",\n  \"lockInstantHeader\": \"Hemen\",\n  \"lock1Header\": \"%1 dakika sonra\",\n  \"lock5Header\": \"%1 dakika sonra\",\n  \"lock15Header\": \"%1 dakika sonra\",\n  \"lock30Header\": \"%1 dakika sonra\",\n  \"lock60Header\": \"%1 dakika sonra\",\n  \"daemonHeader\": \"Erişim Noktası\",\n  \"defaultHeader\": \"Varsayılan\",\n  \"manageHeader\": \"Yönet\",\n  \"contactsHeader\": \"Rehber\",\n  \"backUpPrivateKeyHeader\": \"Gizli Anahtarı Yedekle\",\n  \"viewPublicKeyHeader\": \"Açık Anahtarı Görüntüle\",\n  \"shareHeader\": \"Blaise'i Paylaş\",\n  \"logoutHeader\": \"Çıkış\",\n  \"privacyPolicyHeader\": \"Gizlilik Politikası\",\n  \"changeAccountNameHeader\": \"Hesap Adı Değiştir\",\n  \"transferAccountHeader\": \"Hesabı Transfer Et\",\n  \"listAccountForSaleHeader\": \"Hesabı Satışa Çıkar\",\n  \"createPrivateSaleHeader\": \"Özel Satış Oluştur\",\n  \"delistFromSaleHeader\": \"Satıştan Kaldır\",\n  \"getAccountSheetHeader\": \"Hesap Al\",\n  \"freeAccountSheetHeader\": \"Ücretsiz Hesap\",\n  \"buyAccountSheetHeader\": \"Hesap Al\",\n  \"sendSheetHeader\": \"Gönder\",\n  \"sendingSheetHeader\": \"Gönderiliyor\",\n  \"sentSheetHeader\": \"Gönderildi\",\n  \"requestSheetHeader\": \"İste\",\n  \"changeNameSheetHeader\": \"Ad Değiştir\",\n  \"changingNameSheetHeader\": \"Değiştiriliyor\",\n  \"changedNameSheetHeader\": \"Değiştirildi\",\n  \"transferSheetHeader\": \"Transfer Et\",\n  \"transferringSheetHeader\": \"Ediliyor\",\n  \"transferredSheetHeader\": \"Edildi\",\n  \"listForSaleSheetHeader\": \"Satış\",\n  \"listingForSaleSheetHeader\": \"Listeleniyor\",\n  \"listedForSaleSheetHeader\": \"Listelendi\",\n  \"createPrivateSaleSheetHeader\": \"Özel Satış\",\n  \"creatingPrivateSaleSheetHeader\": \"Oluşturuluyor\",\n  \"createdPrivateSaleSheetHeader\": \"Oluşturuldu\",\n  \"delistingSheetHeader\": \"Kaldırılıyor\",\n  \"delistedSheetHeader\": \"Kaldırıldı\",\n  \"addContactSheetHeader\": \"Kişi Ekle\",\n  \"contactSheetHeader\": \"Kişi\",\n  \"publicKeySheetHeader\": \"Açık Anahtar\",\n  \"privateKeySheetHeader\": \"Gizli Anahtar\",\n  \"backUpSheetHeader\": \"Yedekle\",\n  \"encryptSheetHeader\": \"Şifrele\",\n  \"changeDaemonSheetHeader\": \"Erişim Noktası\",\n  \"securityFirstHeader\": \"Önce Güvenlik!\",\n  \"newPrivateKeyHeader\": \"Yeni Gizli Anahtar\",\n  \"importPrivateKeyHeader\": \"Gizli Anahtarı İçe Aktar\",\n  \"decryptAndImportKeyHeader\": \"Şifreyi Aç & İçe Aktar\",\n  \"backUpKeyHeader\": \"Anahtarını Yedekle!\",\n  \"lockedHeader\": \"Kilitli\",\n  \"privateKeyTextFieldHeader\": \"Gizli Anahtar\",\n  \"passwordTextFieldHeader\": \"Şifre\",\n  \"newPasswordTextFieldHeader\": \"Yeni Şifre\",\n  \"confirmPasswordTextFieldHeader\": \"Şifreyi Onayla\",\n  \"confirmTextFieldHeader\": \"Onayla\",\n  \"countryCodeTextFieldHeader\": \"Ülke Kodu\",\n  \"phoneNumberTextFieldHeader\": \"Telefon Numarası\",\n  \"confirmationCodeTextFieldHeader\": \"Onay Kodu\",\n  \"accountTextFieldHeader\": \"Hesap\",\n  \"addressTextFieldHeader\": \"Adres\",\n  \"contactNameTextFieldHeader\": \"Kişi Adı\",\n  \"amountTextFieldHeader\": \"Miktar\",\n  \"payloadTextFieldHeader\": \"Not\",\n  \"nameTextFieldHeader\": \"Ad\",\n  \"newAccountNameTextFieldHeader\": \"Yeni Hesap Adı\",\n  \"publicKeyTextFieldHeader\": \"Açık Anahtar\",\n  \"priceTextFieldHeader\": \"Fiyat\",\n  \"receivingAccountTextFieldHeader\": \"Ödemeyi Alacak Hesap\",\n  \"durationTextFieldHeader\": \"Süre\",\n  \"feeTextFieldHeader\": \"Ücret\",\n  \"otherOperationsHeader\": \"Diğer Operasyonlar\",\n  \"warningHeader\": \"Uyarı\",\n  \"areYouSureHeader\": \"Emin Misin?\",\n  \"addFeeHeader\": \"Ücret Ekle\",\n  \"keyTypeNotSupportedHeader\": \"Anahtar Desteklenmiyor\",\n  \"accountToSendFromHeader\": \"Gönderilecek Hesap\",\n  \"sentHeader\": \"Gönderildi\",\n  \"receivedHeader\": \"Alındı\",\n  \"nameChangedHeader\": \"Ad Değiştirildi\",\n  \"listedForSaleHeader\": \"Satışa Çıkarıldı\",\n  \"privateSaleHeader\": \"Özel Satış\",\n  \"delistedFromSaleHeader\": \"Satıştan Kaldırıldı\",\n  \"delistedHeader\": \"Satıştan Kaldırıldı\",\n  \"undefinedHeader\": \"Tanımsız\",\n  \"transferredHeader\": \"Transfer Edildi\",\n  \"balanceHeader\": \"Bakiye\",\n  \"totalBalanceHeader\": \"Genel Bakiye\",\n  \"accountBalanceHeader\": \"Hesap Bakiyesi\",\n  \"accountsHeader\": \"Hesaplar\",\n  \"operationsHeader\": \"Operasyonlar\",\n  \"encryptThePayloadHeader\": \"Notu Şifrele\",\n  \"encryptPayloadHeader\": \"Notu Şifrele\",\n  \"forSaleHeader\": \"Satılık\",\n  \"borrowedHeader\": \"Ödünç\",\n  \"borrowedTransferredHeader\": \"Transfer Bekleniyor\",\n  \"borrowedAccountHeader\": \"Ödünç Hesap\",\n  \"feeColonHeader\": \"Ücret:\",\n  \"pendingHeader\": \"Bekleniyor\",\n  \"onHeader\": \"Açık\",\n  \"offHeader\": \"Kapalı\",\n  \"priceRequiredError\": \"Fiyat gerekli\",\n  \"amountRequiredError\": \"Miktar gerekli\",\n  \"nameRequiredError\": \"Ad gerekli\",\n  \"zeroPriceError\": \"Fiyat sıfır olamaz\",\n  \"zeroAmountError\": \"Miktar sıfır olamaz\",\n  \"invalidAccountNameError\": \"Geçersiz hesap adı\",\n  \"invalidReceivingAccountError\": \"Geçersiz alıcı hesap\",\n  \"invalidPublicKeyError\": \"Geçersiz açık anahtar\",\n  \"invalidPrivateKeyError\": \"Geçersiz gizli anahtar\",\n  \"invalidAddressError\": \"Geçersiz adres\",\n  \"invalidAccountError\": \"Geçersiz hesap\",\n  \"invalidDestinationError\": \"Geçersiz varış noktası\",\n  \"insufficientBalanceError\": \"Bakiye yetersiz\",\n  \"threeCharacterNameError\": \"En az 3 karakter olmalı\",\n  \"contactDoesntExistError\": \"Kişi bulunamadı\",\n  \"contactAlreadyExistsError\": \"Kişi zaten mevcut\",\n  \"cantSendToYourselfError\": \"Kendine gönderemezsin\",\n  \"somethingWentWrongError\": \"Bir şeyler ters gitti, daha sonra tekrar dene\",\n  \"failedToEncryptPayloadError\": \"Not şifreleme başarısız\",\n  \"emptyPasswordError\": \"Şifre alanı boş olamaz\",\n  \"noMatchPasswordError\": \"Şifreler uyuşmuyor\",\n  \"invalidPasswordError\": \"Geçersiz şifre\",\n  \"didNotGetResponseError\": \"Sunucudan cevap alınamadı\",\n  \"noContactsToExportError\": \"Dışa aktarılacak kişi bulunamadı\",\n  \"noContactsToImportError\": \"İçe aktarılacak kişi bulunamadı\",\n  \"failedToImportContactsError\": \"Kişileri içe aktarma işlemi başarısız\",\n  \"blockchainRewardOPDetails\": \"Blokzinciri Ödülü (%1)\",\n  \"transactionOPDetails\": \"İşlem (%1)\",\n  \"changeKeyOPDetails\": \"Anahtar Değişimi (%1)\",\n  \"recoverFundsOPDetails\": \"Bakiye Kurtarma (%1)\",\n  \"listAccountForSaleOPDetails\": \"Hesap Satışı (%1)\",\n  \"delistAccountOPDetails\": \"Satıştan Kaldırma (%1)\",\n  \"buyAccountOPDetails\": \"Hesap Satın Alımı (%1)\",\n  \"changeKeySignedOPDetails\": \"Anahtar Değişimi (%1)\",\n  \"changeAccountInfoOPDetails\": \"Hesap Bilgisi Değişimi (%1)\",\n  \"multioperationOPDetails\": \"Çoklu Operasyon (%1)\",\n  \"unknownOPDetails\": \"Bilinmeyen (%1)\",\n  \"sendingAccountOPDetails\": \"Gönderici Hesap\",\n  \"receivingAccountOPDetails\": \"Alıcı Hesap\",\n  \"changingAccountOPDetails\": \"Değişen Hesap\",\n  \"sendAmountOPDetails\": \"Gönderi Miktarı\",\n  \"payloadOPDetails\": \"Not\",\n  \"newPublicKeyOPDetails\": \"Yeni Açık Anahtar\",\n  \"newNameOPDetails\": \"Yeni Ad\",\n  \"sellerAccountOPDetails\": \"Satıcı Hesap\",\n  \"accountPriceOPDetails\": \"Hesap Fiyatı\",\n  \"lockedUntilBlockOPDetails\": \"Bu Bloğa Kadar Kilitli\",\n  \"blockOPDetails\": \"Blok\",\n  \"optxtOPDetails\": \"Operasyon Notu\",\n  \"timeOPDetails\": \"Tarih\",\n  \"naOPDetails\": \"Mevcut Değil\",\n  \"ophashOPDetails\": \"Operasyon Hash'i\",\n  \"optypeOPDetails\": \"Operasyon Tipi\",\n  \"maturationOPDetails\": \"Olgunluk\",\n  \"nullOPDetails\": \"Belirsiz\",\n  \"feeOPDetails\": \"Ücret\",\n  \"opblockOPDetails\": \"Bloktaki Sırası\",\n  \"noperationOPDetails\": \"Toplam Operasyon\",\n  \"accountOPDetails\": \"Hesap\",\n  \"signeraccountOPDetails\": \"İmzalayan Hesap\",\n  \"noResultsFound\": \"Sonuç bulunamadı\",\n  \"getAccountThirdParagraphAlternative\": \"<colored>%1 Pascal (%2)</colored> karşılığında bir hesap satın alabilirsin.<colored> Her kullanıcı en fazla 1 adet hesap satın alabilir.</colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"<colored>%1 Pascal (%2)</colored> karşılığında bir hesap satın alabilirsin.<colored> Her kullanıcı en fazla %3 adet hesap satın alabilir.</colored>\",\n  \"receiveAccountButton\": \"Hesap İste\",\n  \"receiveAnAccountButton\": \"Hesap İste\"\n}"
  },
  {
    "path": "lib/l10n/intl_zh-Hans.arb",
    "content": "{\n  \"newPrivateKeyButton\": \"新建私钥\",\n  \"importPrivateKeyButton\": \"导入私钥\",\n  \"gotItButton\": \"确认\",\n  \"goBackButton\": \"返回\",\n  \"copyButton\": \"复制\",\n  \"copiedButton\": \"复制成功\",\n  \"keyCopiedButton\": \"成功复制密钥\",\n  \"iHaveBackedItUpButton\": \"我已做好备份\",\n  \"yesImSureButton\": \"确定\",\n  \"noGoBackButton\": \"返回\",\n  \"getAnAccountButton\": \"获取账号\",\n  \"getAFreeAccountButton\": \"获取免费账号\",\n  \"buyAnAccountButton\": \"购买账号\",\n  \"sendConfirmationButton\": \"确认发送\",\n  \"confirmButton\": \"确认\",\n  \"borrowAnAccountButton\": \"借用账号\",\n  \"importButton\": \"导入\",\n  \"receiveButton\": \"接收\",\n  \"sendButton\": \"发送\",\n  \"copyAddressButton\": \"复制地址\",\n  \"copiedAddressButton\": \"地址复制成功\",\n  \"addToContactsButton\": \"添加到联系人\",\n  \"operationDetailsButton\": \"操作细节\",\n  \"openInExplorerButton\": \"在浏览器中打开\",\n  \"requestButton\": \"请求\",\n  \"addAPayloadButton\": \"+ 添加负载\",\n  \"addADurationButton\": \"+ 添加时长\",\n  \"scanQRCodeButton\": \"扫描二维码\",\n  \"cancelButton\": \"取消\",\n  \"closeButton\": \"关闭\",\n  \"changeNameButton\": \"修改账号名\",\n  \"transferButton\": \"转让账号\",\n  \"listForSaleButton\": \"挂卖账号\",\n  \"createPrivateSaleButton\": \"创建非公开挂卖\",\n  \"yesAddFeeButton\": \"确认添加手续费\",\n  \"unlockButton\": \"解锁\",\n  \"unlockWithBiometricsButton\": \"生物特征解锁\",\n  \"unlockWithPINButton\": \"用识别码解锁\",\n  \"setToDefaultButton\": \"设为默认\",\n  \"changeDaemonButton\": \"更改后台\",\n  \"addContactButton\": \"添加联系人\",\n  \"encryptedKeyButton\": \"显示已加密私钥\",\n  \"unencryptedKeyButton\": \"显示未加密私钥\",\n  \"encryptButton\": \"加密私钥\",\n  \"showButton\": \"显示\",\n  \"hideButton\": \"隐藏\",\n  \"copyEncryptedKeyButton\": \"复制已加密私钥\",\n  \"copyUnencryptedKeyButton\": \"复制原始私钥\",\n  \"copyKeyButton\": \"复制密钥\",\n  \"copyPublicKeyButton\": \"复制公钥\",\n  \"deletePrivateKeyAndLogoutButton\": \"删去私钥\\n并登出\",\n  \"searchForNameButton\": \"搜索名字\",\n  \"searchAccountNameButton\": \"搜索账号名\",\n  \"searchNameButton\": \"搜索名字\",\n  \"okayGoBackButton\": \"返回\",\n  \"nextButton\": \"继续\",\n  \"welcomeParagraph\": \"欢迎使用Blaise钱包。下一步，您可以创建新私钥或导入现有私钥。\",\n  \"newKeySecurityParagraph\": \"接下来您将看到您新建的私钥，请务必将其备份且不要泄露给任何人。\",\n  \"uninstallDisclaimerParagraph\": \"如果您丢失了该设备或者卸载了Blaise钱包，您需要使用私钥来恢复资金。\",\n  \"newPrivateKeyParagraph\": \"以下是您的新钱包私钥。请注意，您必须备份私钥但不要将其备份为纯文本或屏幕截图，我们建议您用笔将其抄写到纸上。\",\n  \"newKeyBackUpConfirmParagraph\": \"您确定已经将新钱包的私钥备份好了吗？\",\n  \"newWalletGreetingParagraph\": \"欢迎使用<colored>Blaise钱包</colored>。\\n您可以从获取一个账号开始\",\n  \"getAccountFirstParagraph\": \"您可以通过两种方式获得账号：\",\n  \"getAccountSecondParagraph\": \"1- 通过手机号码获得账号，<colored>每个手机号码只能获得一个。</colored>\",\n  \"getAccountThirdParagraph\": \"2- 您可以以单价<colored>%1 Pascal (%2)</colored>购买任意数量的账号。\",\n  \"enterPhoneNumberParagraph\": \"在下面输入您的手机号码\",\n  \"enterConfirmationCodeParagraph\": \"请输入您收到的验证码。\",\n  \"borrowStarted\": \"开始购买账号 %1\",\n  \"borrowAccountParagraph\": \"要购买一个帐户，您首先需要免费借用一个。如果您在<colored>%3天</colored>内至少存入<colored>%1 Pascal (%2)</colored>到该账号，该账号将是您的，并且<colored>%1 Pascal</colored>将自动从您的余额中扣除。\\n否则，该账号将在<colored>%3天</colored>结束时返回给我们，不再属于您的钱包。\\n建议您在完全拥有该帐号前只存入少量的Pascal。\",\n  \"importPrivateKeyParagraph\": \"请在下方输入您的私钥：\",\n  \"looksLikeEncryptedKeyParagraph\": \"这看起来像是一个经过加密的私钥，请输入密码以解密并导入它。\",\n  \"changeDaemonParagraph\": \"请输入一个新的后台地址以便进行RPC请求。\",\n  \"urlChangedToParagraph\": \"将URL变更为 %1\",\n  \"backupKeyFirstParagraph\": \"您有两种可选方式来备份私钥：\",\n  \"backupKeySecondParagraph\": \"1- 加密方式。这意味着你的私钥将被密码保护。\",\n  \"backupKeyThirdParagraph\": \"2- 非加密方式。以原始明文方式备份，不通过密码保护。\",\n  \"backupKeyFourthParagraph\": \"我们推荐以非加密方式将私钥抄写到纸上，离线保存。您也可以选择以加密方式将私钥保存到密码管理器中。\",\n  \"encryptKeyParagraph\": \"创建一个密码，用来加密你的私钥。\",\n  \"backupEncryptedKeyFirstParagraph\": \"以下是经过您的密码加密后的私钥。您可以选择将它保存到密码管理器中。\",\n  \"backupEncryptedKeySecondParagraph\": \"由于私钥经过了您的密码加密，如果您丢失或忘记了密码，那么您将无法再访问您的资金。\",\n  \"backupUnencryptedKeyParagraph\": \"以下是您未经加密的原始私钥。<colored>该私钥没有使用密码保护，请务必将其备份到安全且离线的地方。</colored> 我们推荐您将其抄写到纸上。\",\n  \"publicKeyParagraph\": \"以下是您的公钥。顾名思义，它可用作公开共享，并证明某个特定操作属于您的私钥。\",\n  \"borrowedAccountParagraph\": \"这是一个<colored>借用的账号</colored>。\\n如果您在接下来的<colored>%2天 %3时 %4分</colored>内存入<colored>%1 Pascal</colored>到该账号中，您将永远拥有它。\",\n  \"borrowedAccountPaidParagraph\": \"<colored>您已成功购买该账号!</colored>\\n网络正在处理该操作，这个过程大约需要<colored>15分钟</colored>, 在某些情况下，可能需要稍长时间。\",\n  \"logoutFirstDisclaimerParagraph\": \"<colored>登出将会从这个设备删除您的私钥和所有与Blaise钱包相关的数据。</colored>如果您的私钥还未备份，您将永远无法再访问您的资金。如果您的私钥已备份，则无需担心。\",\n  \"logoutSecondDisclaimerParagraph\": \"您确定已经备份了您的私钥吗?<colored>只要您备份了私钥，就没有什么好担心的.</colored>\",\n  \"sendingConfirmParagraph\": \"确认您的交易信息以发送。\",\n  \"sentParagraph\": \"成功发送交易。\",\n  \"changeNameParagraph\": \"在下方输入一个名字来更改您的账号名。\",\n  \"changingNameParagraph\": \"请确认您的新账号名。\",\n  \"changedNameParagraph\": \"您已成功更改账号名。\",\n  \"transferParagraph\": \"在下方输入公钥，将此账号的所有权转移给它。\",\n  \"transferringParagraph\": \"请确认以下公钥，此账号将转移给它。\",\n  \"transferredParagraph\": \"您的帐号已成功转移给下方的公钥。\",\n  \"listForSaleParagraph\": \"请输入该账号的售价和一个用来接收付款的账号。\",\n  \"listingForSaleParagraph\": \"请确认售价和收款账号。\",\n  \"listedForSaleParagraph\": \"您的帐号正式挂牌出售。如果有人买了，我们将会通知您。\",\n  \"createPrivateSaleParagraph\": \"输入售价、收款账号和公钥，以对该账号进行对私出售。\",\n  \"creatingPrivateSaleParagraph\": \"请确认以下信息。\",\n  \"createdPrivateSaleParagraph\": \"对私出售已经成功创建。如果账号被购买了，我们将会通知您。\",\n  \"delistFromSaleParagraph\": \"请确认您想将此帐户从销售列表中下架。\",\n  \"delistedFromSaleParagraph\": \"您的帐户已成功从销售列表中下架。\",\n  \"feeRequiredParagraph\": \"该操作需要手续费。\",\n  \"feeConfirmAmountParagraph\": \"请确认将%1Pascal作为费用以继续此操作。\",\n  \"keyTypeNotSupportedParagraph\": \"Blaise钱包目前还不支持这种类型的私钥。您可以创建一个新的私钥，并使用其它钱包将您的帐户转移给该私钥。\",\n  \"enterPINToUnlockParagraph\": \"输入识别码以解锁\",\n  \"authenticateToUnlockParagraph\": \"验证以解锁钱包\",\n  \"manyFailedAttemptsParagraph\": \"解锁尝试失败次数太多\",\n  \"authenticateToChangeNameParagraph\": \"验证将帐户名称更改为\\\"%1\\\"\",\n  \"authenticateToDelistParagraph\": \"验证以下架正在出售的账号\",\n  \"authenticateToListForSaleParagraph\": \"验证以上架出售账号\",\n  \"authenticateToCreatePrivateSaleParagraph\": \"验证以创建新的私钥\",\n  \"authenticateToTransferParagraph\": \"验证以转移账号\",\n  \"authenticateToSendParagraph\": \"验证以发送%1Pascal\",\n  \"authenticateToBackUpParagraph\": \"验证以备份私钥\",\n  \"invalidPINParagraph\": \"无效的识别码\",\n  \"noMatchPINParagraph\": \"识别码不匹配\",\n  \"confirmPINParagraph\": \"确认您的识别码\",\n  \"enterPINParagraph\": \"请输入输入识别码\",\n  \"createPINParagraph\": \"创建一个6位数的识别码\",\n  \"addedToContactsParagraph\": \"已将%1添加到联系人\",\n  \"removedFromContactsParagraph\": \"已将%1从联系人中删除\",\n  \"failedToRemoveFromContactsParagraph\": \"未能从联系人中删除%1\",\n  \"successfullyImportedContactsParagraph\": \"成功导入%1个联系人\",\n  \"checkOutBlaiseParagraph\": \"了解Blaise，简单、安全又好用的Pascal钱包：https://blaisewallet.com\",\n  \"newAccountParagraph\": \"这是您的新账号。\\n一旦您接收到<colored>Pascal</colored>，操作将如下所示。\",\n  \"settingsHeader\": \"设置\",\n  \"preferencesHeader\": \"偏好\",\n  \"currencyHeader\": \"货币单位\",\n  \"languageHeader\": \"语言\",\n  \"languageColonHeader\": \"语言：\",\n  \"systemDefaultHeader\": \"系统默认\",\n  \"themeHeader\": \"主题\",\n  \"themeLightHeader\": \"高亮\",\n  \"themeDarkHeader\": \"暗色\",\n  \"themeCopperHeader\": \"铜色\",\n  \"notificationsHeader\": \"通知\",\n  \"securityHeader\": \"安全设置\",\n  \"authenticationMethodHeader\": \"验证方式\",\n  \"authenticationPINHeader\": \"识别码\",\n  \"authenticationBiometricsHeader\": \"生物验证\",\n  \"authenticateOnLaunchHeader\": \"启动时要求验证\",\n  \"yesHeader\": \"是\",\n  \"noHeader\": \"否\",\n  \"automaticallyLockHeader\": \"自动锁定\",\n  \"lockInstantHeader\": \"立刻\",\n  \"lock1Header\": \"%1 分钟后\",\n  \"lock5Header\": \"%1 分钟后\",\n  \"lock15Header\": \"%1 分钟后\",\n  \"lock30Header\": \"%1 分钟后\",\n  \"lock60Header\": \"%1 分钟后\",\n  \"daemonHeader\": \"后台设置\",\n  \"defaultHeader\": \"默认\",\n  \"manageHeader\": \"管理\",\n  \"contactsHeader\": \"联系人\",\n  \"backUpPrivateKeyHeader\": \"备份私钥\",\n  \"viewPublicKeyHeader\": \"查看公钥\",\n  \"shareHeader\": \"分享Blaise\",\n  \"logoutHeader\": \"登出\",\n  \"privacyPolicyHeader\": \"隐私政策\",\n  \"changeAccountNameHeader\": \"更改账号名\",\n  \"transferAccountHeader\": \"转让账号\",\n  \"listAccountForSaleHeader\": \"上架出售账号\",\n  \"createPrivateSaleHeader\": \"对私出售该账号\",\n  \"delistFromSaleHeader\": \"取消出售\",\n  \"getAccountSheetHeader\": \"获取一个账号\",\n  \"freeAccountSheetHeader\": \"免费账号\",\n  \"buyAccountSheetHeader\": \"购买账号\",\n  \"sendSheetHeader\": \"发送\",\n  \"sendingSheetHeader\": \"正在发送\",\n  \"sentSheetHeader\": \"已发送\",\n  \"requestSheetHeader\": \"请求\",\n  \"changeNameSheetHeader\": \"更名\",\n  \"changingNameSheetHeader\": \"正在更改\",\n  \"changedNameSheetHeader\": \"已更改\",\n  \"transferSheetHeader\": \"转让\",\n  \"transferringSheetHeader\": \"正在转让\",\n  \"transferredSheetHeader\": \"已转让\",\n  \"listForSaleSheetHeader\": \"上架出售\",\n  \"listingForSaleSheetHeader\": \"上架明细\",\n  \"listedForSaleSheetHeader\": \"成功上架\",\n  \"createPrivateSaleSheetHeader\": \"对私出售\",\n  \"creatingPrivateSaleSheetHeader\": \"创建\",\n  \"createdPrivateSaleSheetHeader\": \"成功创建\",\n  \"delistingSheetHeader\": \"下架\",\n  \"delistedSheetHeader\": \"成功下架\",\n  \"addContactSheetHeader\": \"添加联系人\",\n  \"contactSheetHeader\": \"联系人\",\n  \"publicKeySheetHeader\": \"公钥\",\n  \"privateKeySheetHeader\": \"私钥\",\n  \"backUpSheetHeader\": \"备份\",\n  \"encryptSheetHeader\": \"加密\",\n  \"changeDaemonSheetHeader\": \"更改后台\",\n  \"securityFirstHeader\": \"安全第一\",\n  \"newPrivateKeyHeader\": \"新建私钥\",\n  \"importPrivateKeyHeader\": \"导入私钥\",\n  \"decryptAndImportKeyHeader\": \"解密并导入\",\n  \"backUpKeyHeader\": \"备份您的私钥！\",\n  \"lockedHeader\": \"已锁定\",\n  \"privateKeyTextFieldHeader\": \"私钥\",\n  \"passwordTextFieldHeader\": \"密码\",\n  \"newPasswordTextFieldHeader\": \"新密码\",\n  \"confirmPasswordTextFieldHeader\": \"确认密码\",\n  \"confirmTextFieldHeader\": \"确认\",\n  \"countryCodeTextFieldHeader\": \"国家代码\",\n  \"phoneNumberTextFieldHeader\": \"手机号码\",\n  \"confirmationCodeTextFieldHeader\": \"验证码\",\n  \"accountTextFieldHeader\": \"账号\",\n  \"addressTextFieldHeader\": \"地址\",\n  \"contactNameTextFieldHeader\": \"联系人名字\",\n  \"amountTextFieldHeader\": \"金额\",\n  \"payloadTextFieldHeader\": \"负载\",\n  \"nameTextFieldHeader\": \"名字\",\n  \"newAccountNameTextFieldHeader\": \"新账号名\",\n  \"publicKeyTextFieldHeader\": \"公钥\",\n  \"priceTextFieldHeader\": \"价格\",\n  \"receivingAccountTextFieldHeader\": \"收款账号\",\n  \"durationTextFieldHeader\": \"时长\",\n  \"feeTextFieldHeader\": \"手续费\",\n  \"otherOperationsHeader\": \"其它操作\",\n  \"warningHeader\": \"警告\",\n  \"areYouSureHeader\": \"您确定吗？\",\n  \"addFeeHeader\": \"添加手续费\",\n  \"keyTypeNotSupportedHeader\": \"不被支持的私钥\",\n  \"accountToSendFromHeader\": \"发送账号\",\n  \"sentHeader\": \"已发送\",\n  \"receivedHeader\": \"已收到\",\n  \"nameChangedHeader\": \"更名成功\",\n  \"listedForSaleHeader\": \"上架出售\",\n  \"privateSaleHeader\": \"对私出售\",\n  \"delistedFromSaleHeader\": \"已下架\",\n  \"delistedHeader\": \"已下架\",\n  \"undefinedHeader\": \"未定义操作\",\n  \"transferredHeader\": \"已转让\",\n  \"balanceHeader\": \"余额\",\n  \"totalBalanceHeader\": \"总余额\",\n  \"accountBalanceHeader\": \"账号余额\",\n  \"accountsHeader\": \"账号列表\",\n  \"operationsHeader\": \"操作记录\",\n  \"encryptThePayloadHeader\": \"对负载加密\",\n  \"encryptPayloadHeader\": \"对负载加密\",\n  \"forSaleHeader\": \"代售\",\n  \"borrowedHeader\": \"借用中\",\n  \"borrowedTransferredHeader\": \"处理中的转让\",\n  \"borrowedAccountHeader\": \"借用的账号\",\n  \"feeColonHeader\": \"手续费：\",\n  \"pendingHeader\": \"处理中\",\n  \"onHeader\": \"启用\",\n  \"offHeader\": \"禁用\",\n  \"priceRequiredError\": \"请输入价格\",\n  \"amountRequiredError\": \"请输入金额\",\n  \"nameRequiredError\": \"请输入名字\",\n  \"zeroPriceError\": \"价格不能为0\",\n  \"zeroAmountError\": \"金额不能为0\",\n  \"invalidAccountNameError\": \"无效的账号名\",\n  \"invalidReceivingAccountError\": \"无效的收款账号\",\n  \"invalidPublicKeyError\": \"无效的公钥\",\n  \"invalidPrivateKeyError\": \"无效的私钥\",\n  \"invalidAddressError\": \"无效的地址\",\n  \"invalidAccountError\": \"无效的账号\",\n  \"invalidDestinationError\": \"无效的目标\",\n  \"insufficientBalanceError\": \"余额不足\",\n  \"threeCharacterNameError\": \"账号名最少要三个字符\",\n  \"contactDoesntExistError\": \"联系人不存在\",\n  \"contactAlreadyExistsError\": \"联系人已存在\",\n  \"cantSendToYourselfError\": \"无法发送给自己\",\n  \"somethingWentWrongError\": \"出错了，请稍后再试\",\n  \"failedToEncryptPayloadError\": \"未能成功加密负载\",\n  \"emptyPasswordError\": \"密码不能为空\",\n  \"noMatchPasswordError\": \"密码不匹配\",\n  \"invalidPasswordError\": \"密码无效\",\n  \"didNotGetResponseError\": \"服务器无响应\",\n  \"noContactsToExportError\": \"没有联系人可以导出\",\n  \"noContactsToImportError\": \"没有联系人可以导入\",\n  \"failedToImportContactsError\": \"导入联系人失败\",\n  \"blockchainRewardOPDetails\": \"区块奖励 (%1)\",\n  \"transactionOPDetails\": \"交易 (%1)\",\n  \"changeKeyOPDetails\": \"更改密钥 (%1)\",\n  \"recoverFundsOPDetails\": \"恢复资金 (%1)\",\n  \"listAccountForSaleOPDetails\": \"上架出售账号 (%1)\",\n  \"delistAccountOPDetails\": \"下架账号 (%1)\",\n  \"buyAccountOPDetails\": \"购买账号 (%1)\",\n  \"changeKeySignedOPDetails\": \"签署更改密钥 (%1)\",\n  \"changeAccountInfoOPDetails\": \"更改账号信息 (%1)\",\n  \"multioperationOPDetails\": \"多重操作 (%1)\",\n  \"unknownOPDetails\": \"未知操作 (%1)\",\n  \"sendingAccountOPDetails\": \"发送方账号\",\n  \"receivingAccountOPDetails\": \"收款方账号\",\n  \"changingAccountOPDetails\": \"更改账号\",\n  \"sendAmountOPDetails\": \"发送金额\",\n  \"payloadOPDetails\": \"负载\",\n  \"newPublicKeyOPDetails\": \"新的公钥\",\n  \"newNameOPDetails\": \"新的账号名\",\n  \"sellerAccountOPDetails\": \"卖方账号\",\n  \"accountPriceOPDetails\": \"账号价格\",\n  \"lockedUntilBlockOPDetails\": \"解锁区块\",\n  \"blockOPDetails\": \"区块\",\n  \"optxtOPDetails\": \"操作说明\",\n  \"timeOPDetails\": \"时间戳\",\n  \"naOPDetails\": \"N/A\",\n  \"ophashOPDetails\": \"操作哈希\",\n  \"optypeOPDetails\": \"操作类型\",\n  \"maturationOPDetails\": \"成熟区块\",\n  \"nullOPDetails\": \"空\",\n  \"feeOPDetails\": \"手续费\",\n  \"opblockOPDetails\": \"区块的第几笔操作\",\n  \"noperationOPDetails\": \"操作数\",\n  \"accountOPDetails\": \"账号\",\n  \"signeraccountOPDetails\": \"签署账号\",\n  \"noResultsFound\": \"未找到结果\",\n  \"getAccountThirdParagraphAlternative\": \"2- 您可以花费<colored>%1 Pascal (%2)</colored>购买一个账号。<colored> 每个用户只允许购买一个账号。</colored>\",\n  \"getAccountThirdParagraphAlternative2\": \"2- 您可以花费<colored>%1 Pascal (%2)</colored>购买一个账号。<colored> 您最多可以购买%3个账号。</colored>\",\n  \"receiveAccountButton\": \"接收账号\",\n  \"receiveAnAccountButton\": \"接收一个账号\"\n}"
  },
  {
    "path": "lib/l10n/messages_all.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that looks up messages for specific locales by\n// delegating to the appropriate library.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:implementation_imports, file_names, unnecessary_new\n// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering\n// ignore_for_file:argument_type_not_assignable, invalid_assignment\n// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases\n// ignore_for_file:comment_references\n\nimport 'dart:async';\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\nimport 'package:intl/src/intl_helpers.dart';\n\nimport 'messages_ar.dart' as messages_ar;\nimport 'messages_ca.dart' as messages_ca;\nimport 'messages_de.dart' as messages_de;\nimport 'messages_en.dart' as messages_en;\nimport 'messages_es.dart' as messages_es;\nimport 'messages_messages.dart' as messages_messages;\nimport 'messages_tr.dart' as messages_tr;\nimport 'messages_zh-Hans.dart' as messages_zh_hans;\n\ntypedef Future<dynamic> LibraryLoader();\nMap<String, LibraryLoader> _deferredLibraries = {\n  'ar': () => new Future.value(null),\n  'ca': () => new Future.value(null),\n  'de': () => new Future.value(null),\n  'en': () => new Future.value(null),\n  'es': () => new Future.value(null),\n  'messages': () => new Future.value(null),\n  'tr': () => new Future.value(null),\n  'zh_Hans': () => new Future.value(null),\n};\n\nMessageLookupByLibrary _findExact(String localeName) {\n  switch (localeName) {\n    case 'ar':\n      return messages_ar.messages;\n    case 'ca':\n      return messages_ca.messages;\n    case 'de':\n      return messages_de.messages;\n    case 'en':\n      return messages_en.messages;\n    case 'es':\n      return messages_es.messages;\n    case 'messages':\n      return messages_messages.messages;\n    case 'tr':\n      return messages_tr.messages;\n    case 'zh_Hans':\n      return messages_zh_hans.messages;\n    default:\n      return null;\n  }\n}\n\n/// User programs should call this before using [localeName] for messages.\nFuture<bool> initializeMessages(String localeName) async {\n  var availableLocale = Intl.verifiedLocale(\n    localeName,\n    (locale) => _deferredLibraries[locale] != null,\n    onFailure: (_) => null);\n  if (availableLocale == null) {\n    return new Future.value(false);\n  }\n  var lib = _deferredLibraries[availableLocale];\n  await (lib == null ? new Future.value(false) : lib());\n  initializeInternalMessageLookup(() => new CompositeMessageLookup());\n  messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);\n  return new Future.value(true);\n}\n\nbool _messagesExistFor(String locale) {\n  try {\n    return _findExact(locale) != null;\n  } catch (e) {\n    return false;\n  }\n}\n\nMessageLookupByLibrary _findGeneratedMessagesFor(String locale) {\n  var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor,\n      onFailure: (_) => null);\n  if (actualLocale == null) return null;\n  return _findExact(actualLocale);\n}\n"
  },
  {
    "path": "lib/l10n/messages_ar.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a ar locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'ar';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"رصيد الحساب\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"حساب\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"سعر الحساب\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب لإرسال من\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"الحسابات\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ أضف مدة\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ أضف ملاحظة (Payload)\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"أضف جهة إتصال\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"إضافة جهة إتصال\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"إضافة رسوم\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"أضف إلى جهات الإتصال\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 تم إضافته إلى جهات الإتصال\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"رقم الحساب\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"المبلغ مطلوب\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"المبلغ\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"هل أنت متأكد؟\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"المصادقة عند التشغيل\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لإجراء نسخ احتياطي للمفتاح الخاص\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لتغيير اسم الحساب إلى \\\"%1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لإنشاء بيع خاص\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لحذف الحساب من البيع\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لإدراج الحساب للبيع\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لإرسال %1 باسكال\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لنقل الحساب\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"المصادقة لإلغاء القفل\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"البصمة\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"طريقة المصادقة\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"رمز المرور\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"قفل تلقائي\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"نسخ إحتياطي لمفاتيحك\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"نسخ إحتياطي للمفتاح الخاص\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"نسخ إحتياطي\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدناه هو مفتاحك الخاص المشفر. محمي بكلمة مرور. يمكنك حفظه بأمان على مدير كلمات المرور (باسورد مانجر) لراحتك.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"نظرًا لأنه مشفر بكلمة مرور، إذا فقدت أو نسيت كلمة المرور، فلن تتمكن من فك تشفيره والوصول إلى أموالك.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"لديك خياران لإجراء نسخ احتياطي للمفتاح الخاص:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"نوصي بحفظ النسخة غير المشفرة في وضع عدم الاتصال بالإنترنت (أوفلاين)، عن طريق كتابتها على ورقة، و يمكنك حفظ النسخة المشفرة على مدير كلمات المرور (باسورد مانجر) لراحتك.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1. مشفر، مما يعني أنه محمي بكلمة مرور.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2. غير مشفر، مما يعني أنه خام وغير محمي بكلمة مرور.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"يوجد أدناه مفتاحك الخاص غير المشفر. <colored> ليس محمي بكلمة مرور، مما يعني أنه من الأهمية حفظه في مكان آمن وغير متصل بالإنترنت. </colored>  نوصي بكتابته على ورقة.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"الرصيد\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"كتلة\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"مكافأة البلوكشين (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"لشراء حساب، أولا سوف نعطيك واحد (على سبيل الإعارة)، إذا أرسلت على الأقل <colored>%1 باسكال(%2)</colored> إلى هذا الحساب في خلال <colored>%3 أيام</colored>, الحساب سوف يكون ملكك و <colored>%1 باسكال</colored> سوف تخصم من رصيدك تلقائياً.\\nغير ذلك، سوف نسترد الحساب بعد نهاية <colored>%3 أيام</colored> ولن يكون ملكك.\\nلذلك من المستحسن أولا إرسال مبلغ صغير قبل أن تمتلك الحساب.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"استعر حساباً\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"بدأت عملية الشراء لـ %1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب معار\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>تم شراء الحساب!</colored>\\nنقله إليك قيد المعالجة حاليًا. تستغرق هذه العملية عادةً <colored>15 دقيقة</colored>, في بعض الحالات قد تستغرق وقتا أطول قليلا.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"هذا هو <colored>حساب معار إليك</colored>.\\nإذا أرسلت على الأقل <colored>%1 باسكال</colored> إلى هذا الحساب في خلال <colored>%2 أيام, %3 ساعات, و %4 دقائق</colored>, سوف يكون ملكك.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب معار\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ النقل\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"شراء حساب (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"شراء حساب\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"إشتري حساب\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"إلغاء\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"لا يمكن أن ترسل إلى نفسك\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"تغيير معلومات الحساب (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"تغيير اسم الحساب\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تغيير Daemon\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"تغيير المفتاح (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"تغيير مفتاح التوقيع (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"تغيير الإسم\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل اسمًا أدناه لتغيير اسم الحساب.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تغيير الإسم\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم تغيير اسم حسابك بنجاح.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم التغيير\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"تغيير الحساب\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"تأكيد اسم حسابك الجديد للمتابعة.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ التغيير\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"أنظر، بليز! محفظة \\\"باسكال\\\" بسيطة وأنيقة وآمنة لنظامي أندرويد و آي أو إس: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"إغلاق\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"تأكيد\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"تأكيد رمز المرور\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"تأكيد كلمة المرور\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"تأكيد\"),\n    \"confirmationCodeError\" : MessageLookupByLibrary.simpleMessage(\"فشل التحقق، تأكد من كتابة الرمز المرسل إليك بشكل صحيح\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"كود التفعيل\"),\n    \"connectingHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ الإتصال\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"جهة الاتصال موجود بالفعل\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"جهة الاتصال غير موجودة\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"أسم جهة الإتصال\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جهة إتصال\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"جهات الإتصال\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"تم نسخ الحساب\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"تم النسخ\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ الحساب\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ مفتاح مشفر\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ مفتاح\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ المفتاح عام\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"نسخ مفتاح غير مشفر\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"كود البلد\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"إنشاء 6 أرقام رمز مرور\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"إنشاء بيع خاص\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"إدارج الحساب للبيع الخاص\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل السعر, الحساب الذي سيتلقى الدفع, والمفتاح العام أدناه لإنشاء بيع خاص لهذا الحساب.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"بيع خاص\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم إنشاء البيع الخاص بنجاح. سنخبرك إذا تم شراؤه.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم الإنشاء\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"تأكد من المعلومات أدناه.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"إنشاء\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"العملة\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"فك تشفير & إستيراد\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"إفتراضي\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"احذف المفتاح الخاص\\nوتسجيل خروج\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"إلغاء إدراج الحساب (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"حذف الحساب من البيع\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"تأكد من رغبتك في حذف هذا الحساب من البيع.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"تم حذفه من البيع\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم حذف حسابك من البيع بنجاح.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"تم حذفه\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم الحذف\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ الحذف\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"لم نحصل على استجابة من الخادم\\n\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"المدة\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"كلمة المرور لا يمكن أن تكون فارغة\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"تشفير\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"قم بإنشاء كلمة مرور جديدة لتشفير مفتاحك الخاص.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"تشفير الملاحظة (Payload)\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تشفير\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"تشفير الملاحظة (Payload)\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"مفتاح مشفر\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"لقد أرسلنا لك رمز التأكيد، يرجى إدخاله أدناه.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل رمز المرور\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل رمز المرور لإلغاء القفل\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل رقم تليفونك أدناه.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"فشل في تشفير الملاحظة (Payload)\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"فشل في استيراد جهات الاتصال\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"فشل في إزالة %1 من جهات الإتصال\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"رسوم:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"يرجى تأكيد إضافة رسوم %1 باسكال لهذه العملية للمتابعة.\\n.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"رسوم\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"هذه المعاملة تتطلب رسوم.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"رسوم\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"للبيع\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب مجاني\"),\n    \"freepasaComplete\" : MessageLookupByLibrary.simpleMessage(\"تم بنجاح، حسابك الجديد سيظهر بعد 1 تأكيد من الشبكة\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"أحصل على حساب بالمجان\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"هناك خيارين للحصول على حسابك الأول:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1. يمكنك الحصول على حساب مجاني بإستخدام رقم تليفونك، <colored>فقط حساب واحد لكل رقم تليفون</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"الحصول على حساب\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2. يمكنك شراء حساب/حسابات مقابل <colored>%1 باسكال (%2).</colored>\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2. يمكنك شراء حساب واحد مقابل <colored>%1 باسكال (%2).</colored><colored> مسموح فقط بـ \\\"حساب\\\" واحد لكل مستخدم</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2. يمكنك شراء \\\"حساب\\\" مقابل <colored>%1 باسكال (%2).</colored><colored> يمكنك شراء حتى %3 حساب.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"أحصل على حساب\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"رجوع\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"حصلت عليه!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"إخفي\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"قمت بالنسخ الإحتياطي\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"إستيراد\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"استيراد مفتاح خاص\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"إستيراد مفتاح خاص\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل مفتاحك الخاص أدناه.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"رصيد غير كافي\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"حساب غير صحيح\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"اسم حساب غير صحيح\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"حساب غير صحيح\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"وجهة غير صالحة\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"رمز المرور غير صحيح\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"كلمة مرور خاطئة\"),\n    \"invalidPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"رقم التليفون غير صالح\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"مفتاح خاص غير صالح\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"مفتاح عام غير صالح\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"حساب المستلم غير صحيح\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"تم نسخ المفتاح\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"المفتاح غير مدعوم\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"لا تدعم محفظة بليز هذا النوع من المفاتيح الخاصة. يمكنك إنشاء مفتاح خاص جديد ونقل حساباتك إليه باستخدام محفظة أخرى.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"اللغة:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"اللغة\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"إدراج الحساب للبيع\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"إدراج الحساب للبيع (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"إدراج للبيع\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"لعرض هذا الحساب للبيع، أدخل سعرًا و\\\"الحساب\\\" الذي سيتلقى الدفع.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"إدراج للبيع\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"تم إدراجه للبيع\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم إدراج حسابك للبيع بنجاح. سنخبرك إذا ما قام شخص ما بشرئه.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم الإدراج\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"برجاء تأكيد السعر والحساب الذي سيتلقى الدفع.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ الإدراج\"),\n    \"liveSupportButton\" : MessageLookupByLibrary.simpleMessage(\"مساعدة؟\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"بعد %1 دقائق\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"بعد %1 دقيقة\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"بعد %1 دقائق\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"بعد %1 دقائق\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"بعد %1 دقائق\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"فوراً\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"مقفل\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"مغلق حتى الكتلة\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>سيؤدي تسجيل الخروج إلى إزالة المفتاح الخاص وكافة البيانات المتعلقة بمحفظتك من على هذا الجهاز.</colored> إذا لم يتم عمل نسخة احتياطية من المفتاح الخاص، فلن تتمكن من الوصول إلى أموالك مرة أخرى. إذا قمت بعمل نسخة إحتياطية من مفتاح الخاص، فلا داعي للقلق.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"تسجيل خروج\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"هل أنت متأكد من أنك قمت بعمل نسخة احتياطية من المفتاح الخاص؟ <colored>إذا قمت بعمل نسخة إحتياطية من مفتاحك الخاص، فلا داعي للقلق بشأنه.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"يبدو أن هذا المفتاح الخاص مشفراً، يرجى إدخال كلمة المرور لفك تشفيره واستيراده.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"إدارة\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"محاولات كثيرة فاشلة لإلغاء القفل\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"عملية متعددة (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"غير موجود\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"تم تغيير الإسم\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"الإسم مطلوب\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"إسم\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"إسم الحساب الجديد\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"هذا هو حسابك الجديد.\\nبمجرد أن تستقبل <colored>باسكال</colored>, سوف تظهر العمليات كما موضح أدناه.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"هل متأكد من أنك قمت بعمل نسخة إحتياطية من مفتاحك الخاص في مكان أمن؟\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"في الشاشة التالية، سوف ترى مفتاحك الخاص الجديد، أنه يمثل كل شئ، بدونه أنت لا تملك أموالك، لذلك من الضروري أن تحفظه في مكان أمن، ولا تشاركة مع أحد.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"اسم جديد\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"كلمة مرور جديدة\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"مفتاح خاص جديد\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"مفتاح خاص جديد\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"يوجد أدناه المفتاح الخاص لمحفظتك الجديدة، من الضروري أن تحفظه في مكان أمن ولا تشاركه مع أحد، ولا تقم بأخذ لقطة للشاشة أو تركه في ملف على جهازك، يستحسن أن تكتبه بيدك على ورقة وتحفظة في مكان أمن.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"مفتاح عام جديد\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"مرحباً بك في <colored>محفظة بليز</colored>.\\nيمكنك البدء بالحصول على حساب جديد.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"التالي\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"لا جهات اتصال للتصدير\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"لا يوجد جهات اتصال لاستيرادها\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"لا، رجوع\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"لا\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"رمز المرور غير متطابق\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"كلمات المرور غير متطابقة\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"لا توجد نتائج\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"المعاملات المرسلة\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"الإشعارات\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"لا تعمل\"),\n    \"okayButton\" : MessageLookupByLibrary.simpleMessage(\"موافق\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"موافق، رجوع\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"تعمل\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"افتح في المستكشف\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"تفاصيل العملية\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"العمليات\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"معرف المعاملة\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"معاملات أخرى\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"كلمه مرور\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"ملاحظة (Payload)\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"ملاحظة (Payload)\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"قيد الانتظار\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"رقم التليفون\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"تفضيلات\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"السعر مطلوب\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"السعر\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"سياسة الخصوصية\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"مفتاح خاص\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"مفتاح خاص\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"بيع خاص\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدناه هو المفتاح العام الخاص بك. كما يوحي الاسم، الغرض منه هو المشاركة بشكل عام لإستقبال الحسابات عليه وانتقال ملكيتها للمفتاح الخاص التابع لهذا المفتاح العام.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"مفتاح عام\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"مفتاح عام\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"استلام حساب\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"استلام حساب\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"استلام\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"وأرد\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"الحساب المستقبِل\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"الحساب متلقي الدفع\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"إسترداد الأموال (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم إزالة %1 من جهات الإتصال\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"طلب\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"طلب\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"مسح رمز QR\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"ابحث باسم الحساب\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"بحث عن اسم\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"إبحث عن إسم\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"الأمان أولا!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"الأمان\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"حساب البائع\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"إرسال مبلغ\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"إرسال\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"ارسل تأكيد\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"إرسال\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"الحساب المُرسِل\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"برجاء مراجعة تفاصيل العملية قبل الإرسال.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ الإرسال\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"صادر\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم إرسال العملية بنجاح.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم الإرسال\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"اجعله افتراضيا\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"إعدادات\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"مشاركة بليز\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"اظهر\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"هناك شئ خاطئ، برجاء المحاولة فى وقت لاحق\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم إستيراد %1 جهات إتصال بنجاح\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"إفتراضي النظام\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"نحاسي\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"مظلم\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"المظهر\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"فاتح\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"يجب أن يكون 3 أحرف على الأقل\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"الوقت\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"إجمالي الرصيد\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"العملية (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"نقل ملكية الحساب\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"نقل\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"أدخل \\\"مفتاح عام\\\" أدناه لنقل ملكية هذا الحساب إليه.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"نقل\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"تم نقله\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"تم نقل حسابك بنجاح إلى \\\"المفتاح العام\\\" أدناه.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"تم النقل\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"قم بتأكيد \\\"المفتاح العام\\\" أدناه لنقل ملكية هذا الحساب إليه.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"جارٍ النقل\"),\n    \"unconfirmedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"حساب (لم يتم تأكيده)\"),\n    \"unconfirmedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"هذا <colored>حساب غير مؤكد</colored>. تم نقله إليك، ولكن بإنتظار 1 تأكيد من الشبكة قبل ان تتمكن نم إستخدامه. قد تستغرق هذه العملية 5 دقائق، وعندما تكتمل سيكون بإمكانك استخدام الحساب.\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"غير محدد\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"مفتاح غير مشفر\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"إذا فقدت جهازك أو الغيت تسطيب محفظة بليز، سوف تحتاج للـ \\\"مفتاح الخاص\\\" لكي تستعيد أموالك.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"غير معروف (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"إلغاء قفل\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"إلغاء قفل بالبصمة\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"إلغاء القفل برقم سري\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"URL تم تغييره إلى %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"عرض المفتاح العام\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"تحذير\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"مرحبا بك في محفظة بليز، للبدء، يمكنك إنشاء مفتاح خاص جديد أو إستيراد مفتاح موجود\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"نعم، أضف رسوم\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"نعم\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"نعم، أنا متأكد\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"لا يمكن أن يكون المبلغ 0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"لا يمكن أن يكون السعر 0\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_ca.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a ca locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'ca';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Saldo del compte\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"compte\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Preu del compte\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte per enviar des\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Comptes\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Afegir una Durada\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Afegir un concepte (Payload)\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Afegeix contacte\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Afegeix contacte\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Afegir tarifa\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Afegir a contactes\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"% 1 afegit als contactes\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"adreça\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Quantitat obligatòria\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Import\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"Estàs segur?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Autentica\\'t a Launch\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentiqueu la còpia de seguretat de clau privada\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentica per canviar el nom del compte a \\\"% 1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentiqueu-vos per crear venda privada\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentifica\\'t per eliminar la compte des de la venda\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentica la llista del compte en venda\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentica per enviar% 1 Pascal\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentica la transferència del compte\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autentica per desbloquejar Blaise\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Biometria\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Mètode d\\'autenticació\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Bloquejar automàticament\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Fes una còpia de seguretat de la clau\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Còpia de seguretat de clau privada\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Còpia de seguretat\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuació, trobareu la vostra clau privada xifrada. Està protegit per una contrasenya. Podeu emmagatzemar-lo de forma segura en un gestor de contrasenyes per a la vostra comoditat.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Com que està xifrada amb la vostra contrasenya, si perds o oblides la teva contrasenya, no podràs desxifrar-la ni accedir als teus fons.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Teniu dues opcions per fer una còpia de seguretat de la vostra clau privada:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"Recomanem guardar fora de línia la versió no xifrada, escrivint-la en un tros de paper. Podeu emmagatzemar la versió xifrada en un gestor de contrasenyes per a la vostra comoditat.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Encriptat, el que significa que està protegit amb una contrasenya.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- No xifrat, cosa que significa que és brut i no protegit per una contrasenya.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuació, trobareu la vostra clau privada sense xifrar. <colored> No està protegit per una contrasenya, cosa que significa que és important guardar-la en algun lloc segur i fora de línia. </colored> Recomanem escriure-la en un tros de paper.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Equilibri\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"bloc\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recompensa Blockchain (% 1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Per comprar un compte, primer haurà de demanar un préstec gratuït. Si envieu almenys <colored>% 1 Pascal (% 2) </colored> al compte dins de <colored>% 3 dies </colored>, el compte serà vostre i <colored>% 1 Pascal </colored> es descomptarà automàticament del vostre saldo. \\n En cas contrari, ens retornarà al final de <colored>% 3 dies </colored> i ja no pertanyrà a la vostra cartera. \\n Es recomana només envieu una petita quantitat de monedes fins que no teniu el compte.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Elimina un compte\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"S\\'ha iniciat la compra per a% 1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte prestat\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored> El vostre compte s\\'ha comprat! </colored> \\n La transferència es processa actualment. Aquest procés sol durar uns 15 minuts <colored> </colored>, en alguns casos pot trigar una mica més.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aquest és un <colored> compte prestat </colored>. \\n Si li envieu almenys <colored>% 1 Pascal </colored> en els següents <colored>% 2 dies,% 3 hores i% 4 minuts </colored>, ja serà teu.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"Prestat\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferència pendent\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Compra del compte (% 1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Compra el compte\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Comprar un compte\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"Cancel·lar\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"No es pot enviar a tu mateix\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Canvia la informació del compte (% 1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Canvieu el nom del compte\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Canvia de servidor\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu una adreça per utilitzar un dimoni Pascal diferent per a sol·licituds RPC.\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Canvia de dimoni\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Canvia la clau (% 1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Canvia la signada amb clau (% 1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Canviar el nom\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu un nom a continuació per canviar el nom del vostre compte.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Canvieu el nom\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"El vostre nom del compte s\\'ha canviat correctament.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Canviat\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Canvi de compte\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu el nom del compte nou per continuar.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Canviant\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"Fes una ullada a Blaise! Cartera de Pascal senzilla, elegant i segura per a iOS i Android: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Tanca\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Confirmar\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu el PIN\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirma la contrassenya\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu\"),\n    \"confirmationCodeError\" : MessageLookupByLibrary.simpleMessage(\"No s\\'ha pogut verificar el codi, assegureu-vos que l\\'heu introduït correctament\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Codi de confirmació\"),\n    \"connectingHeader\" : MessageLookupByLibrary.simpleMessage(\"Connectant\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"El contacte ja existeix\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"El contacte no existeix\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nom de contacte\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Contacte\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Contactes\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Adreça copiada\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Copiat\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar adreça\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Còpia\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copia la clau xifrada\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copia la clau privada\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copia la clau pública\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copia la clau sense xifrar\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Codi del país\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Creeu un PIN de 6 dígits\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Crear una venda privada\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Crea venda privada\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu un preu, un compte de recepció i una clau pública a continuació per crear una venda privada per a aquest compte.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Venda privada\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"La venda privada s\\'ha creat correctament. Us informarem si es compra.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creat\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu la informació següent.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creació\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Moneda\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Dimoni\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Desxifra i importa\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Per defecte\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Suprimeix la clau privada\\nTanca la sessió\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Suprimeix el compte (% 1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Elimina la venda\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu que voleu suprimir aquest compte des de la venda.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Eliminat de la venda\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"El vostre compte s\\'ha suprimit correctament de la venda.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Suprimit\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Suprimit\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Suprimint\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"No s\\'ha obtingut resposta del servidor\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Durada\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"La contrasenya no pot estar buida\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Xifra\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Creeu una contrasenya nova per xifrar la vostra clau privada.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Xifra la càrrega útil\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Xifra\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Xifra la càrrega útil\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Clau xifrada\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Us hem enviat un codi de confirmació, introduïu-lo a continuació.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu el PIN\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu el PIN per desbloquejar Blaise\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu el vostre número de telèfon a continuació.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"No s\\'ha pogut xifrar la càrrega útil\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"No s\\'ha pogut importar contactes\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"No s\\'ha pogut eliminar% 1 dels contactes\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Taxa:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Per confirmar l’addició de taxa de Pascal% 1 a aquesta operació per continuar.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"quota\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aquesta operació requereix un cànon.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Comissió\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"A la venda\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte gratuït\"),\n    \"freepasaComplete\" : MessageLookupByLibrary.simpleMessage(\"Amb èxit, el nou compte estarà disponible després de 1 confirmació de xarxa\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Obtenir un compte gratuït\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hi ha dues opcions per obtenir el teu primer compte:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Podeu obtenir un compte gratuït mitjançant el vostre número de telèfon. <colored> Només es permet un compte per número de telèfon. </colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Obtén un compte\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Podeu comprar tants comptes com vulgueu per <colored>% 1 Pascal (% 2). </colored>\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- Podeu comprar un compte per a <colored>% 1 Pascal (% 2). </colored> <colored> Comprar només un compte està permès per usuari. </colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- Podeu comprar un compte per a <colored>% 1 Pascal (% 2). </colored> <colored> Podeu comprar fins a% 3 comptes. </colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Obtenir un compte\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Torna\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"Ho tinc!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Amaga\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"Copia realitzada\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"Importa\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Importa clau privada\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Importa clau privada\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu la vostra clau privada a continuació.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Saldo insuficient\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Compte no vàlid\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"El nom del compte no és vàlid\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Adreça no vàlida\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Destinació no vàlida\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN no vàlid\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Contrasenya invàlida\"),\n    \"invalidPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"El número de telèfon no és vàlid\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Clau privada no vàlida\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Clau pública no vàlida\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Compte de recepció no vàlid\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Clau copiada\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Clau no compatible\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aquest tipus de clau privada encara no és compatible amb Blaise. Podeu crear una clau privada nova i transferir-ne els comptes mitjançant una cartera diferent.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Llenguatge:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Llenguatge\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Llista de compte en venda\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Llista del compte en venda (% 1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Posar a la venda\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu un preu i un compte que rebran el pagament per llistar aquest compte per vendre.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Llistat en venda\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Llistat en venda\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"El vostre compte s\\'ha llistat amb èxit per a la venda. Us informarem si algú la compra.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Enumerat\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu el preu i el compte que rebrà el pagament.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Llistat\"),\n    \"liveSupportButton\" : MessageLookupByLibrary.simpleMessage(\"Assistència\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"Després de% 1 minuts\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"Després de% 1 minut\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"Després de% 1 minuts\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"Després de% 1 minuts\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"Després de% 1 minuts\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Instantàniament\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Bloquejat\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bloquejat fins el bloc\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored> En tancar la sessió, suprimireu la clau privada i totes les dades relacionades amb Blaise d\\'aquest dispositiu. </colored> Si la vostra clau privada no està feta una còpia de seguretat, no podreu tornar a accedir als vostres fons. Si hi ha una còpia de seguretat de la teva clau privada, no et preocuparà res.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Tancar sessió\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Esteu segur que heu fet una còpia de seguretat de la vostra clau privada? <colored> Sempre que hàgiu fet una còpia de seguretat de la vostra clau privada, no us haureu de preocupar. </colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Sembla que una clau privada xifrada, introduïu la contrasenya per desxifrar-la i importar-la.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Gestiona\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Massa intents fallits de desbloqueig\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"maduració\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Multioperació (% 1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"N / A\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Canviat el nom\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"El seu nom és obligatori\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nom\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nou nom del compte\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aquest és el vostre nou compte. \\n Un cop rebut <colored> Pascal </colored>, les operacions es mostraran com a continuació.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Esteu segur que heu creat una còpia de seguretat de la clau privada de la nova billetera?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"A la pantalla següent, veureu la vostra clau privada nova. És una contrasenya per accedir als vostres fons. És fonamental que el feu una còpia de seguretat i no el compartiu mai amb ningú.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Nou nom\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"nova contrasenya\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Nova clau privada\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Nova clau privada\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuació, es mostra la clau privada de la nova cartera. És fonamental que feu una còpia de seguretat de la clau privada i no la guardeu mai com a text de pantalla o captura de pantalla. Recomanem escriure-la en un tros de paper i guardar-la fora de línia.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Nova clau pública\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"Benvingut a <colored> Blaise Wallet </colored>. \\n Podeu començar obtenint un compte.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"Pròxim\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"No hi ha contactes per exportar\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"No hi ha contactes a importar\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"No, torna enrere\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"No\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Els PIN no coincideixen\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Les contrasenyes no coincideixen\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"Sense resultats\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"n_operació\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Notificacions\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"nul\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Desactivat\"),\n    \"okayButton\" : MessageLookupByLibrary.simpleMessage(\"Bé\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"D\\'acord, torna\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"Encès\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"opbloquejar\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Obriu a l\\'Explorador\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Detalls de l\\'operació\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Operacions\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"ophash\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optxt\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"òptic\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Altres operacions\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Contrasenya\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Càrrega útil\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Càrrega útil\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"Pendents\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Número de telèfon\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Preferències\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"El preu és obligatori\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Preu\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Política de privacitat\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Clau privada\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Clau privada\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Venda privada\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuació, es mostra la vostra clau pública. Com el seu nom indica, es pretén compartir públicament i demostrar que una operació particular pertany a la vostra clau privada.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Clau pública\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Clau pública\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Rep el compte\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Rebre un compte\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"Rebre\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Rebut\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Compte de recepció\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte de recepció\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recuperació de fons (% 1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"S\\'ha eliminat% 1 dels contactes\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"Sol·licitud\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sol·licitud\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"Escaneig del codi QR\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Cerca el nom del compte\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Buscar nom\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Nom de la cerca\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"Seguretat primer!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Seguretat\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Compte del venedor\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Enviar import\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Enviar\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Confirmar l\\'enviament\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Envia\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Compte enviant\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu les dades de la transacció a enviar.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"S\\'està enviant\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviat\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"La transacció s\\'ha enviat correctament.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviat\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Establir a valors predeterminats\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Configuració\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Comparteix Blaise\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Mostra\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"signer_account\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Alguna cosa ha anat malament. Si us plau torna-ho a intentar després\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"% 1 contactes importats amb èxit\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Predeterminat del sistema\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Coure\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Fosc\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Tema\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Llum\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"Ha de tenir com a mínim 3 caràcters\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"temps\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Saldo total\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Transacció (% 1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte de transferència\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Transferència\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduïu una clau pública a continuació per transferir-hi la propietat d’aquest compte.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferència\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Traspassat\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"El vostre compte s\\'ha transferit correctament a la clau pública següent.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Traspassat\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirmeu la clau pública següent per transferir-hi la propietat d’aquest compte.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferència\"),\n    \"unconfirmedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Compte no confirmat\"),\n    \"unconfirmedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aquest és un <colored> compte no confirmat </colored>. S\\'ha transferit a tu, però abans de poder utilitzar-lo cal que existeixi una confirmació de xarxa. Generalment triguen uns 5 minuts, un cop finalitzat, podreu utilitzar aquest compte.\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Indefinit\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Clau no xifrada\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Si perdeu el dispositiu o desinstalgeu Blaise Wallet, necessitareu la clau privada per recuperar els vostres fons.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Desconegut (% 1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquejar\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquejar amb Biometrics\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquegeu amb el PIN\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"L\\'URL s\\'ha canviat a% 1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Veure clau pública\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Avís\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Benvingut a la cartera Blaise. Per començar, podeu crear una clau privada o importar-ne una.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Sí, afegeix comissió\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Sí\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Sí, n\\'estic segur\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"La quantitat no pot ser 0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"El preu no pot ser 0\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_de.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a de locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'de';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontostand\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto Preis\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Absender\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Konten\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Dauer festlegen\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Betreff festlegen\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Kontakt hinzufügen\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontakt hinzufügen\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Gebühr hinzufügen\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Zu Kontakten hinzufügen\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 zu den Kontakten hinzugefügt\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontonummer\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Betrag wird benötigt\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Betrag\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"Bist Du sicher?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Anmelden bei Start\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um den privaten Schlüssel zu sichern\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um den Namen des Kontos auf \\\"%1\\\" zu ändern\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um Konto privat zu verkaufen\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um den Konto-Verkauf abzubrechen\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um Konto zu verkaufen\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um %1 Pascal zu senden\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anmelden um Konto zu übertragen\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authentifizieren um die Blaise Wallet zu entsperren\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Biometrie\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Authentifizierung\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Automatisch sperren\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Schlüssel gesichert?\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Privaten Schlüssel sichern\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sicherung\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hier ist Dein mit einem Passwort chiffrierter privater Schlüssel. Du kannst Ihn problemlos in einem Passwort Manager speichern.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Wenn Du das Passwort vergisst oder verlierst, kannst Du nicht mehr auf Deine Pascal zugreifen.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Du hast 2 Möglichkeiten, um Deinen privaten Schlüssel zu sichern:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"Wir empfehlen Dir, die nicht chiffrierte Version des Schlüssels auf einem Blatt Papier zu notieren. Die chiffrierte Version kann in einem Passwort Manager gespeichert werden.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Chiffrieren mit Hilfe eines Passworts\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Nicht chiffriert, im Klartext und ungeschützt\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Nachfolgend siehst Du Deinen privaten Schlüssel. <colored>Dieser ist nicht mit einem Passwort geschützt, deshalb ist es zwingend erforderlich, dass Du ihn sicher offline verwahrst!</colored> Wir empfehlen ihn auf Papier zu notieren.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Saldo\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Block\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Blockchain Reward (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Um ein Konto zu kaufen, musst Du Dir zu Beginn eines ausleihen. Wenn Du innerhalb von <colored>%3 Tage(n)</colored> mindestens <colored>%1 Pascal (%2)</colored> an das geliehene Konto überweist, gehört es Dir und der Betrag von <colored>%1 Pascal</colored> wird automatisch abgezogen.\\nAnsonsten geht das geliehene Konto nach <colored>%3 Tage(n)</colored> an uns zurück und ist nicht mehr Teil Deiner Wallet.\\nWir empfehlen Dir, nicht zu große Beträge an das Konto zu senden, solange es nicht Dir gehört.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Konto leihen\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"Konto-Kauf für %1 gestartet\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Geliehenes Konto\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Du hast das Konto gekauft!</colored>\\nDie Übertragung läuft gerade. Dieser Vorgang dauert ungefähr <colored>15 Minuten</colored>, manchmal kann es auch etwas länger dauern. Bitte habe ein wenig Geduld, Du kannst in Kürze loslegen.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Dies ist ein <colored>geliehenes Konto</colored>.\\nWenn Du in den nächsten <colored>%2 Tage(n), %3 Stunde(n) und %4 Minute(n)</colored> mindestens <colored>%1 Pascal</colored> an das Konto sendest gehört es Dir!\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"geliehen\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Übertragung wartend\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto gekauft (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto kaufen\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Konto kaufen\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"Abbrechen\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"Du kannst nicht an dich selbst senden\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto Daten geändert (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto Name ändern\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Server wechseln\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage eine Adresse zu einem anderen Pascal-Server ein\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Server wechseln\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto-Übertragung (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Fremde Konto-Übertragung (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Name ändern\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage einen neuen Namen für Dein Konto ein.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Name ändern\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Der Name des Kontos wurde erfolgreich geändert.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Geändert\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Ändere Konto\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige den neuen Namen für Dein Konto.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Speichere\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"Schau Dir Blaise an! Die sichere und einfach zu bedienende Pascal Wallet für iOS und Android: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Schließen\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Bestätigen\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN bestätigen\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Passwort bestätigen\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Bestätigen\"),\n    \"confirmationCodeError\" : MessageLookupByLibrary.simpleMessage(\"Der Code war falsch, bitte probiere es erneut\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Bestätigungs-Code\"),\n    \"connectingHeader\" : MessageLookupByLibrary.simpleMessage(\"Verbinde\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"Kontakt existiert bereits\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"Kontakt existiert nicht\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Name\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontakt\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontakte\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Kontonummer kopiert\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Kopiert\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Kontonummer kopieren\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Kopieren\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Kopieren\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Kopieren\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Öffentlichen Schlüssel kopieren\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Kopieren\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Länder-Code\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"6-stellige PIN erstellen\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Private verkaufen\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Privat verkaufen\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage den Preis, den Empfänger des Kaufpreises und den öffentlichen Schlüssel ein, um das Konto Privat zu verkaufen.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Privatverkauf\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Das Konto steht jetzt zum privaten Verkauf. Sobald es gekauft wurde sagen wir Dir Bescheid.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Erstellt\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige die folgenden Angaben.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Erstelle\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Währung\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Server\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Entschlüsseln und importieren\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Standard\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Privaten Schlüssel löschen\\nund abmelden\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Verkauf abgebrochen (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkauf stoppen\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige den Abbruch des Konto-Verkaufs.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkauf abgebrochen\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Der Verkauf wurde erfolgreich abgebrochen.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkauf abgebrochen\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkauf abgebrochen\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Breche Verkauf ab\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"Der Server antwortet nicht\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Dauer\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Das Passwort darf nicht leer sein\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Verschlüsseln\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Neues Passwort erstellen um den privaten Schlüssel verschlüsseln.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Betreff verschlüsseln\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Verschlüsseln\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Betreff verschlüsseln\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Chiffrierter Schlüssel\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Wir haben Dir einen Bestätigungs-Code gesendet. Bitte hier eintragen.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN eintragen\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN eintragen um die Blaise Wallet zu entsperren\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage Deine Telefonnummer hier ein.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"Fehler beim verschlüsseln des Betreffs\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"Fehler beim importieren der Kontakte\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Fehler beim entfernen von %1 aus den Kontakten\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Gebühr:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige, dass %1 Pascal als Gebühr hinzugefügt werden.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Gebühr\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Für diesen Vorgang wird eine Gebühr benötigt.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Gebühr\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"zu verkaufen\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kostenfreies Konto\"),\n    \"freepasaComplete\" : MessageLookupByLibrary.simpleMessage(\"Dein neues Konto wird nach dem nächsten Block zur Verfügung stehen\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Kostenloses Konto erhalten\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Es gibt 2 Möglichkeiten, um Dein erstes Konto erhalten:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Du kannst ein kostenfreies Konto mit Hilfe Deiner Telefonnummer erhalten. <colored>Nur 1 Konto pro Telefonnummer erlaubt.</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto anlegen\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Du kannst beliebig viele Konten für eine Gebühr von <colored>%1 Pascal (%2)</colored> erwerben.\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- Du kannst ein Konto für <colored>%1 Pascal (%2)</colored> kaufen.<colored> Der Blaise-Service erlaubt den Erwerb von einem Konto pro Benutzer. Im Normalfall brauchst Du auch nur eins.</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- Du kannst ein Konto für <colored>%1 Pascal (%2)</colored> kaufen.<colored> Der Blaise-Service erlaubt den Erwerb von 3 Konten pro Benutzer. Im Normalfall brauchst Du lediglich eins.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Konto anlegen\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Zurück\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"Verstanden!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Verstecken\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"Ich habe ihn gesichert\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"Importieren\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Schlüssel importieren\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Schlüssel importieren\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage Deinen privaten Schlüssel ein\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger Betrag\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiges Konto\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger Konto Name\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiges Konto\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger Empfänger\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ungültige PIN\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Falsches Passwort\"),\n    \"invalidPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Keine valide Telefonnummer\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger privater Schlüssel\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger öffentl. Schlüssel\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Ungültiger Empfänger\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Schlüssel kopiert\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Schlüssel nicht unterstützt\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"Dieser Schlüssel-Typ wird leider nicht unterstützt. Du kannst einen neuen privaten Schlüssel anlegen und das Konto mit Hilfe einer anderen Wallet auf diesen übertragen.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Sprache:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Sprache\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto verkaufen\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto zum Verkauf (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Verkaufen\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage 1. den Kaufpreis und 2. den Empfänger des Kaufpreises für dieses Konto ein.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkaufen\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Zu verkaufen\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Das Konto steht jetzt zum Verkauf. Sobald es gekauft wurde sagen wir Dir Bescheid.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Zum Verkauf gelistet\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige den Betrag und den Empfänger der Überweisung.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Verkaufen\"),\n    \"liveSupportButton\" : MessageLookupByLibrary.simpleMessage(\"Hilfe\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"Nach %1 Minuten\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"Nach %1 Minute\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"Nach %1 Minuten\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"Nach %1 Minuten\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"Nach %1 Minuten\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Sofort\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Gesperrt\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Gesperrt bis Block\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Wenn Du dich abmeldest, werden Deine Schlüssel und alle Blaise bezogenen Daten von diesem Gerät gelöscht.</colored> Hast Du Deinen privaten Schlüssel gesichert? Wenn nicht, wirst Du alles verlieren. Wenn ja, brauchst Du Dir keine Sorgen zu machen.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Abmelden\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bist Du Dir sicher, dass Du Deinen privaten Schlüssel gesichert hast? <colored>Wenn ja, brauchst Du Dir keine Sorgen zu machen.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Siehst aus als wäre der private Schlüssel chiffriert. Bitte trage das Passwort zum dechiffrieren ein\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Verwalten\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Zu viele fehlgeschlagene Entsperrversuche\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Alter (in Blöcken)\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Multi-Vorgang (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"n.a.\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Name geändert\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Name wird benötigt\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Name\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Neuer Konto Name\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Dies ist Dein neues Konto. \\nSobald Du <colored>Pascal</colored> empfängst oder sendest, werden die Überweisungen hier aufgelistet.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hast Du Deinen privaten Schlüssel wirklich gesichert?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"Im nächsten Schritt siehst Du Deinen privaten Schlüssel. Mit diesem Schlüssel hast Du Zugriff auf Deine Pascal. Es ist wichtig, dass Du diesen Schlüssel sicherst und mit niemanden teilst!\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Neuer Name\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Neues Passwort\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Neuer privater Schlüssel\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Neues Schlüsselpaar\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Nachfolgend findest Du Deinen neuen privaten Schlüssel. Es ist unbedingt erforderlich, dass Du diesen sicherst - aber bitte nicht als Screenshot oder in Klartext auf Deinem Computer oder Smartphone. Wir empfehlen Dir ihn auf einem Blatt Papier zu notieren.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Neuer öffentl. Schlüssel\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"Willkommen bei der <colored>Blaise Wallet</colored>.\\n Zum Start musst Du Dir ein Konto anlegen.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"Weiter\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"Keine Kontakte zum exportieren\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"Keine Kontakte zum importieren\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Nein, zurück\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"Nein\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Die PINs stimmen nicht überein\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Die Passwörter stimmen nicht überein\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"Keine Ergebnisse\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Konto Vorgangsnummer\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Benachrichtigungen\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"null\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Aus\"),\n    \"okayButton\" : MessageLookupByLibrary.simpleMessage(\"Okay\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Okay, zurück\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"An\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Position in Block\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Im explorer anzeigen\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Vorgangs-Details\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Vorgänge\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Vorgangs-Prüfsumme\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Vorgangs-Info\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Vorgangstyp\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Andere Vorgänge\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Passwort\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Betreff\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Betreff\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"ausstehend\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Telefon-Nummer\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Konfiguration\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Preis wird benötigt\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Preis\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Datenschutzrichtlinie\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Privater Schlüssel\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Privater Schlüssel\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Privater Verkauf\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Nachfolgend siehst Du Deinen öffentlichen Schlüssel, der mit jedem geteilt und zur Verifizierung Deiner Vorgänge genutzt werden kann.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Öffentlicher Schlüssel\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Öffentlicher Schlüssel\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Konto erhalten\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Ein Konto erhalten\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"Empfangen\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Empfangen\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Empfänger\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Empfänger\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recover Funds (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 aus den Kontakten entfernt\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"Anfrage\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Anfragen\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"QR Code scannen\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Suche Name\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Suche nach Namen\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Suche Name\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"Sicherheit zuerst!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Sicherheit\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Verkäufer\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Betrag senden\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Senden\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Bestätigung senden\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Senden\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Absender\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige die Überweisungsdaten.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sende\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Gesendet\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"Die Überweisung wurde erfolgreich ausgeführt.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Gesendet\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Zurücksetzen\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Einstellungen\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Blaise teilen\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Anzeigen\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Signierer\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Etwas ist schief gelaufen, probiere es später erneut\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 Kontakte erfolgreich importiert\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Standard\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Kupfer\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Dunkel\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Thema\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Hell\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"Muss aus mindestens 3 Zeichen bestehen\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Zeitpunkt\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Kontostand aller Konten\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Überweisung (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Konto übertragen\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Übertragen\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Trage nachfolgend den öffentl. Schlüssel ein, an den das Konto übertragen wird.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Übertragen\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Übertragen\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Dein Konto wurde erfolgreich an den folgenden öffentl. Schlüssel übertragen.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Übertragen\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bitte bestätige den nachfolgenden öffentl. Schlüssel, um das Konto zu übertragen.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Übertrage\"),\n    \"unconfirmedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Noch nicht bestätigtes Konto\"),\n    \"unconfirmedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Dies ist ein <colored>nicht bestätigtes Konto</colored>. Es wurde Dir bereits zugeordnet, aber Du musst noch einen Block lang warten. Das dauert in der Regel ungefähr 5 Minuten. Sobald der Block abgeschlossen ist, hast Du vollen Zugriff auf dieses Konto.\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Unbekannt\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Klartext Schlüssel\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Wenn Du Dein Gerät verlierst oder die Blaise Wallet deinstallierst, brauchst Du Deinen privaten Schlüssel für die Wiederherstellung.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Unbekannt (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Entsperren\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Mit Biometrie entsperren\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"Mit PIN entsperren\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"Pascal-Server geändert zu %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Öffentlichen Schlüssel anzeigen\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Warnung\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Willkommen bei der Blaise Wallet. Um zu starten musst Du entweder einen neuen privaten Schlüssel generieren oder einen bestehenden importieren.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Ja, Gebühr hinzufügen\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Ja\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Ja, ich bin sicher\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"Betrag kann nicht 0 sein\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"Preis kann nicht 0 sein\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_en.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a en locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'en';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Account Balance\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"account\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Account Price\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Account\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Account to Send From\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Accounts\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Add a Duration\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Add a Payload\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Add Contact\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Add Contact\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Add Fee\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Add to Contacts\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 added to contacts\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Address\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Amount is required\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Amount\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"Are You Sure?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Authenticate on Launch\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to back up private key\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to change account name to \\\"%1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to create private sale\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to delist the account from sale\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to list account for sale\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to send %1 Pascal\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to transfer account\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to Unlock Blaise\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Biometrics\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Authentication Method\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Automatically Lock\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up Your Key!\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up Private Key\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your encrypted private key. It is protected by a password. You can store it safely on a password manager for your convenience.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Since it is encrypted with your password, if you lose or forget your password, you won\\'t be able to decrypt it and access your funds.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"You have 2 options for backing up your private key:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"We recommend storing the unencrypted version offline, by writing it on a piece of paper. You can store the encrypted version on a password manager for your convenience.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Encrypted, which means it is protected by a password.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Unencrypted, which means it is raw and not protected by a password.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your unencrypted private key. <colored>It is not protected by a password, which means it is crucial that you store it somewhere safe and offline.</colored> We recommend writing it on a piece of paper.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Balance\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"block\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Blockchain Reward (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"To buy an account, first you’ll need to borrow one for free. If you send at least <colored>%1 Pascal (%2)</colored> to the account within <colored>%3 days</colored>, the account will be yours and <colored>%1 Pascal</colored> will be deducted from your balance automatically.\\nOtherwise, it’ll return back to us at the end of <colored>%3 days</colored> and won’t belong to your wallet anymore.\\nIt is recommended you only send a small amount of coins until you own the account.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Borrow An Account\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"Purchase Started for %1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Borrowed Account\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Your account has been purchased!</colored>\\nThe transfer is currently processing. This process usually takes about <colored>15 minutes</colored>, in some cases it may take slightly longer.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is a <colored>borrowed account</colored>.\\nIf you send at least <colored>%1 Pascal</colored> to it in the next <colored>%2 days, %3 hours, and %4 minutes</colored>, it’ll be yours.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"Borrowed\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Pending\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Buy Account (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Buy Account\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Buy an Account\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"Cancel\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"Can\\'t send to yourself\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change Account Info (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Account Name\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Change Daemon\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter an address to use a different Pascal daemon for RPC requests.\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Daemon\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change key (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change Key Signed (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Change Name\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a name below to change your account\\'s name.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Name\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account name has been changed successfully.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Changed\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Changing Account\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm your new account name to proceed.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Changing\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"Check out Blaise! Simple, sleek & secure Pascal wallet for iOS and Android: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Close\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Confirm\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm your PIN\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirm Password\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirm\"),\n    \"confirmationCodeError\" : MessageLookupByLibrary.simpleMessage(\"Failed to verify code, ensure you\\'ve entered it correctly\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirmation Code\"),\n    \"connectingHeader\" : MessageLookupByLibrary.simpleMessage(\"Connecting\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"Contact already exists\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"Contact doesn\\'t exist\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Contact Name\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Contact\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Contacts\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Address Copied\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Copied\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Address\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Encrypted Key\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Key\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Public Key\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Unencrypted Key\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Country Code\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Create a 6-digit PIN\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Create Private Sale\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Create Private Sale\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a price, a receiving account, and a public key below to create a private sale for this account.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Sale\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"The private sale has been created successfully. We’ll let you know if it is bought.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Created\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the information below.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creating\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Currency\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Daemon\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Decrypt & Import\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Default\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Delete Private Key\\nAnd Logout\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Delist Account (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Delist From Sale\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm that you would like to delist this account from sale.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted From Sale\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been successfully delisted from sale.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisting\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"Did not get a response from server\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Duration\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Password can\\'t be empty\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Encrypt\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Create a new password to encrypt your private key.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt Payload\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt the Payload\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Encrypted Key\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"We have sent you a confirmation code, please enter it below.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter PIN\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter PIN to unlock Blaise\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter your phone number below.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"Failed to encrypt the payload\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"Failed to import contacts\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Failed to remove %1 from contacts\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Fee:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Please confirm the addition of %1 Pascal fee to this operation to continue.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"fee\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"This operation requires a fee.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Fee\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"For Sale\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Free Account\"),\n    \"freepasaComplete\" : MessageLookupByLibrary.simpleMessage(\"Success, your new account will be available after 1 network confirmation\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Get a Free Account\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"There are 2 options for getting your first account:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- You can get a free account using your phone number. <colored>Only 1 account per phone number is allowed.</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Get Account\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy as many accounts as you want for <colored>%1 Pascal (%2).</colored>\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> Buying only 1 account is allowed per user.</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> You can buy up to %3 accounts.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Get an Account\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Go Back\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"Got It!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Hide\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"I\\'ve Backed It Up\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"Import\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Import Private Key\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Import Private Key\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter your private key below.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Insufficient balance\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Invalid account\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"Invalid account name\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Invalid address\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Invalid destination\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Invalid PIN\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Invalid password\"),\n    \"invalidPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Phone number is not valid\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Invalid private key\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Invalid public key\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Invalid receiving account\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Key Copied\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Key Not Supported\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"This type of private key is not yet supported by Blaise. You may create a new private key and transfer your accounts to it using a different wallet.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Language:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Language\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"List Account For Sale\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"List Account for Sale (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"List for Sale\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a price and an account that will be receiving the payment to list this account for sale.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"List For Sale\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Listed For Sale\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been successfully listed for sale. We’ll let you know if someone buys it.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listed\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the price and the account that will be receiving the payment.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listing\"),\n    \"liveSupportButton\" : MessageLookupByLibrary.simpleMessage(\"Support\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minute\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Instantly\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Locked\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Locked Until Block\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Logging out will remove your private key and all Blaise related data from this device.</colored> If your private key is not backed up, you will never be able to access your funds again. If your private key is backed up, you have nothing to worry about.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Logout\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Are you sure that you\\'ve backed up your private key? <colored>As long as you\\'ve backed up your private key, you have nothing to worry about.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"This looks like an encrypted private key, please enter the password to decrypt and import it.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Manage\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Too many failed unlock attempts\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"maturation\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Multioperation (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"N/A\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Name Changed\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Name is required\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Name\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"New Account Name\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is your new account.\\nOnce you receive <colored>Pascal</colored>, operations will show up like below.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Are you sure that you have backed up your new wallet’s private key?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"In the next screen, you\\'ll see your new private key. It is a password to access your funds. It is crucial that you back it up and never share it with anyone.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"New Name\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"New Password\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"New Private Key\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"New Private Key\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your new wallet’s private key. It is crucial that you backup your private key and never store it as plaintext or a screenshot. We recommend writing it on a piece of paper and storing it offline.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"New Public Key\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"Welcome to <colored>Blaise Wallet</colored>.\\nYou can start by getting an account.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"Next\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"No contacts to export\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"No contacts to import\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"No, Go Back\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"No\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PINs do not match\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Passwords don\\'t match\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"No results found\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"n_operation\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Notifications\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"null\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Off\"),\n    \"okayButton\" : MessageLookupByLibrary.simpleMessage(\"Okay\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Okay, Go Back\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"On\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"opblock\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Open in Explorer\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Operation Details\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Operations\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"ophash\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optxt\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optype\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Other Operations\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Password\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"Pending\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Phone Number\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Preferences\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Price is required\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Price\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Privacy Policy\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Key\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Key\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Sale\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your public key. As the name suggests, it is intended to be shared publicly and prove that a particular operation belongs to your private key.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Public Key\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Public Key\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Receive Account\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Receive an Account\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"Receive\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Received\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Receiving Account\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Receiving Account\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recover Funds (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Removed %1 from contacts\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"Request\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Request\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"Scan QR Code\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search Account Name\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search For Name\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search Name\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"Security First!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Security\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Seller Account\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Send Amount\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Send\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Send Confirmation\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Send\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Sending Account\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the transaction details to send.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sending\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Sent\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"Transaction has been sent succesfully.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sent\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Set to Default\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Settings\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Share Blaise\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Show\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"signer_account\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Something went wrong, please try again later\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Successfully imported %1 contacts\"),\n    \"supportButton\" : MessageLookupByLibrary.simpleMessage(\"Support\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"System Default\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Copper\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Dark\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Theme\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Light\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"Must be at least 3 characters\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"time\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Total Balance\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Transaction (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Account\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Transfer\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a public key below to transfer the ownership of this account to it.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferred\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been transferred successfully to the public key below.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferred\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the public key below to transfer the ownership of this account to it.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferring\"),\n    \"unconfirmedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Unconfirmed Account\"),\n    \"unconfirmedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is an <colored>unconfirmed account</colored>. It has been transferred to you, but there needs to be 1 network confirmation before you can use it. This usually takes about 5 minutes, once it\\'s complete you\\'ll be able to use this account.\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Undefined\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Unencrypted Key\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"If you lose your device or uninstall Blaise Wallet, you\\'ll need your private key to recover your funds.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Unknown (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock with Biometrics\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock with PIN\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"URL changed to %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"View Public Key\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Warning\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Welcome to Blaise Wallet. To begin, you can create a new private key or import one.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Yes, Add Fee\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Yes\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Yes, I\\'m Sure\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"Amount can\\'t be 0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"Price can\\'t be 0\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_es.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a es locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'es';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Balance de cuenta\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"cuenta\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Precio de la cuenta\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuenta\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuenta desde la cual enviar\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuentas\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Agregar una duración\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Agregar un Payload\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Agregar contacto\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Agregar contacto\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Agregar tarifa\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Agregar a contactos\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 agregado a contactos\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Dirección\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"El monto es obligatorio\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Monto\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"¿Está seguro?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Autenticar al iniciar\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para hacer una copia de seguridad de la clave privada\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para cambiar el nombre de la cuenta por \\\"%1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para crear una venta privada\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para quitar la cuenta de la venta\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para agregar la cuenta a la venta\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para enviar %1 Pascal\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para transferir cuenta\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Autenticar para desbloquear a Blaise\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Datos biométricos\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Método de autenticación\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Bloqueo automático\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"¡Resguarde su clave!\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Respaldar clave privada\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Respaldo\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuación se muestra su clave privada encriptada. Está protegida por una contraseña. Puede almacenarla de forma segura en un administrador de contraseñas para su conveniencia.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Como está encriptada con su contraseña, si la pierde o la olvida, no podrá descifrarla ni acceder a sus fondos.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Tiene dos opciones para respaldar su clave privada:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"Recomendamos almacenar la versión sin encriptar sin conexión, escribiéndola en una hoja de papel. Puede almacenar la versión encriptada en un administrador de contraseñas para su conveniencia.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Encriptada, significa que está protegida por una contraseña.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Sin encriptar, lo que significa que se encuentra sin formato y no está protegida por una contraseña.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuación se muestra su clave privada sin encriptar. <colored>No está protegida por una contraseña, lo que significa que es crucial que la guarde en un lugar seguro y sin conexión.</colored> Recomendamos escribirla en una hoja de papel.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Balance\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"bloque\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recompensa Blockchain (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Para comprar una cuenta, primero deberá pedir prestada una de forma gratuita. Si envía al menos <colored>%1 Pascal (%2)</colored> a la cuenta dentro de <colored>%3 días</colored>, la cuenta será suya y <colored>%1 Pascal</colored> se deducirá de su saldo automáticamente. \\nDe lo contrario, volverá a nosotros al final de <colored>%3 días</colored> y ya no pertenecerá a su billetera.\\nSe recomienda solo enviar una pequeña cantidad de monedas hasta que posea la cuenta.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Pedir prestada una cuenta\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"Compra iniciada por %1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuenta prestada\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>¡Su cuenta ha sido comprada!</colored>\\nLa transferencia se está procesando actualmente. Este proceso generalmente toma unos <colored>15 minutos</colored>, en algunos casos puede tardar un poco más.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Esta es una <colored>cuenta prestada </colored>.\\nSi le envía al menos <colored>%1 Pascal</colored> en los próximos <colored>%2 días,%3 horas y %4 minutos</colored>, será suya.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"Prestada\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferencia pendiente\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Comprar cuenta (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Comprar cuenta\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Comprar una cuenta\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"Cancelar\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"No puede enviar a usted mismo\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cambiar información de la cuenta (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Cambiar nombre de cuenta\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Cambiar Daemon\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese una dirección para usar un daemon Pascal diferente para solicitudes RPC.\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Cambiar daemon\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cambiar clave (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cambiar clave firmada (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Cambiar nombre\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese un nombre a continuación para modificar el nombre de su cuenta.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Cambiar nombre\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Su nombre de cuenta ha sido modificado exitosamente.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Cambiado\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cambio de cuenta\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme su nuevo nombre de cuenta para continuar.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Cambiando\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"¡Vea Blaise! Cartera Pascal simple, elegante y segura para iOS y Android: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Cerrar\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Confirmar\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme su PIN\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirmar contraseña\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirmar\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Código de confirmación\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"El contacto ya existe\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"El contacto no existe\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nombre de contacto\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Contacto\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Contactos\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Dirección copiada\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Copiado\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar dirección\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar clave encriptada\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar clave\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar clave pública\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copiar clave no encriptada\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Código de país\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Crear un PIN de 6 dígitos\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Crear venta privada\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Crear venta privada\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese un precio, una cuenta receptora y una clave pública a continuación para crear una venta privada para esta cuenta.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Venta privada\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"La venta privada se ha creado con éxito. Le haremos saber si se compra.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creada\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme la información a continuación.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creando\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Moneda\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Daemon\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Descifrar e importar\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Por defecto\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Borrar clave privada\\ny cerrar sesión\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Quitar cuenta de la venta (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Quitar de listado de venta\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme que desea retirar de la venta esta cuenta.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Retirada de la venta\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Su cuenta ha sido retirada de la venta con éxito.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Retirada de llistado\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Removida de la venta\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Quietar de la venta\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"No se recibe respuesta del servidor\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Duración\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"La contraseña no puede estar vacía\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Encriptar\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Crear una nueva contraseña para encriptar su clave privada.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encriptar Payload\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Encriptar\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encriptar el Payload\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Clave encriptada\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hemos enviado un código de confirmación, por favor ingréselo a continuación.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduzca PIN\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Introduzca el PIN para desbloquear Blaise\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese su número telefónico a continuación.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"Error al encriptar el payload\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"Error al importar contactos\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Error al remover %1 de contactos\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Tarifa:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme la adición de una comisión de %1 Pascal en operación para continuar.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"tarifa\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Está operación requiere una tarifa\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Tarifa\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"A la venta\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuenta gratuita\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Obtener una cuenta gratuita\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Existen dos opciones para obtener su primera cuenta:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Puede obtener una cuenta gratuita usando su número telefónico.\\n<colored>Se permite una sola cuenta por número telefónico.</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Obtener cuenta\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Puede comprar tantas cuentas como quiera por <colored>%1 Pascal (%2).</colored>\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- Puede comprar una cuenta por <colored>%1 Pascal (%2).</colored><colored> Se permite comprar solo 1 cuenta por usuario.</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- Puede comprar una cuenta por <colored>%1 Pascal (%2).</colored><colored> Puede comprar hasta %3 cuentas.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Obtener una cuenta\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Volver\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"¡De acuerdo!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Ocultar\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"Lo he respaldado\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"Importar\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Importar clave privada\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Importar clave privada\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese su clave privada a continuación.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Balance insuficiente\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Cuenta inválida\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"Nombre de cuenta inválido\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Dirección inválida\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Destino inválido\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN inválido\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Contraseña inválida\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Clave privada inválida\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Clave pública inválida\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Cuenta de recepción inválida\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Clave Copiada\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Clave no soportada\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise aún no admite este tipo de clave privada. Puede crear una nueva clave privada y transferir sus cuentas a esta utilizando una billetera diferente.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Idioma:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Idioma\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Publicar cuenta a la venta\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Publicar cuenta a la venta (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Publicar a la venta\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese un precio y una cuenta que recibirá el pago para publicar a la venta esta cuenta.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Publicar a la venta\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Publicada a la venta\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Su cuenta ha sido exitosamente publicada a la venta. Le avisaremos si alguien la compra.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Publicada\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme el precio y la cuenta que recibirá el pago.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Publicando\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"Después de %1 minutos\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"Después de %1 minuto\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"Después de %1 minutos\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"Después de %1 minutos\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"Después de %1 minutos\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Instantáneamente\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Bloqueada\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bloqueado hasta el bloque\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Cerrar sesión eliminará su clave privada y todos los datos relacionados con Blaise de este dispositivo.</colored> Si no se realiza una copia de seguridad de su clave privada, nunca podrá volver a acceder a sus fondos. Si su clave privada está respaldada, no tiene nada de qué preocuparse.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Cerrar sesión\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"¿Está seguro de que ha hecho una copia de seguridad de su clave privada? <colored>Mientras haya hecho una copia de seguridad de su clave privada, no tiene nada de qué preocuparse.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Esta parece una clave privada encriptada, ingrese la contraseña para descifrarla e importarla.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Gestionar\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Demasiados intentos de desbloqueo fallidos\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"maduración\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Multioperación (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"N/A\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Nombre modificado\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"El nombre es obligatorio\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nombre\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nuevo nombre de cuenta\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Esta es su nueva cuenta.\\nUna vez que reciba <colored>Pascal</colored>, las operaciones se mostrarán como a continuación.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"¿Estás seguro de que has respaldado la clave privada de tu nueva billetera?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"En la siguiente pantalla, verá su nueva clave privada. Es una contraseña para acceder a sus fondos. Es crucial que la respalde y nunca la comparta con nadie.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Nuevo nombre\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Nueva contraseña\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Nueva clave privada\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Nueva clave privada\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuación se muestra la clave privada de su nueva billetera. Es crucial que haga una copia de seguridad de su clave privada y nunca la almacene como texto plano o como una captura de pantalla. Recomendamos escribirla en una hoja de papel y almacenarla sin conexión.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Nueva clave pública\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bienvenido a <colored>Blaise Wallet</colored>.\\nPuede comenzar obteniendo una cuenta.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"Siguiente\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"No hay contactos para exportar\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"No hay contactos para importar\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"No, volver\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"No\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Los PIN no coinciden\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Contraseñan no coinciden\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"No se han encontrado resultados\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"n_operation\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Notificaciones\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"null\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Apagado\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Ok, volver\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"Encendido\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"opblock\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Abrir en el explorador\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Detalles de la operación\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Operaciones\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"ophash\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optxt\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optype\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Otras operaciones\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Contraseña\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"Pendiente\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Número telefónico\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Preferencias\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"El precio es obligatorio\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Precio\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Política de privacidad\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Clave privada\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Clave privada\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Venta privada\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"A continuación se muestra su clave pública. Como su nombre lo indica, está destinada a ser compartida públicamente y probar que una operación particular pertenece a su clave privada.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Clave pública\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Clave pública\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Recibir cuenta\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Recibir una cuenta\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"Recibir\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Recibido\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cuenta receptora\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Cuenta receptora\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recuperar fondos (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 removido de contactos\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"Solicitar\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Solicitar\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"Escanear código QR\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Buscar por nombre de cuenta\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Buscar por nombre\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Buscar nombre\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"¡La seguridad primero!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Seguridad\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cuenta vendedora\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cantidad a enviar\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Enviar\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Enviar confirmación\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviar\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Cuenta de envío\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme los detalles de la transacción para enviar.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviando\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviado\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"La transacción ha sido enviada con éxito.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Enviado\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Establecer predeterminado\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Configuración\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Compartir Blaise\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Mostrar\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"signer_account\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Algo anduvo mal, por favor intente más tarde\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Exitosamente importados %1 contactos\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Sistema por defecto\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Cobre\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Oscuro\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Tema\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Claro\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"Debe tener al menos 3 caracteres\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Fecha\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Balance total\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Transacción (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferir cuenta\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Transferir\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ingrese una clave pública a continuación para transferirle la propiedad de esta cuenta.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferir\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferido\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Su cuenta ha sido transferida exitosamente a la clave pública que se muestra a continuación.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferido\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirme la clave pública a continuación para transferirle la propiedad de esta cuenta.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfiriendo\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Indefinida\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Clave no encriptada\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Si pierde su dispositivo o desinstala Blaise Wallet, necesitará su clave privada para recuperar sus fondos.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Desconocido (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquear\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquear con datos biométricos\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"Desbloquear con PIN\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"URL cambiada a %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Ver clave pública\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Advertencia\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bienvenido a Blaise Wallet. Para empezar, puede crear una nueva clave privada o importar una.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Si, agregar tarifa\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Si\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Si, estoy seguro\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"El monto no puede ser 0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"El precio no puede ser 0\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_messages.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a messages locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'messages';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Account Balance\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"account\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Account Price\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Account\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Account to Send From\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Accounts\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Add a Duration\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Add a Payload\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Add Contact\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Add Contact\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Add Fee\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Add to Contacts\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 added to contacts\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Address\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Amount is required\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Amount\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"Are You Sure?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Authenticate on Launch\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to back up private key\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to change account name to \\\"%1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to create private sale\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to delist the account from sale\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to list account for sale\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to send %1 Pascal\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to transfer account\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Authenticate to Unlock Blaise\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Biometrics\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Authentication Method\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Automatically Lock\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up Your Key!\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up Private Key\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Back Up\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your encrypted private key. It is protected by a password. You can store it safely on a password manager for your convenience.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Since it is encrypted with your password, if you lose or forget your password, you won\\'t be able to decrypt it and access your funds.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"You have 2 options for backing up your private key:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"We recommend storing the unencrypted version offline, by writing it on a piece of paper. You can store the encrypted version on a password manager for your convenience.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Encrypted, which means it is protected by a password.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Unencrypted, which means it is raw and not protected by a password.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your unencrypted private key. <colored>It is not protected by a password, which means it is crucial that you store it somewhere safe and offline.</colored> We recommend writing it on a piece of paper.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Balance\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"block\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Blockchain Reward (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"To buy an account, first you’ll need to borrow one for free. If you send at least <colored>%1 Pascal (%2)</colored> to the account within <colored>%3 days</colored>, the account will be yours and <colored>%1 Pascal</colored> will be deducted from your balance automatically.\\nOtherwise, it’ll return back to us at the end of <colored>%3 days</colored> and won’t belong to your wallet anymore.\\nIt is recommended you only send a small amount of coins until you own the account.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Borrow An Account\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"Purchase Started for %1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Borrowed Account\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Your account has been purchased!</colored>\\nThe transfer is currently processing. This process usually takes about <colored>15 minutes</colored>, in some cases it may take slightly longer.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is a <colored>borrowed account</colored>.\\nIf you send at least <colored>%1 Pascal</colored> to it in the next <colored>%2 days, %3 hours, and %4 minutes</colored>, it’ll be yours.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"Borrowed\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Pending\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Buy Account (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Buy Account\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Buy an Account\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"Cancel\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"Can\\'t send to yourself\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change Account Info (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Account Name\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Change Daemon\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter an address to use a different Pascal daemon for RPC requests.\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Daemon\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change key (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Change Key Signed (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Change Name\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a name below to change your account\\'s name.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Change Name\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account name has been changed successfully.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Changed\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Changing Account\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm your new account name to proceed.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Changing\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"Check out Blaise! Simple, sleek & secure Pascal wallet for iOS and Android: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Close\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Confirm\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm your PIN\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirm Password\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirm\"),\n    \"confirmationCodeError\" : MessageLookupByLibrary.simpleMessage(\"Failed to verify code, ensure you\\'ve entered it correctly\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Confirmation Code\"),\n    \"connectingHeader\" : MessageLookupByLibrary.simpleMessage(\"Connecting\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"Contact already exists\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"Contact doesn\\'t exist\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Contact Name\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Contact\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Contacts\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Address Copied\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Copied\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Address\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Encrypted Key\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Key\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Public Key\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Copy Unencrypted Key\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Country Code\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Create a 6-digit PIN\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Create Private Sale\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Create Private Sale\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a price, a receiving account, and a public key below to create a private sale for this account.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Sale\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"The private sale has been created successfully. We’ll let you know if it is bought.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Created\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the information below.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Creating\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Currency\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Daemon\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Decrypt & Import\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Default\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Delete Private Key\\nAnd Logout\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Delist Account (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Delist From Sale\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm that you would like to delist this account from sale.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted From Sale\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been successfully delisted from sale.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisted\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Delisting\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"Did not get a response from server\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Duration\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Password can\\'t be empty\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Encrypt\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Create a new password to encrypt your private key.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt Payload\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Encrypt the Payload\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Encrypted Key\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"We have sent you a confirmation code, please enter it below.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter PIN\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter PIN to unlock Blaise\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter your phone number below.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"Failed to encrypt the payload\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"Failed to import contacts\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Failed to remove %1 from contacts\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Fee:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Please confirm the addition of %1 Pascal fee to this operation to continue.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"fee\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"This operation requires a fee.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Fee\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"For Sale\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Free Account\"),\n    \"freepasaComplete\" : MessageLookupByLibrary.simpleMessage(\"Success, your new account will be available after 1 network confirmation\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Get a Free Account\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"There are 2 options for getting your first account:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- You can get a free account using your phone number. <colored>Only 1 account per phone number is allowed.</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Get Account\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy as many accounts as you want for <colored>%1 Pascal (%2).</colored>\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> Buying only 1 account is allowed per user.</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> You can buy up to %3 accounts.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Get an Account\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Go Back\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"Got It!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Hide\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"I\\'ve Backed It Up\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"Import\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Import Private Key\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Import Private Key\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter your private key below.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Insufficient balance\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Invalid account\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"Invalid account name\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Invalid address\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Invalid destination\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Invalid PIN\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Invalid password\"),\n    \"invalidPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Phone number is not valid\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Invalid private key\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Invalid public key\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Invalid receiving account\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Key Copied\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Key Not Supported\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"This type of private key is not yet supported by Blaise. You may create a new private key and transfer your accounts to it using a different wallet.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Language:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Language\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"List Account For Sale\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"List Account for Sale (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"List for Sale\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a price and an account that will be receiving the payment to list this account for sale.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"List For Sale\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Listed For Sale\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been successfully listed for sale. We’ll let you know if someone buys it.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listed\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the price and the account that will be receiving the payment.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listing\"),\n    \"liveSupportButton\" : MessageLookupByLibrary.simpleMessage(\"Support\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minute\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"After %1 minutes\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Instantly\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Locked\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Locked Until Block\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Logging out will remove your private key and all Blaise related data from this device.</colored> If your private key is not backed up, you will never be able to access your funds again. If your private key is backed up, you have nothing to worry about.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Logout\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Are you sure that you\\'ve backed up your private key? <colored>As long as you\\'ve backed up your private key, you have nothing to worry about.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"This looks like an encrypted private key, please enter the password to decrypt and import it.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Manage\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Too many failed unlock attempts\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"maturation\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Multioperation (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"N/A\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Name Changed\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Name is required\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Name\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"New Account Name\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is your new account.\\nOnce you receive <colored>Pascal</colored>, operations will show up like below.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Are you sure that you have backed up your new wallet’s private key?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"In the next screen, you\\'ll see your new private key. It is a password to access your funds. It is crucial that you back it up and never share it with anyone.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"New Name\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"New Password\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"New Private Key\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"New Private Key\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your new wallet’s private key. It is crucial that you backup your private key and never store it as plaintext or a screenshot. We recommend writing it on a piece of paper and storing it offline.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"New Public Key\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"Welcome to <colored>Blaise Wallet</colored>.\\nYou can start by getting an account.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"Next\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"No contacts to export\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"No contacts to import\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"No, Go Back\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"No\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PINs do not match\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Passwords don\\'t match\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"No results found\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"n_operation\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Notifications\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"null\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Off\"),\n    \"okayButton\" : MessageLookupByLibrary.simpleMessage(\"Okay\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Okay, Go Back\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"On\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"opblock\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Open in Explorer\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Operation Details\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Operations\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"ophash\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optxt\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"optype\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Other Operations\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Password\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Payload\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"Pending\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Phone Number\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Preferences\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Price is required\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Price\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Privacy Policy\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Key\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Key\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Private Sale\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Below is your public key. As the name suggests, it is intended to be shared publicly and prove that a particular operation belongs to your private key.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Public Key\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Public Key\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Receive Account\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Receive an Account\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"Receive\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Received\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Receiving Account\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Receiving Account\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Recover Funds (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Removed %1 from contacts\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"Request\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Request\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"Scan QR Code\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search Account Name\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search For Name\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Search Name\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"Security First!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Security\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Seller Account\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Send Amount\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Send\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Send Confirmation\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Send\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Sending Account\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the transaction details to send.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sending\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Sent\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"Transaction has been sent succesfully.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Sent\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Set to Default\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Settings\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Share Blaise\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Show\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"signer_account\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Something went wrong, please try again later\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Successfully imported %1 contacts\"),\n    \"supportButton\" : MessageLookupByLibrary.simpleMessage(\"Support\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"System Default\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Copper\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Dark\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Theme\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Light\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"Must be at least 3 characters\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"time\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Total Balance\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Transaction (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Account\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Transfer\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Enter a public key below to transfer the ownership of this account to it.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferred\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Your account has been transferred successfully to the public key below.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferred\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Confirm the public key below to transfer the ownership of this account to it.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transferring\"),\n    \"unconfirmedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Unconfirmed Account\"),\n    \"unconfirmedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"This is an <colored>unconfirmed account</colored>. It has been transferred to you, but there needs to be 1 network confirmation before you can use it. This usually takes about 5 minutes, once it\\'s complete you\\'ll be able to use this account.\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Undefined\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Unencrypted Key\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"If you lose your device or uninstall Blaise Wallet, you\\'ll need your private key to recover your funds.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Unknown (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock with Biometrics\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"Unlock with PIN\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"URL changed to %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"View Public Key\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Warning\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Welcome to Blaise Wallet. To begin, you can create a new private key or import one.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Yes, Add Fee\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Yes\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Yes, I\\'m Sure\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"Amount can\\'t be 0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"Price can\\'t be 0\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_tr.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a tr locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'tr';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesap Bakiyesi\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Hesap\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Hesap Fiyatı\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesap\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"Gönderilecek Hesap\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesaplar\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ Süre Ekle\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ Not Ekle\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"Kişi Ekle\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kişi Ekle\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"Ücret Ekle\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"Rehbere Ekle\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 rehbere eklendi\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Adres\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Miktar gerekli\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Miktar\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"Emin Misin?\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"Başlangıçta Doğrula\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gizli anahtarını yedeklemek için doğrula\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesap adını \\\"%1\\\" olarak değiştirmek için doğrula\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Özel satış oluşturmak için doğrula\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabı satıştan kaldırmak için doğrula\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabı satışa çıkarmak için doğrula\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 Pascal göndermek için doğrula\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabı transfer etmek için doğrula\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise\\'i açmak için doğrula\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"Biometrik\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"Doğrulama Metodu\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"PIN\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"Otomatik Kilitle\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Anahtarını Yedekle!\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Gizli Anahtarı Yedekle\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Yedekle\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Şifreli gizli anahtarını aşağıda görebilirsin. Bir şifre ile korunduğu için, anahtarını güvenle bir şifre yöneticisinde saklayabilirsin.\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anahtar şifreli olduğu için, şifreni unutman veya kaybetmen durumunda, şifrelemeyi açıp cüzdanına erişmen mümkün olmayacak.\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gizli anahtarını yedeklemek için iki seçeneğin var:\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"Anahtarın ham halini bir kağıda yazıp çevrim dışı olarak saklamanı, şifreli halini de kolayca erişebilmen için bir şifre yöneticisinde saklamanı tavsiye ediyoruz.\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Şifreli, yani bir şifre ile korunan.\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- Ham, yani bir şifre ile korunmayan.\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Ham gizli anahtarını aşağıda görebilirsin. <colored>Bir şifre ile korunmadığı için, ham anahtarını güvenli ve çevrim dışı bir yerde saklaman çok önemli.</colored> Anahtarını bir kağıda yazarak saklamanı tavsiye ediyoruz.\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Bakiye\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Blok\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Blokzinciri Ödülü (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bir hesap satın almak için, öncelikle bu hesabı ödünç alman gerekiyor. Ödünç aldığın hesaba <colored>%3 gün</colored> içinde <colored>%1 Pascal (%2)</colored> gönderirsen, hesap tamamen senin olacak ve hesaptan otomatik olarak <colored>%1 Pascal</colored> ücret kesilecek.\\nAksi takdirde hesap <colored>%3 günün</colored> sonunda bize geri dönecek.\\nHesap tamamen senin olmadan, hesaba fazla miktarda gönderi yapmamanı tavsiye ediyoruz.\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Ödünç Hesap Al\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"%1 için alım işlemi başladı\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Ödünç Hesap\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Hesap satın alındı!</colored>\\nTransfer işlemi şuan devam ediyor. Transfer genellikle <colored>15 dakika</colored>, bazen ise biraz daha uzun sürebilir.\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu bir <colored>ödünç hesap</colored>.\\n<colored>%2 gün, %3 saat, %4 dakika içinde bu hesaba en az </colored>%1 Pascal</colored> gönderirsen, hesap senin olacak.\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"Ödünç\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Bekleniyor\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Hesap Satın Alımı (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesap Al\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Hesap Satın Al\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"İptal\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"Kendine gönderemezsin\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Hesap Bilgisi Değişimi (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesap Adı Değiştir\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"Değiştir\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"Pascal erişim noktasını değiştirmek için yeni bir erişim noktası gir.\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Erişim Noktası\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Anahtar Değişimi (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Anahtar Değişimi (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"Adı Değiştir\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesap adını değiştirmek için aşağıya yeni bir hesap adı gir.\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Ad Değiştir\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesap adı başarıyla değiştirildi.\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Değiştirildi\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Değişen Hesap\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"İlerlemek için hesabın yeni adını onayla.\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Değiştiriliyor\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise\\'i Dene! Sade, şık & güvenli bir Pascal cüzdanı. Hem iOS, hem Android\\'de: https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"Kapat\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"Onayla\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN\\'i onayla\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Şifreyi Onayla\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Onayla\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Onay Kodu\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"Kişi zaten mevcut\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"Kişi bulunamadı\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Kişi Adı\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kişi\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"Rehber\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Adres Kopyalandı\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"Kopyalandı\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"Adresi Kopyala\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"Kopyala\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Şifreli Anahtarı Kopyala\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Anahtarı Kopyala\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Açık Anahtarı Kopyala\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Ham Anahtarı Kopyala\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Ülke Kodu\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"6 haneli bir PIN oluştur\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Özel Satış Oluştur\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Özel Satış Oluştur\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Özel satış oluşturmak için fiyatı, ödemeyi alacak hesabı ve müşterinin açık anahtarını gir.\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Özel Satış\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Özel satış başarıyla oluşturuldu. Hesap satın alınırsa seni haberdar ederiz.\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Oluşturuldu\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aşağıdaki bilgileri doğrula.\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Oluşturuluyor\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"Para Birimi\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"Erişim Noktası\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Şifreyi Aç & İçe Aktar\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Varsayılan\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"Gizli Anahtarı Sil\\nve Çık\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Satıştan Kaldırma (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Satıştan Kaldır\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabı satıştan kaldırmak istediğini onayla.\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Satıştan Kaldırıldı\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesap satıştan başarıyla kaldırıldı.\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"Satıştan Kaldırıldı\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kaldırıldı\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Kaldırılıyor\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"Sunucudan cevap alınamadı\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Süre\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Şifre alanı boş olamaz\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"Şifrele\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gizli anahtarını şifrelemek için yeni bir parola oluştur.\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Notu Şifrele\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Şifrele\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"Notu Şifrele\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Şifreli Anahtar\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Sana bir onay kodu yolladık, lütfen kodu aşağıya gir.\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN\\'i gir\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise\\'i açmak için PIN\\'i gir\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"Telefon numaranı aşağıya gir.\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"Not şifreleme başarısız\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"Kişileri içe aktarma işlemi başarısız\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 rehberden silinemedi\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Ücret:\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Devam etmek için %1 Pascal tutarında bir ücret eklenmesini onayla.\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Ücret\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu operasyon bir ücret gerektiriyor.\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Ücret\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Satılık\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Ücretsiz Hesap\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Ücretsiz Hesap Al\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"İlk hesabını almak için 2 seçeneğin var:\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- Telefon numaranı kullanarak ücretsiz olarak bir hesap alabilirsin. <colored> Her telefon numarası için en fazla 1 hesap alabilirsin.</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesap Al\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- <colored>%1 Pascal (%2)</colored> karşılığında istediğin kadar hesap satın alabilirsin.\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"<colored>%1 Pascal (%2)</colored> karşılığında bir hesap satın alabilirsin.<colored> Her kullanıcı en fazla 1 adet hesap satın alabilir.</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"<colored>%1 Pascal (%2)</colored> karşılığında bir hesap satın alabilirsin.<colored> Her kullanıcı en fazla %3 adet hesap satın alabilir.</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Hesap Al\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"Geri Dön\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"Tamamdır!\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"Gizle\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"Yedekledim\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"İçe Aktar\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Anahtarı İçe Aktar\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Gizli Anahtarı İçe Aktar\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gizli anahtarını aşağıya gir.\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"Bakiye yetersiz\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz hesap\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz hesap adı\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz adres\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz varış noktası\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz PIN\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz şifre\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz gizli anahtar\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz açık anahtar\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"Geçersiz alıcı hesap\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"Anahtar Kopyalandı\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"Anahtar Desteklenmiyor\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise henüz bu türdeki gizli anahtarları desteklemiyor. Yeni bir gizli anahtar oluşturup, hesaplarını başka bir cüzdan kullanarak yeni gizli anahtarına transfer edebilirsin.\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"Dil:\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"Dil\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesabı Satışa Çıkar\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Hesap Satışı (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"Şatışa Çıkar\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu hesabı satışa çıkarmak için aşağıya bir fiyat ve ödemeyi alacak hesabı gir.\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Satış\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Satışa Çıkarıldı\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabın satışa çıkarıldı. Satın alınırsa seni haberdar ederiz.\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listelendi\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"Fiyatı ve ödemeyi alacak hesabı onayla.\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Listeleniyor\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"%1 dakika sonra\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"%1 dakika sonra\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"%1 dakika sonra\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"%1 dakika sonra\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"%1 dakika sonra\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"Hemen\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"Kilitli\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bu Bloğa Kadar Kilitli\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Çıkış yaparsan, gizli anahtarın ve Blaise ile alakalı tüm veriler bu cihazdan silinecek.</colored> Gizli anahtarını yedeklemediysen, cüzdanına ve bakiyene bir daha ulaşamazsın. Yedeklediysen, endişelenecek hiçbir şey yok.\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"Çıkış\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gizli anahtarını yedeklediğine emin misin? <colored>Yedeklediysen endişelenecek bir şey yok.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu, şifreli bir gizli anahtara benziyor. Şifrelemeyi çözmek ve anahtarı içe aktarmak için şifreni gir.\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"Yönet\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"Çok fazla başarısız giriş denemesi yapıldı\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Olgunluk\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Çoklu Operasyon (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Mevcut Değil\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"Ad Değiştirildi\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Ad gerekli\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Ad\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Yeni Hesap Adı\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"Yeni hesabına hoşgeldin.\\n<colored>Pascal</colored> aldığında veya gönderdiğinde, operasyonların aşağıdaki gibi görünecek.\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Yeni cüzdanının gizli anahtarını yedeklediğine emin misin?\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bir sonraki ekranda yeni gizli anahtarını göreceksin. Bu, cüzdanına ve bakiyene ulaşmanı sağlayan bir çeşit şifre. Anahtarı yedeklemen ve kimseyle paylaşmaman çok önemli.\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Yeni Ad\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Yeni Şifre\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Yeni Gizli Anahtar\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Yeni Gizli Anahtar\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Aşağıda cüzdanın yeni gizli anahtarını görebilirsin. Anahtarını yedeklemen çok önemli. Anahtarı kesinlikle ekran görüntüsü olarak saklamamalısın. Anahtarı bir kağıda yazmanı ve çevrim dışı olarak saklamanı tavsiye ediyoruz.\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Yeni Açık Anahtar\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>Blaise</colored>\\'e hoşgeldin.\\nBir hesap alarak başlayabilirsin.\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"İleri\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"Dışa aktarılacak kişi bulunamadı\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"İçe aktarılacak kişi bulunamadı\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Hayır, Geri Dön\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"Hayır\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"PIN\\'ler uyuşmuyor\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"Şifreler uyuşmuyor\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"Sonuç bulunamadı\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Toplam Operasyon\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Bildirimler\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Belirsiz\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"Kapalı\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"Tamamdır, Geri Dön\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"Açık\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bloktaki Sırası\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"Tarayıcıda Aç\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"Operasyon detayları\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Operasyonlar\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Operasyon Hash\\'i\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Operasyon Notu\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Operasyon Tipi\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"Diğer Operasyonlar\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Şifre\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Not\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Not\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"Bekleniyor\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Telefon Numarası\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"Tercihler\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"Fiyat gerekli\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Fiyat\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"Gizlilik Politikası\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Gizli Anahtar\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Gizli Anahtar\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"Özel Satış\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"Açık anahtarını aşağıda görebilirsin. Bu anahtar, herkese açık şekilde paylaşılmak ve bir operasyonun senin gizli anahtarına ait olduğu kanıtlamak için var.\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Açık Anahtar\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Açık Anahtar\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Hesap İste\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"Hesap İste\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"İste\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"Alındı\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Alıcı Hesap\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"Ödemeyi Alacak Hesap\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bakiye Kurtarma (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 rehberden silindi\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"İste\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"İste\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"QR Kodu Tara\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"Hesap Adı Ara\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"Adı Ara\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"Adı Ara\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"Önce Güvenlik!\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"Güvenlik\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Satıcı Hesap\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Gönderi Miktarı\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"Gönder\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"Onay Kodu Gönder\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Gönder\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Gönderici Hesap\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"Göndermek için işlem detaylarını onayla.\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Gönderiliyor\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"Gönderildi\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"Gönderme işlemi başarıyla tamamlandı.\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Gönderildi\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"Varsayılan\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"Ayarlar\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"Blaise\\'i Paylaş\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"Göster\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"İmzalayan Hesap\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"Bir şeyler ters gitti, daha sonra tekrar dene\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"%1 kişi rehbere başarıyla eklendi\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"Sistem Varsayılanı\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"Bakır\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"Koyu\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"Tema\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"Açık\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"En az 3 karakter olmalı\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Tarih\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"Genel Bakiye\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"İşlem (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"Hesabı Transfer Et\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"Transfer Et\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu hesabı transfer etmek istediğin açık anahtarı aşağıya gir.\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Et\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"Transfer Edildi\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"Hesabın aşağıdaki açık anahtara başarıyla transfer edildi.\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Edildi\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"Bu hesabı transfer etmek istediğin açık anahtarı onayla.\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"Ediliyor\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"Tanımsız\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"Ham Anahtar\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"Cihazını kaybedersen veya Blaise\\'i silersen, bakiyene ve cüzdanına tekrar ulaşmak için gizli anahtarına ihtiyaç duyacaksın.\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"Bilinmeyen (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"Kilidi Aç\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"Biometrik ile Aç\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"PIN ile Aç\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"URL %1 olarak değiştirildi\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"Açık Anahtarı Görüntüle\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"Uyarı\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise\\'e hoşgeldin. Başlamak için yeni bir gizli anahtar oluştur veya zaten bir gizli anahtarın varsa içe aktar.\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"Evet, Ücreti Ekle\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"Evet\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"Evet, Eminim\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"Miktar sıfır olamaz\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"Fiyat sıfır olamaz\")\n  };\n}\n"
  },
  {
    "path": "lib/l10n/messages_zh-Hans.dart",
    "content": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messages for a zh_Hans locale. All the\n// messages from the main program should be duplicated here with the same\n// function name.\n\n// Ignore issues from commonly used lints in this file.\n// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new\n// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering\n// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases\n// ignore_for_file:unused_import, file_names\n\nimport 'package:intl/intl.dart';\nimport 'package:intl/message_lookup_by_library.dart';\n\nfinal messages = new MessageLookup();\n\ntypedef String MessageIfAbsent(String messageStr, List<dynamic> args);\n\nclass MessageLookup extends MessageLookupByLibrary {\n  String get localeName => 'zh_Hans';\n\n  final messages = _notInlinedMessages(_notInlinedMessages);\n  static _notInlinedMessages(_) => <String, Function> {\n    \"accountBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"账号余额\"),\n    \"accountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"账号\"),\n    \"accountPriceOPDetails\" : MessageLookupByLibrary.simpleMessage(\"账号价格\"),\n    \"accountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"账号\"),\n    \"accountToSendFromHeader\" : MessageLookupByLibrary.simpleMessage(\"发送账号\"),\n    \"accountsHeader\" : MessageLookupByLibrary.simpleMessage(\"账号列表\"),\n    \"addADurationButton\" : MessageLookupByLibrary.simpleMessage(\"+ 添加时长\"),\n    \"addAPayloadButton\" : MessageLookupByLibrary.simpleMessage(\"+ 添加负载\"),\n    \"addContactButton\" : MessageLookupByLibrary.simpleMessage(\"添加联系人\"),\n    \"addContactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"添加联系人\"),\n    \"addFeeHeader\" : MessageLookupByLibrary.simpleMessage(\"添加手续费\"),\n    \"addToContactsButton\" : MessageLookupByLibrary.simpleMessage(\"添加到联系人\"),\n    \"addedToContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"已将%1添加到联系人\"),\n    \"addressTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"地址\"),\n    \"amountRequiredError\" : MessageLookupByLibrary.simpleMessage(\"请输入金额\"),\n    \"amountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"金额\"),\n    \"areYouSureHeader\" : MessageLookupByLibrary.simpleMessage(\"您确定吗？\"),\n    \"authenticateOnLaunchHeader\" : MessageLookupByLibrary.simpleMessage(\"启动时要求验证\"),\n    \"authenticateToBackUpParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以备份私钥\"),\n    \"authenticateToChangeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证将帐户名称更改为\\\"%1\\\"\"),\n    \"authenticateToCreatePrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以创建新的私钥\"),\n    \"authenticateToDelistParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以下架正在出售的账号\"),\n    \"authenticateToListForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以上架出售账号\"),\n    \"authenticateToSendParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以发送%1Pascal\"),\n    \"authenticateToTransferParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以转移账号\"),\n    \"authenticateToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"验证以解锁钱包\"),\n    \"authenticationBiometricsHeader\" : MessageLookupByLibrary.simpleMessage(\"生物验证\"),\n    \"authenticationMethodHeader\" : MessageLookupByLibrary.simpleMessage(\"验证方式\"),\n    \"authenticationPINHeader\" : MessageLookupByLibrary.simpleMessage(\"识别码\"),\n    \"automaticallyLockHeader\" : MessageLookupByLibrary.simpleMessage(\"自动锁定\"),\n    \"backUpKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"备份您的私钥！\"),\n    \"backUpPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"备份私钥\"),\n    \"backUpSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"备份\"),\n    \"backupEncryptedKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"以下是经过您的密码加密后的私钥。您可以选择将它保存到密码管理器中。\"),\n    \"backupEncryptedKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"由于私钥经过了您的密码加密，如果您丢失或忘记了密码，那么您将无法再访问您的资金。\"),\n    \"backupKeyFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"您有两种可选方式来备份私钥：\"),\n    \"backupKeyFourthParagraph\" : MessageLookupByLibrary.simpleMessage(\"我们推荐以非加密方式将私钥抄写到纸上，离线保存。您也可以选择以加密方式将私钥保存到密码管理器中。\"),\n    \"backupKeySecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- 加密方式。这意味着你的私钥将被密码保护。\"),\n    \"backupKeyThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- 非加密方式。以原始明文方式备份，不通过密码保护。\"),\n    \"backupUnencryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"以下是您未经加密的原始私钥。<colored>该私钥没有使用密码保护，请务必将其备份到安全且离线的地方。</colored> 我们推荐您将其抄写到纸上。\"),\n    \"balanceHeader\" : MessageLookupByLibrary.simpleMessage(\"余额\"),\n    \"blockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"区块\"),\n    \"blockchainRewardOPDetails\" : MessageLookupByLibrary.simpleMessage(\"区块奖励 (%1)\"),\n    \"borrowAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"要购买一个帐户，您首先需要免费借用一个。如果您在<colored>%3天</colored>内至少存入<colored>%1 Pascal (%2)</colored>到该账号，该账号将是您的，并且<colored>%1 Pascal</colored>将自动从您的余额中扣除。\\n否则，该账号将在<colored>%3天</colored>结束时返回给我们，不再属于您的钱包。\\n建议您在完全拥有该帐号前只存入少量的Pascal。\"),\n    \"borrowAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"借用账号\"),\n    \"borrowStarted\" : MessageLookupByLibrary.simpleMessage(\"开始购买账号 %1\"),\n    \"borrowedAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"借用的账号\"),\n    \"borrowedAccountPaidParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>您已成功购买该账号!</colored>\\n网络正在处理该操作，这个过程大约需要<colored>15分钟</colored>, 在某些情况下，可能需要稍长时间。\"),\n    \"borrowedAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"这是一个<colored>借用的账号</colored>。\\n如果您在接下来的<colored>%2天 %3时 %4分</colored>内存入<colored>%1 Pascal</colored>到该账号中，您将永远拥有它。\"),\n    \"borrowedHeader\" : MessageLookupByLibrary.simpleMessage(\"借用中\"),\n    \"borrowedTransferredHeader\" : MessageLookupByLibrary.simpleMessage(\"处理中的转让\"),\n    \"buyAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"购买账号 (%1)\"),\n    \"buyAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"购买账号\"),\n    \"buyAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"购买账号\"),\n    \"cancelButton\" : MessageLookupByLibrary.simpleMessage(\"取消\"),\n    \"cantSendToYourselfError\" : MessageLookupByLibrary.simpleMessage(\"无法发送给自己\"),\n    \"changeAccountInfoOPDetails\" : MessageLookupByLibrary.simpleMessage(\"更改账号信息 (%1)\"),\n    \"changeAccountNameHeader\" : MessageLookupByLibrary.simpleMessage(\"更改账号名\"),\n    \"changeDaemonButton\" : MessageLookupByLibrary.simpleMessage(\"更改后台\"),\n    \"changeDaemonParagraph\" : MessageLookupByLibrary.simpleMessage(\"请输入一个新的后台地址以便进行RPC请求。\"),\n    \"changeDaemonSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"更改后台\"),\n    \"changeKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"更改密钥 (%1)\"),\n    \"changeKeySignedOPDetails\" : MessageLookupByLibrary.simpleMessage(\"签署更改密钥 (%1)\"),\n    \"changeNameButton\" : MessageLookupByLibrary.simpleMessage(\"修改账号名\"),\n    \"changeNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"在下方输入一个名字来更改您的账号名。\"),\n    \"changeNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"更名\"),\n    \"changedNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"您已成功更改账号名。\"),\n    \"changedNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"已更改\"),\n    \"changingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"更改账号\"),\n    \"changingNameParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认您的新账号名。\"),\n    \"changingNameSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"正在更改\"),\n    \"checkOutBlaiseParagraph\" : MessageLookupByLibrary.simpleMessage(\"了解Blaise，简单、安全又好用的Pascal钱包：https://blaisewallet.com\"),\n    \"closeButton\" : MessageLookupByLibrary.simpleMessage(\"关闭\"),\n    \"confirmButton\" : MessageLookupByLibrary.simpleMessage(\"确认\"),\n    \"confirmPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"确认您的识别码\"),\n    \"confirmPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"确认密码\"),\n    \"confirmTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"确认\"),\n    \"confirmationCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"验证码\"),\n    \"contactAlreadyExistsError\" : MessageLookupByLibrary.simpleMessage(\"联系人已存在\"),\n    \"contactDoesntExistError\" : MessageLookupByLibrary.simpleMessage(\"联系人不存在\"),\n    \"contactNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"联系人名字\"),\n    \"contactSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"联系人\"),\n    \"contactsHeader\" : MessageLookupByLibrary.simpleMessage(\"联系人\"),\n    \"copiedAddressButton\" : MessageLookupByLibrary.simpleMessage(\"地址复制成功\"),\n    \"copiedButton\" : MessageLookupByLibrary.simpleMessage(\"复制成功\"),\n    \"copyAddressButton\" : MessageLookupByLibrary.simpleMessage(\"复制地址\"),\n    \"copyButton\" : MessageLookupByLibrary.simpleMessage(\"复制\"),\n    \"copyEncryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"复制已加密私钥\"),\n    \"copyKeyButton\" : MessageLookupByLibrary.simpleMessage(\"复制密钥\"),\n    \"copyPublicKeyButton\" : MessageLookupByLibrary.simpleMessage(\"复制公钥\"),\n    \"copyUnencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"复制原始私钥\"),\n    \"countryCodeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"国家代码\"),\n    \"createPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"创建一个6位数的识别码\"),\n    \"createPrivateSaleButton\" : MessageLookupByLibrary.simpleMessage(\"创建非公开挂卖\"),\n    \"createPrivateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"对私出售该账号\"),\n    \"createPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"输入售价、收款账号和公钥，以对该账号进行对私出售。\"),\n    \"createPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"对私出售\"),\n    \"createdPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"对私出售已经成功创建。如果账号被购买了，我们将会通知您。\"),\n    \"createdPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"成功创建\"),\n    \"creatingPrivateSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认以下信息。\"),\n    \"creatingPrivateSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"创建\"),\n    \"currencyHeader\" : MessageLookupByLibrary.simpleMessage(\"货币单位\"),\n    \"daemonHeader\" : MessageLookupByLibrary.simpleMessage(\"后台设置\"),\n    \"decryptAndImportKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"解密并导入\"),\n    \"defaultHeader\" : MessageLookupByLibrary.simpleMessage(\"默认\"),\n    \"deletePrivateKeyAndLogoutButton\" : MessageLookupByLibrary.simpleMessage(\"删去私钥\\n并登出\"),\n    \"delistAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"下架账号 (%1)\"),\n    \"delistFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"取消出售\"),\n    \"delistFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认您想将此帐户从销售列表中下架。\"),\n    \"delistedFromSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"已下架\"),\n    \"delistedFromSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"您的帐户已成功从销售列表中下架。\"),\n    \"delistedHeader\" : MessageLookupByLibrary.simpleMessage(\"已下架\"),\n    \"delistedSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"成功下架\"),\n    \"delistingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"下架\"),\n    \"didNotGetResponseError\" : MessageLookupByLibrary.simpleMessage(\"服务器无响应\"),\n    \"durationTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"时长\"),\n    \"emptyPasswordError\" : MessageLookupByLibrary.simpleMessage(\"密码不能为空\"),\n    \"encryptButton\" : MessageLookupByLibrary.simpleMessage(\"加密私钥\"),\n    \"encryptKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"创建一个密码，用来加密你的私钥。\"),\n    \"encryptPayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"对负载加密\"),\n    \"encryptSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"加密\"),\n    \"encryptThePayloadHeader\" : MessageLookupByLibrary.simpleMessage(\"对负载加密\"),\n    \"encryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"显示已加密私钥\"),\n    \"enterConfirmationCodeParagraph\" : MessageLookupByLibrary.simpleMessage(\"请输入您收到的验证码。\"),\n    \"enterPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"请输入输入识别码\"),\n    \"enterPINToUnlockParagraph\" : MessageLookupByLibrary.simpleMessage(\"输入识别码以解锁\"),\n    \"enterPhoneNumberParagraph\" : MessageLookupByLibrary.simpleMessage(\"在下面输入您的手机号码\"),\n    \"failedToEncryptPayloadError\" : MessageLookupByLibrary.simpleMessage(\"未能成功加密负载\"),\n    \"failedToImportContactsError\" : MessageLookupByLibrary.simpleMessage(\"导入联系人失败\"),\n    \"failedToRemoveFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"未能从联系人中删除%1\"),\n    \"feeColonHeader\" : MessageLookupByLibrary.simpleMessage(\"手续费：\"),\n    \"feeConfirmAmountParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认将%1Pascal作为费用以继续此操作。\"),\n    \"feeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"手续费\"),\n    \"feeRequiredParagraph\" : MessageLookupByLibrary.simpleMessage(\"该操作需要手续费。\"),\n    \"feeTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"手续费\"),\n    \"forSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"代售\"),\n    \"freeAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"免费账号\"),\n    \"getAFreeAccountButton\" : MessageLookupByLibrary.simpleMessage(\"获取免费账号\"),\n    \"getAccountFirstParagraph\" : MessageLookupByLibrary.simpleMessage(\"您可以通过两种方式获得账号：\"),\n    \"getAccountSecondParagraph\" : MessageLookupByLibrary.simpleMessage(\"1- 通过手机号码获得账号，<colored>每个手机号码只能获得一个。</colored>\"),\n    \"getAccountSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"获取一个账号\"),\n    \"getAccountThirdParagraph\" : MessageLookupByLibrary.simpleMessage(\"2- 您可以以单价<colored>%1 Pascal (%2)</colored>购买任意数量的账号。\"),\n    \"getAccountThirdParagraphAlternative\" : MessageLookupByLibrary.simpleMessage(\"2- 您可以花费<colored>%1 Pascal (%2)</colored>购买一个账号。<colored> 每个用户只允许购买一个账号。</colored>\"),\n    \"getAccountThirdParagraphAlternative2\" : MessageLookupByLibrary.simpleMessage(\"2- 您可以花费<colored>%1 Pascal (%2)</colored>购买一个账号。<colored> 您最多可以购买%3个账号。</colored>\"),\n    \"getAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"获取账号\"),\n    \"goBackButton\" : MessageLookupByLibrary.simpleMessage(\"返回\"),\n    \"gotItButton\" : MessageLookupByLibrary.simpleMessage(\"确认\"),\n    \"hideButton\" : MessageLookupByLibrary.simpleMessage(\"隐藏\"),\n    \"iHaveBackedItUpButton\" : MessageLookupByLibrary.simpleMessage(\"我已做好备份\"),\n    \"importButton\" : MessageLookupByLibrary.simpleMessage(\"导入\"),\n    \"importPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"导入私钥\"),\n    \"importPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"导入私钥\"),\n    \"importPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"请在下方输入您的私钥：\"),\n    \"insufficientBalanceError\" : MessageLookupByLibrary.simpleMessage(\"余额不足\"),\n    \"invalidAccountError\" : MessageLookupByLibrary.simpleMessage(\"无效的账号\"),\n    \"invalidAccountNameError\" : MessageLookupByLibrary.simpleMessage(\"无效的账号名\"),\n    \"invalidAddressError\" : MessageLookupByLibrary.simpleMessage(\"无效的地址\"),\n    \"invalidDestinationError\" : MessageLookupByLibrary.simpleMessage(\"无效的目标\"),\n    \"invalidPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"无效的识别码\"),\n    \"invalidPasswordError\" : MessageLookupByLibrary.simpleMessage(\"密码无效\"),\n    \"invalidPrivateKeyError\" : MessageLookupByLibrary.simpleMessage(\"无效的私钥\"),\n    \"invalidPublicKeyError\" : MessageLookupByLibrary.simpleMessage(\"无效的公钥\"),\n    \"invalidReceivingAccountError\" : MessageLookupByLibrary.simpleMessage(\"无效的收款账号\"),\n    \"keyCopiedButton\" : MessageLookupByLibrary.simpleMessage(\"成功复制密钥\"),\n    \"keyTypeNotSupportedHeader\" : MessageLookupByLibrary.simpleMessage(\"不被支持的私钥\"),\n    \"keyTypeNotSupportedParagraph\" : MessageLookupByLibrary.simpleMessage(\"Blaise钱包目前还不支持这种类型的私钥。您可以创建一个新的私钥，并使用其它钱包将您的帐户转移给该私钥。\"),\n    \"languageColonHeader\" : MessageLookupByLibrary.simpleMessage(\"语言：\"),\n    \"languageHeader\" : MessageLookupByLibrary.simpleMessage(\"语言\"),\n    \"listAccountForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"上架出售账号\"),\n    \"listAccountForSaleOPDetails\" : MessageLookupByLibrary.simpleMessage(\"上架出售账号 (%1)\"),\n    \"listForSaleButton\" : MessageLookupByLibrary.simpleMessage(\"挂卖账号\"),\n    \"listForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"请输入该账号的售价和一个用来接收付款的账号。\"),\n    \"listForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"上架出售\"),\n    \"listedForSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"上架出售\"),\n    \"listedForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"您的帐号正式挂牌出售。如果有人买了，我们将会通知您。\"),\n    \"listedForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"成功上架\"),\n    \"listingForSaleParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认售价和收款账号。\"),\n    \"listingForSaleSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"上架明细\"),\n    \"lock15Header\" : MessageLookupByLibrary.simpleMessage(\"%1 分钟后\"),\n    \"lock1Header\" : MessageLookupByLibrary.simpleMessage(\"%1 分钟后\"),\n    \"lock30Header\" : MessageLookupByLibrary.simpleMessage(\"%1 分钟后\"),\n    \"lock5Header\" : MessageLookupByLibrary.simpleMessage(\"%1 分钟后\"),\n    \"lock60Header\" : MessageLookupByLibrary.simpleMessage(\"%1 分钟后\"),\n    \"lockInstantHeader\" : MessageLookupByLibrary.simpleMessage(\"立刻\"),\n    \"lockedHeader\" : MessageLookupByLibrary.simpleMessage(\"已锁定\"),\n    \"lockedUntilBlockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"解锁区块\"),\n    \"logoutFirstDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"<colored>登出将会从这个设备删除您的私钥和所有与Blaise钱包相关的数据。</colored>如果您的私钥还未备份，您将永远无法再访问您的资金。如果您的私钥已备份，则无需担心。\"),\n    \"logoutHeader\" : MessageLookupByLibrary.simpleMessage(\"登出\"),\n    \"logoutSecondDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"您确定已经备份了您的私钥吗?<colored>只要您备份了私钥，就没有什么好担心的.</colored>\"),\n    \"looksLikeEncryptedKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"这看起来像是一个经过加密的私钥，请输入密码以解密并导入它。\"),\n    \"manageHeader\" : MessageLookupByLibrary.simpleMessage(\"管理\"),\n    \"manyFailedAttemptsParagraph\" : MessageLookupByLibrary.simpleMessage(\"解锁尝试失败次数太多\"),\n    \"maturationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"成熟区块\"),\n    \"multioperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"多重操作 (%1)\"),\n    \"naOPDetails\" : MessageLookupByLibrary.simpleMessage(\"N/A\"),\n    \"nameChangedHeader\" : MessageLookupByLibrary.simpleMessage(\"更名成功\"),\n    \"nameRequiredError\" : MessageLookupByLibrary.simpleMessage(\"请输入名字\"),\n    \"nameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"名字\"),\n    \"newAccountNameTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"新账号名\"),\n    \"newAccountParagraph\" : MessageLookupByLibrary.simpleMessage(\"这是您的新账号。\\n一旦您接收到<colored>Pascal</colored>，操作将如下所示。\"),\n    \"newKeyBackUpConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"您确定已经将新钱包的私钥备份好了吗？\"),\n    \"newKeySecurityParagraph\" : MessageLookupByLibrary.simpleMessage(\"接下来您将看到您新建的私钥，请务必将其备份且不要泄露给任何人。\"),\n    \"newNameOPDetails\" : MessageLookupByLibrary.simpleMessage(\"新的账号名\"),\n    \"newPasswordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"新密码\"),\n    \"newPrivateKeyButton\" : MessageLookupByLibrary.simpleMessage(\"新建私钥\"),\n    \"newPrivateKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"新建私钥\"),\n    \"newPrivateKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"以下是您的新钱包私钥。请注意，您必须备份私钥但不要将其备份为纯文本或屏幕截图，我们建议您用笔将其抄写到纸上。\"),\n    \"newPublicKeyOPDetails\" : MessageLookupByLibrary.simpleMessage(\"新的公钥\"),\n    \"newWalletGreetingParagraph\" : MessageLookupByLibrary.simpleMessage(\"欢迎使用<colored>Blaise钱包</colored>。\\n您可以从获取一个账号开始\"),\n    \"nextButton\" : MessageLookupByLibrary.simpleMessage(\"继续\"),\n    \"noContactsToExportError\" : MessageLookupByLibrary.simpleMessage(\"没有联系人可以导出\"),\n    \"noContactsToImportError\" : MessageLookupByLibrary.simpleMessage(\"没有联系人可以导入\"),\n    \"noGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"返回\"),\n    \"noHeader\" : MessageLookupByLibrary.simpleMessage(\"否\"),\n    \"noMatchPINParagraph\" : MessageLookupByLibrary.simpleMessage(\"识别码不匹配\"),\n    \"noMatchPasswordError\" : MessageLookupByLibrary.simpleMessage(\"密码不匹配\"),\n    \"noResultsFound\" : MessageLookupByLibrary.simpleMessage(\"未找到结果\"),\n    \"noperationOPDetails\" : MessageLookupByLibrary.simpleMessage(\"操作数\"),\n    \"notificationsHeader\" : MessageLookupByLibrary.simpleMessage(\"通知\"),\n    \"nullOPDetails\" : MessageLookupByLibrary.simpleMessage(\"空\"),\n    \"offHeader\" : MessageLookupByLibrary.simpleMessage(\"禁用\"),\n    \"okayGoBackButton\" : MessageLookupByLibrary.simpleMessage(\"返回\"),\n    \"onHeader\" : MessageLookupByLibrary.simpleMessage(\"启用\"),\n    \"opblockOPDetails\" : MessageLookupByLibrary.simpleMessage(\"区块的第几笔操作\"),\n    \"openInExplorerButton\" : MessageLookupByLibrary.simpleMessage(\"在浏览器中打开\"),\n    \"operationDetailsButton\" : MessageLookupByLibrary.simpleMessage(\"操作细节\"),\n    \"operationsHeader\" : MessageLookupByLibrary.simpleMessage(\"操作记录\"),\n    \"ophashOPDetails\" : MessageLookupByLibrary.simpleMessage(\"操作哈希\"),\n    \"optxtOPDetails\" : MessageLookupByLibrary.simpleMessage(\"操作说明\"),\n    \"optypeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"操作类型\"),\n    \"otherOperationsHeader\" : MessageLookupByLibrary.simpleMessage(\"其它操作\"),\n    \"passwordTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"密码\"),\n    \"payloadOPDetails\" : MessageLookupByLibrary.simpleMessage(\"负载\"),\n    \"payloadTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"负载\"),\n    \"pendingHeader\" : MessageLookupByLibrary.simpleMessage(\"处理中\"),\n    \"phoneNumberTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"手机号码\"),\n    \"preferencesHeader\" : MessageLookupByLibrary.simpleMessage(\"偏好\"),\n    \"priceRequiredError\" : MessageLookupByLibrary.simpleMessage(\"请输入价格\"),\n    \"priceTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"价格\"),\n    \"privacyPolicyHeader\" : MessageLookupByLibrary.simpleMessage(\"隐私政策\"),\n    \"privateKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"私钥\"),\n    \"privateKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"私钥\"),\n    \"privateSaleHeader\" : MessageLookupByLibrary.simpleMessage(\"对私出售\"),\n    \"publicKeyParagraph\" : MessageLookupByLibrary.simpleMessage(\"以下是您的公钥。顾名思义，它可用作公开共享，并证明某个特定操作属于您的私钥。\"),\n    \"publicKeySheetHeader\" : MessageLookupByLibrary.simpleMessage(\"公钥\"),\n    \"publicKeyTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"公钥\"),\n    \"receiveAccountButton\" : MessageLookupByLibrary.simpleMessage(\"接收账号\"),\n    \"receiveAnAccountButton\" : MessageLookupByLibrary.simpleMessage(\"接收一个账号\"),\n    \"receiveButton\" : MessageLookupByLibrary.simpleMessage(\"接收\"),\n    \"receivedHeader\" : MessageLookupByLibrary.simpleMessage(\"已收到\"),\n    \"receivingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"收款方账号\"),\n    \"receivingAccountTextFieldHeader\" : MessageLookupByLibrary.simpleMessage(\"收款账号\"),\n    \"recoverFundsOPDetails\" : MessageLookupByLibrary.simpleMessage(\"恢复资金 (%1)\"),\n    \"removedFromContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"已将%1从联系人中删除\"),\n    \"requestButton\" : MessageLookupByLibrary.simpleMessage(\"请求\"),\n    \"requestSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"请求\"),\n    \"scanQRCodeButton\" : MessageLookupByLibrary.simpleMessage(\"扫描二维码\"),\n    \"searchAccountNameButton\" : MessageLookupByLibrary.simpleMessage(\"搜索账号名\"),\n    \"searchForNameButton\" : MessageLookupByLibrary.simpleMessage(\"搜索名字\"),\n    \"searchNameButton\" : MessageLookupByLibrary.simpleMessage(\"搜索名字\"),\n    \"securityFirstHeader\" : MessageLookupByLibrary.simpleMessage(\"安全第一\"),\n    \"securityHeader\" : MessageLookupByLibrary.simpleMessage(\"安全设置\"),\n    \"sellerAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"卖方账号\"),\n    \"sendAmountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"发送金额\"),\n    \"sendButton\" : MessageLookupByLibrary.simpleMessage(\"发送\"),\n    \"sendConfirmationButton\" : MessageLookupByLibrary.simpleMessage(\"确认发送\"),\n    \"sendSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"发送\"),\n    \"sendingAccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"发送方账号\"),\n    \"sendingConfirmParagraph\" : MessageLookupByLibrary.simpleMessage(\"确认您的交易信息以发送。\"),\n    \"sendingSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"正在发送\"),\n    \"sentHeader\" : MessageLookupByLibrary.simpleMessage(\"已发送\"),\n    \"sentParagraph\" : MessageLookupByLibrary.simpleMessage(\"成功发送交易。\"),\n    \"sentSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"已发送\"),\n    \"setToDefaultButton\" : MessageLookupByLibrary.simpleMessage(\"设为默认\"),\n    \"settingsHeader\" : MessageLookupByLibrary.simpleMessage(\"设置\"),\n    \"shareHeader\" : MessageLookupByLibrary.simpleMessage(\"分享Blaise\"),\n    \"showButton\" : MessageLookupByLibrary.simpleMessage(\"显示\"),\n    \"signeraccountOPDetails\" : MessageLookupByLibrary.simpleMessage(\"签署账号\"),\n    \"somethingWentWrongError\" : MessageLookupByLibrary.simpleMessage(\"出错了，请稍后再试\"),\n    \"successfullyImportedContactsParagraph\" : MessageLookupByLibrary.simpleMessage(\"成功导入%1个联系人\"),\n    \"systemDefaultHeader\" : MessageLookupByLibrary.simpleMessage(\"系统默认\"),\n    \"themeCopperHeader\" : MessageLookupByLibrary.simpleMessage(\"铜色\"),\n    \"themeDarkHeader\" : MessageLookupByLibrary.simpleMessage(\"暗色\"),\n    \"themeHeader\" : MessageLookupByLibrary.simpleMessage(\"主题\"),\n    \"themeLightHeader\" : MessageLookupByLibrary.simpleMessage(\"高亮\"),\n    \"threeCharacterNameError\" : MessageLookupByLibrary.simpleMessage(\"账号名最少要三个字符\"),\n    \"timeOPDetails\" : MessageLookupByLibrary.simpleMessage(\"时间戳\"),\n    \"totalBalanceHeader\" : MessageLookupByLibrary.simpleMessage(\"总余额\"),\n    \"transactionOPDetails\" : MessageLookupByLibrary.simpleMessage(\"交易 (%1)\"),\n    \"transferAccountHeader\" : MessageLookupByLibrary.simpleMessage(\"转让账号\"),\n    \"transferButton\" : MessageLookupByLibrary.simpleMessage(\"转让账号\"),\n    \"transferParagraph\" : MessageLookupByLibrary.simpleMessage(\"在下方输入公钥，将此账号的所有权转移给它。\"),\n    \"transferSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"转让\"),\n    \"transferredHeader\" : MessageLookupByLibrary.simpleMessage(\"已转让\"),\n    \"transferredParagraph\" : MessageLookupByLibrary.simpleMessage(\"您的帐号已成功转移给下方的公钥。\"),\n    \"transferredSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"已转让\"),\n    \"transferringParagraph\" : MessageLookupByLibrary.simpleMessage(\"请确认以下公钥，此账号将转移给它。\"),\n    \"transferringSheetHeader\" : MessageLookupByLibrary.simpleMessage(\"正在转让\"),\n    \"undefinedHeader\" : MessageLookupByLibrary.simpleMessage(\"未定义操作\"),\n    \"unencryptedKeyButton\" : MessageLookupByLibrary.simpleMessage(\"显示未加密私钥\"),\n    \"uninstallDisclaimerParagraph\" : MessageLookupByLibrary.simpleMessage(\"如果您丢失了该设备或者卸载了Blaise钱包，您需要使用私钥来恢复资金。\"),\n    \"unknownOPDetails\" : MessageLookupByLibrary.simpleMessage(\"未知操作 (%1)\"),\n    \"unlockButton\" : MessageLookupByLibrary.simpleMessage(\"解锁\"),\n    \"unlockWithBiometricsButton\" : MessageLookupByLibrary.simpleMessage(\"生物特征解锁\"),\n    \"unlockWithPINButton\" : MessageLookupByLibrary.simpleMessage(\"用识别码解锁\"),\n    \"urlChangedToParagraph\" : MessageLookupByLibrary.simpleMessage(\"将URL变更为 %1\"),\n    \"viewPublicKeyHeader\" : MessageLookupByLibrary.simpleMessage(\"查看公钥\"),\n    \"warningHeader\" : MessageLookupByLibrary.simpleMessage(\"警告\"),\n    \"welcomeParagraph\" : MessageLookupByLibrary.simpleMessage(\"欢迎使用Blaise钱包。下一步，您可以创建新私钥或导入现有私钥。\"),\n    \"yesAddFeeButton\" : MessageLookupByLibrary.simpleMessage(\"确认添加手续费\"),\n    \"yesHeader\" : MessageLookupByLibrary.simpleMessage(\"是\"),\n    \"yesImSureButton\" : MessageLookupByLibrary.simpleMessage(\"确定\"),\n    \"zeroAmountError\" : MessageLookupByLibrary.simpleMessage(\"金额不能为0\"),\n    \"zeroPriceError\" : MessageLookupByLibrary.simpleMessage(\"价格不能为0\")\n  };\n}\n"
  },
  {
    "path": "lib/localization.dart",
    "content": "import 'dart:async';\n\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\n//import 'package:natrium_wallet_flutter/model/available_language.dart';\n\nimport 'l10n/messages_all.dart';\n\n/// Localization\nclass AppLocalization {\n  static Locale currentLocale = Locale('en', 'US');\n\n  static Future<AppLocalization> load(Locale locale) {\n    currentLocale = locale;\n    final String name =\n        locale.countryCode == null ? locale.languageCode : locale.toString();\n    final String localeName = Intl.canonicalizedLocale(name);\n\n    return initializeMessages(localeName).then((bool _) {\n      Intl.defaultLocale = localeName;\n      return AppLocalization();\n    });\n  }\n\n  static AppLocalization of(BuildContext context) {\n    return Localizations.of<AppLocalization>(context, AppLocalization);\n  }\n\n  // **** BUTTONS **** //\n  String get newPrivateKeyButton {\n    return Intl.message(\"New Private Key\",\n        desc: 'A button that creates a new private key',\n        name: 'newPrivateKeyButton');\n  }\n\n  String get importPrivateKeyButton {\n    return Intl.message(\"Import Private Key\",\n        desc: 'A button that imports a private key',\n        name: 'importPrivateKeyButton');\n  }\n\n  String get gotItButton {\n    return Intl.message(\"Got It!\",\n        desc: 'A button that implies a message is understood',\n        name: 'gotItButton');\n  }\n\n  String get goBackButton {\n    return Intl.message(\"Go Back\",\n        desc: 'A button to go back to previous screen', name: 'goBackButton');\n  }\n\n  String get copyButton {\n    return Intl.message(\"Copy\",\n        desc: 'A button to copy something', name: 'copyButton');\n  }\n\n  String get copiedButton {\n    return Intl.message(\"Copied\",\n        desc: 'A button to inform the user that something has been copied',\n        name: 'copiedButton');\n  }\n\n  String get keyCopiedButton {\n    return Intl.message(\"Key Copied\",\n        desc: 'A button to inform the user that the key has been copied',\n        name: 'keyCopiedButton');\n  }\n\n  String get iHaveBackedItUpButton {\n    return Intl.message(\"I've Backed It Up\",\n        desc: 'A button to confirm that something is backed up',\n        name: 'iHaveBackedItUpButton');\n  }\n\n  String get yesImSureButton {\n    return Intl.message(\"Yes, I'm Sure\",\n        desc: 'A button to confirm if the user is sure',\n        name: 'yesImSureButton');\n  }\n\n  String get noGoBackButton {\n    return Intl.message(\"No, Go Back\",\n        desc:\n            'A button to go back to previous screen if the user didnt do what the question asks',\n        name: 'noGoBackButton');\n  }\n\n  String get getAnAccountButton {\n    return Intl.message(\"Get an Account\",\n        desc: 'A button to start the process of getting an account',\n        name: 'getAnAccountButton');\n  }\n\n  String get getAFreeAccountButton {\n    return Intl.message(\"Get a Free Account\",\n        desc: 'A button to start the process of getting a free account',\n        name: 'getAFreeAccountButton');\n  }\n\n  String get buyAnAccountButton {\n    return Intl.message(\"Buy an Account\",\n        desc: 'A button to start the process of buying an account',\n        name: 'buyAnAccountButton');\n  }\n\n  String get sendConfirmationButton {\n    return Intl.message(\"Send Confirmation\",\n        desc: 'A button to request a confirmation to be sent',\n        name: 'sendConfirmationButton');\n  }\n\n  String get confirmButton {\n    return Intl.message(\"Confirm\",\n        desc: 'A button to confirm that a process should be executed',\n        name: 'confirmButton');\n  }\n\n  String get borrowAnAccountButton {\n    return Intl.message(\"Borrow An Account\",\n        desc: 'A button to borrow an account', name: 'borrowAnAccountButton');\n  }\n\n  String get importButton {\n    return Intl.message(\"Import\",\n        desc: 'A button to import something', name: 'importButton');\n  }\n\n  String get receiveButton {\n    return Intl.message(\"Receive\",\n        desc: 'A button to receive Pascal', name: 'receiveButton');\n  }\n\n  String get sendButton {\n    return Intl.message(\"Send\",\n        desc: 'A button to send Pascal', name: 'sendButton');\n  }\n\n  String get copyAddressButton {\n    return Intl.message(\"Copy Address\",\n        desc: 'A button to copy an address', name: 'copyAddressButton');\n  }\n\n  String get copiedAddressButton {\n    return Intl.message(\"Address Copied\",\n        desc: 'A button to inform the user that the address has been copied',\n        name: 'copiedAddressButton');\n  }\n\n  String get addToContactsButton {\n    return Intl.message(\"Add to Contacts\",\n        desc: 'A button to add an account to contacts',\n        name: 'addToContactsButton');\n  }\n\n  String get operationDetailsButton {\n    return Intl.message(\"Operation Details\",\n        desc: 'A button to view the details of an operation',\n        name: 'operationDetailsButton');\n  }\n\n  String get openInExplorerButton {\n    return Intl.message(\"Open in Explorer\",\n        desc:\n            'A button to view the details of an operation on the Pascal explorer',\n        name: 'openInExplorerButton');\n  }\n\n  String get requestButton {\n    return Intl.message(\"Request\",\n        desc: 'A button to request something', name: 'requestButton');\n  }\n\n  String get addAPayloadButton {\n    return Intl.message(\"+ Add a Payload\",\n        desc: 'A button to add a payload (note) to an operation',\n        name: 'addAPayloadButton');\n  }\n\n  String get addADurationButton {\n    return Intl.message(\"+ Add a Duration\",\n        desc: 'A button to add a duration to the sale',\n        name: 'addADurationButton');\n  }\n\n  String get scanQRCodeButton {\n    return Intl.message(\"Scan QR Code\",\n        desc: 'A button to scan a QR Code', name: 'scanQRCodeButton');\n  }\n\n  String get cancelButton {\n    return Intl.message(\"Cancel\",\n        desc: 'A button to cancel a process', name: 'cancelButton');\n  }\n\n  String get closeButton {\n    return Intl.message(\"Close\",\n        desc: 'A button to close a screen or a pop-up', name: 'closeButton');\n  }\n\n  String get changeNameButton {\n    return Intl.message(\"Change Name\",\n        desc: 'A button to change the name of an account',\n        name: 'changeNameButton');\n  }\n\n  String get transferButton {\n    return Intl.message(\"Transfer\",\n        desc: 'A button to transfer the ownership of an account',\n        name: 'transferButton');\n  }\n\n  String get listForSaleButton {\n    return Intl.message(\"List for Sale\",\n        desc: 'A button to list an account for sale',\n        name: 'listForSaleButton');\n  }\n\n  String get createPrivateSaleButton {\n    return Intl.message(\"Create Private Sale\",\n        desc: 'A button to create a private sale for the account',\n        name: 'createPrivateSaleButton');\n  }\n\n  String get yesAddFeeButton {\n    return Intl.message(\"Yes, Add Fee\",\n        desc: 'A button to confirm the addition of a fee to an operation',\n        name: 'yesAddFeeButton');\n  }\n\n  String get unlockButton {\n    return Intl.message(\"Unlock\",\n        desc: 'A button to unlock the wallet', name: 'unlockButton');\n  }\n\n  String get unlockWithBiometricsButton {\n    return Intl.message(\"Unlock with Biometrics\",\n        desc: 'A button to unlock the wallet using biometrics',\n        name: 'unlockWithBiometricsButton');\n  }\n\n  String get unlockWithPINButton {\n    return Intl.message(\"Unlock with PIN\",\n        desc: 'A button to unlock the wallet using PIN',\n        name: 'unlockWithPINButton');\n  }\n\n  String get setToDefaultButton {\n    return Intl.message(\"Set to Default\",\n        desc: 'A button to set something to its default',\n        name: 'setToDefaultButton');\n  }\n\n  String get changeDaemonButton {\n    return Intl.message(\"Change Daemon\",\n        desc: 'A button to change the Pascal daemon for RPC requests',\n        name: 'changeDaemonButton');\n  }\n\n  String get addContactButton {\n    return Intl.message(\"Add Contact\",\n        desc: 'A button to add a contact', name: 'addContactButton');\n  }\n\n  String get encryptedKeyButton {\n    return Intl.message(\"Encrypted Key\",\n        desc: 'A button to view the encrypted key', name: 'encryptedKeyButton');\n  }\n\n  String get unencryptedKeyButton {\n    return Intl.message(\"Unencrypted Key\",\n        desc: 'A button to view the unencrypted key',\n        name: 'unencryptedKeyButton');\n  }\n\n  String get encryptButton {\n    return Intl.message(\"Encrypt\",\n        desc: 'A button to encrypt the private key with a password', name: 'encryptButton');\n  }\n\n  String get showButton {\n    return Intl.message(\"Show\",\n        desc: 'A button to show something that is hidden', name: 'showButton');\n  }\n\n  String get hideButton {\n    return Intl.message(\"Hide\",\n        desc: 'A button to hide something that is shown', name: 'hideButton');\n  }\n\n  String get copyEncryptedKeyButton {\n    return Intl.message(\"Copy Encrypted Key\",\n        desc: 'A button to copy an encrypted key',\n        name: 'copyEncryptedKeyButton');\n  }\n\n  String get copyUnencryptedKeyButton {\n    return Intl.message(\"Copy Unencrypted Key\",\n        desc: 'A button to copy an unencrypted key',\n        name: 'copyUnencryptedKeyButton');\n  }\n\n  String get copyKeyButton {\n    return Intl.message(\"Copy Key\",\n        desc: 'A button to copy a key (private or public key)',\n        name: 'copyKeyButton');\n  }\n\n  String get copyPublicKeyButton {\n    return Intl.message(\"Copy Public Key\",\n        desc: 'A button to copy a public key', name: 'copyPublicKeyButton');\n  }\n\n  String get deletePrivateKeyAndLogoutButton {\n    return Intl.message(\"Delete Private Key\\nAnd Logout\",\n        desc: 'A button to delete the private key and logout',\n        name: 'deletePrivateKeyAndLogoutButton');\n  }\n\n  String get searchForNameButton {\n    return Intl.message(\"Search For Name\",\n        desc: 'A button to search for an account name',\n        name: 'searchForNameButton');\n  }\n\n  String get searchAccountNameButton {\n    return Intl.message(\"Search Account Name\",\n        desc: 'A button to search an account name',\n        name: 'searchAccountNameButton');\n  }\n\n  String get searchNameButton {\n    return Intl.message(\"Search Name\",\n        desc: 'A button to search name', name: 'searchNameButton');\n  }\n\n  String get okayGoBackButton {\n    return Intl.message(\"Okay, Go Back\",\n        desc: 'A button to confirm and go back', name: 'okayGoBackButton');\n  }\n\n  String get okayButton {\n    return Intl.message(\"Okay\",\n      desc: 'A button that simply indicates a neutral action, like closing an informative dialog', name: 'okayButton');\n  }\n\n  String get nextButton {\n    return Intl.message(\"Next\",\n        desc: 'A button to the next screen', name: 'nextButton');\n  }\n  String get receiveAccountButton {\n    return Intl.message(\"Receive Account\",\n        desc: 'A button to open up the public key sheet(screen) that displays a QR code to receive an account', name: 'receiveAccountButton');\n  }\n  String get receiveAnAccountButton {\n    return Intl.message(\"Receive an Account\",\n        desc: 'A button to open up the public key sheet(screen) that displays a QR code to receive an account', name: 'receiveAnAccountButton');\n  }\n\n  String get supportButton {\n    return Intl.message(\"Support\",\n        desc: 'A button to open up the live support window', name: 'supportButton');\n  }\n  String get liveSupportButton {\n    return Intl.message(\"Support\",\n        desc: 'A button to open up the live support window', name: 'liveSupportButton');\n  }\n  // **** BUTTONS END **** //\n\n  // **** PARAGRAPHS **** //\n\n  String get welcomeParagraph {\n    return Intl.message(\n        \"Welcome to Blaise Wallet. To begin, you can create a new private key or import one.\",\n        desc: 'A paragraph that greets the user in the initial opening',\n        name: 'welcomeParagraph');\n  }\n\n  String get newKeySecurityParagraph {\n    return Intl.message(\n        \"In the next screen, you'll see your new private key. It is a password to access your funds. It is crucial that you back it up and never share it with anyone.\",\n        desc:\n            'A paragraph that explains what users should do with their new private key',\n        name: 'newKeySecurityParagraph');\n  }\n\n  String get uninstallDisclaimerParagraph {\n    return Intl.message(\n        \"If you lose your device or uninstall Blaise Wallet, you'll need your private key to recover your funds.\",\n        desc:\n            'A paragraph that gives a security disclaimer about what happens if the wallet is uninstalled',\n        name: 'uninstallDisclaimerParagraph');\n  }\n\n  String get newPrivateKeyParagraph {\n    return Intl.message(\n        \"Below is your new wallet’s private key. It is crucial that you backup your private key and never store it as plaintext or a screenshot. We recommend writing it on a piece of paper and storing it offline.\",\n        desc:\n            'A paragraph that explains what users should do with their new private key',\n        name: 'newPrivateKeyParagraph');\n  }\n\n  String get newKeyBackUpConfirmParagraph {\n    return Intl.message(\n        \"Are you sure that you have backed up your new wallet’s private key?\",\n        desc: 'A paragraph to confirm if the new private key is backed up',\n        name: 'newKeyBackUpConfirmParagraph');\n  }\n\n  String get newWalletGreetingParagraph {\n    return Intl.message(\n        \"Welcome to <colored>Blaise Wallet</colored>.\\nYou can start by getting an account.\",\n        desc: 'A paragraph to greet the user when a new wallet is created',\n        name: 'newWalletGreetingParagraph');\n  }\n\n  String get getAccountFirstParagraph {\n    return Intl.message(\"There are 2 options for getting your first account:\",\n        desc:\n            'The first paragraph of the explanation for the process of getting an account',\n        name: 'getAccountFirstParagraph');\n  }\n\n  String get getAccountSecondParagraph {\n    return Intl.message(\n        \"1- You can get a free account using your phone number. <colored>Only 1 account per phone number is allowed.</colored>\",\n        desc:\n            'The second paragraph of the explanation for the process of getting an account',\n        name: 'getAccountSecondParagraph');\n  }\n\n  String get getAccountThirdParagraph {\n    return Intl.message(\n        \"2- You can buy as many accounts as you want for <colored>%1 Pascal (%2).</colored>\",\n        desc:\n            'The third paragraph of the explanation for the process of getting an account',\n        name: 'getAccountThirdParagraph');\n  }\n\n  String get getAccountThirdParagraphAlternative {\n    return Intl.message(\n        \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> Buying only 1 account is allowed per user.</colored>\",\n        desc:\n            'The third paragraph of the explanation for the process of getting an account',\n        name: 'getAccountThirdParagraphAlternative');\n  }\n\n  String get getAccountThirdParagraphAlternative2 {\n    return Intl.message(\n        \"2- You can buy an account for <colored>%1 Pascal (%2).</colored><colored> You can buy up to %3 accounts.</colored>\",\n        desc:\n            'The third paragraph of the explanation for the process of getting an account',\n        name: 'getAccountThirdParagraphAlternative2');\n  }\n\n  String get enterPhoneNumberParagraph {\n    return Intl.message(\"Enter your phone number below.\",\n        desc:\n            'A paragraph that tells users to enter their phone number to the text field below',\n        name: 'enterPhoneNumberParagraph');\n  }\n\n  String get invalidPhoneNumberParagraph {\n    return Intl.message(\"Phone number is not valid\",\n      desc: 'User has entered an invalid phone number', name: 'invalidPhoneNumberParagraph');\n  }\n\n  String get enterConfirmationCodeParagraph {\n    return Intl.message(\n        \"We have sent you a confirmation code, please enter it below.\",\n        desc:\n            'A paragraph that tells users to enter the confirmation code to the text field below',\n        name: 'enterConfirmationCodeParagraph');\n  }\n\n  String get confirmationCodeError {\n    return Intl.message(\"Failed to verify code, ensure you've entered it correctly\",\n      desc: 'When a user enters their freepasa SMS code but it can\\'t be verified',\n      name: 'confirmationCodeError');\n  }\n\n  String get freepasaComplete {\n    return Intl.message(\"Success, your new account will be available after 1 network confirmation\",\n      desc: 'After the freepasa process is complete',\n      name: 'freepasaComplete');\n  }\n\n  String get unconfirmedAccountHeader {\n    return Intl.message(\"Unconfirmed Account\",\n      desc: 'A user has an account in their wallet that has been transferred to them, but isnt confirmed yet. This is the info dialog header.',\n      name: 'unconfirmedAccountHeader');\n  }\n\n  String get unconfirmedAccountParagraph {\n    return Intl.message(\"This is an <colored>unconfirmed account</colored>. It has been transferred to you, but there needs to be 1 network confirmation before you can use it. This usually takes about 5 minutes, once it's complete you'll be able to use this account.\",\n      desc: 'Explaining that an account can\\'t be used until 1 network confirmation to the user.',\n      name: 'unconfirmedAccountParagraph');\n  }\n\n\n  String get borrowStarted {\n    return Intl.message(\n      \"Purchase Started for %1\",\n      desc: \"Users may see this after starting the account purchase process\",\n      name: 'borrowStarted'\n    );\n  }\n\n  String get borrowAccountParagraph {\n    return Intl.message(\n        \"To buy an account, first you’ll need to borrow one for free. If you send at least <colored>%1 Pascal (%2)</colored> to the account within <colored>%3 days</colored>, the account will be yours and <colored>%1 Pascal</colored> will be deducted from your balance automatically.\\nOtherwise, it’ll return back to us at the end of <colored>%3 days</colored> and won’t belong to your wallet anymore.\\nIt is recommended you only send a small amount of coins until you own the account.\",\n        desc:\n            'A paragraph that explains the process of borrowing & buying an account',\n        name: 'borrowAccountParagraph');\n  }\n\n  String get importPrivateKeyParagraph {\n    return Intl.message(\"Enter your private key below.\",\n        desc:\n            'A paragraph that tells the user to enter their private key to the text field below',\n        name: 'importPrivateKeyParagraph');\n  }\n\n  String get looksLikeEncryptedKeyParagraph {\n    return Intl.message(\n        \"This looks like an encrypted private key, please enter the password to decrypt and import it.\",\n        desc:\n            'A paragraph that tells the user that the key looks like an encrypted one and it needs to be decrypted to import',\n        name: 'looksLikeEncryptedKeyParagraph');\n  }\n\n  // Settings Related Paragraphs\n  String get changeDaemonParagraph {\n    return Intl.message(\n        \"Enter an address to use a different Pascal daemon for RPC requests.\",\n        desc:\n            'A paragraph that tells the user to enter a new daemon address below',\n        name: 'changeDaemonParagraph');\n  }\n\n  String get urlChangedToParagraph {\n    return Intl.message(\"URL changed to %1\",\n        desc:\n            'A paragraph that tells the user that the URL is changed to the entered URL',\n        name: 'urlChangedToParagraph');\n  }\n\n  String get backupKeyFirstParagraph {\n    return Intl.message(\"You have 2 options for backing up your private key:\",\n        desc:\n            'The first paragraph of the explanation for the process of backing up the private key',\n        name: 'backupKeyFirstParagraph');\n  }\n\n  String get backupKeySecondParagraph {\n    return Intl.message(\n        \"1- Encrypted, which means it is protected by a password.\",\n        desc:\n            'The second paragraph of the explanation for the process of backing up the private key',\n        name: 'backupKeySecondParagraph');\n  }\n\n  String get backupKeyThirdParagraph {\n    return Intl.message(\n        \"2- Unencrypted, which means it is raw and not protected by a password.\",\n        desc:\n            'The third paragraph of the explanation for the process of backing up the private key',\n        name: 'backupKeyThirdParagraph');\n  }\n\n  String get backupKeyFourthParagraph {\n    return Intl.message(\n        \"We recommend storing the unencrypted version offline, by writing it on a piece of paper. You can store the encrypted version on a password manager for your convenience.\",\n        desc:\n            'The fourth paragraph of the explanation for the process of backing up the private key',\n        name: 'backupKeyFourthParagraph');\n  }\n\n  String get encryptKeyParagraph {\n    return Intl.message(\"Create a new password to encrypt your private key.\",\n        desc:\n            'A paragraph that tells the user to create a new password to encrypt their key',\n        name: 'encryptKeyParagraph');\n  }\n\n  String get backupEncryptedKeyFirstParagraph {\n    return Intl.message(\n        \"Below is your encrypted private key. It is protected by a password. You can store it safely on a password manager for your convenience.\",\n        desc:\n            'A paragraph that explains how an encrypted private key can be backed up',\n        name: 'backupEncryptedKeyFirstParagraph');\n  }\n\n  String get backupEncryptedKeySecondParagraph {\n    return Intl.message(\n        \"Since it is encrypted with your password, if you lose or forget your password, you won't be able to decrypt it and access your funds.\",\n        desc:\n            'A paragraph that gives a disclaimer about what would happen in case the password that was used to encrypt the private key is lost or forgotten',\n        name: 'backupEncryptedKeySecondParagraph');\n  }\n\n  String get backupUnencryptedKeyParagraph {\n    return Intl.message(\n        \"Below is your unencrypted private key. <colored>It is not protected by a password, which means it is crucial that you store it somewhere safe and offline.</colored> We recommend writing it on a piece of paper.\",\n        desc:\n            'A paragraph that explains the process of backing up the unencrypted private key',\n        name: 'backupUnencryptedKeyParagraph');\n  }\n\n  String get publicKeyParagraph {\n    return Intl.message(\n        \"Below is your public key. As the name suggests, it is intended to be shared publicly and prove that a particular operation belongs to your private key.\",\n        desc: 'A paragraph that explains what a public key is',\n        name: 'publicKeyParagraph');\n  }\n\n  String get borrowedAccountParagraph {\n    return Intl.message(\n        \"This is a <colored>borrowed account</colored>.\\nIf you send at least <colored>%1 Pascal</colored> to it in the next <colored>%2 days, %3 hours, and %4 minutes</colored>, it’ll be yours.\",\n        desc: 'A paragraph that explains what a borrowed account is',\n        name: 'borrowedAccountParagraph');\n  }\n\n  String get borrowedAccountPaidParagraph {\n    return Intl.message(\n        \"<colored>Your account has been purchased!</colored>\\nThe transfer is currently processing. This process usually takes about <colored>15 minutes</colored>, in some cases it may take slightly longer.\",\n        desc: 'A paragraph that explains that the account has been purchased and transfer is currently processing',\n        name: 'borrowedAccountPaidParagraph');\n  }\n\n\n  String get logoutFirstDisclaimerParagraph {\n    return Intl.message(\n        \"<colored>Logging out will remove your private key and all Blaise related data from this device.</colored> If your private key is not backed up, you will never be able to access your funds again. If your private key is backed up, you have nothing to worry about.\",\n        desc:\n            'The first part of the disclaimer that is shown when the user tries to log out.',\n        name: 'logoutFirstDisclaimerParagraph');\n  }\n\n  String get logoutSecondDisclaimerParagraph {\n    return Intl.message(\n        \"Are you sure that you've backed up your private key? <colored>As long as you've backed up your private key, you have nothing to worry about.</colored>\",\n        desc:\n            'The second part of the disclaimer that is shown when the user tries to log out.',\n        name: 'logoutSecondDisclaimerParagraph');\n  }\n  // Settings related paragraphs END\n\n  // Operation Related Paragraphs\n  String get noResultsFound {\n    return Intl.message(\"No results found\",\n      desc: 'When searching for account name has returned 0 results',\n      name: 'noResultsFound');\n  }\n\n  String get sendingConfirmParagraph {\n    return Intl.message(\"Confirm the transaction details to send.\",\n        desc:\n            'A paragraph that tells the user to confirm the info below to send',\n        name: 'sendingConfirmParagraph');\n  }\n\n  String get sentParagraph {\n    return Intl.message(\"Transaction has been sent succesfully.\",\n        desc:\n            'A paragraph that informs the user that the transaction has been sent succesfully',\n        name: 'sentParagraph');\n  }\n\n  String get changeNameParagraph {\n    return Intl.message(\"Enter a name below to change your account's name.\",\n        desc:\n            'A paragraph that tells the user to enter a new account name below',\n        name: 'changeNameParagraph');\n  }\n\n  String get changingNameParagraph {\n    return Intl.message(\"Confirm your new account name to proceed.\",\n        desc: 'A paragraph that tells the user to confirm the new account name',\n        name: 'changingNameParagraph');\n  }\n\n  String get changedNameParagraph {\n    return Intl.message(\"Your account name has been changed successfully.\",\n        desc:\n            'A paragraph that informs the user that the account name has been changed successfully',\n        name: 'changedNameParagraph');\n  }\n\n  String get transferParagraph {\n    return Intl.message(\n        \"Enter a public key below to transfer the ownership of this account to it.\",\n        desc:\n            'A paragraph that tells the user to enter a public key to the text field below to transfer the ownership of the account',\n        name: 'transferParagraph');\n  }\n\n  String get transferringParagraph {\n    return Intl.message(\n        \"Confirm the public key below to transfer the ownership of this account to it.\",\n        desc:\n            'A paragraph that tells the user to confirm the public key below to proceed with the transfer',\n        name: 'transferringParagraph');\n  }\n\n  String get transferredParagraph {\n    return Intl.message(\n        \"Your account has been transferred successfully to the public key below.\",\n        desc:\n            'A paragraph that informs the user that the account transfer has been completed successfully',\n        name: 'transferredParagraph');\n  }\n\n  String get listForSaleParagraph {\n    return Intl.message(\n        \"Enter a price and an account that will be receiving the payment to list this account for sale.\",\n        desc:\n            'A paragraph that tells the user to enter a price and a receiver account to list the account for sale',\n        name: 'listForSaleParagraph');\n  }\n\n  String get listingForSaleParagraph {\n    return Intl.message(\n        \"Confirm the price and the account that will be receiving the payment.\",\n        desc:\n            'A paragraph that tells the user to confirm the price and the receiver account',\n        name: 'listingForSaleParagraph');\n  }\n\n  String get listedForSaleParagraph {\n    return Intl.message(\n        \"Your account has been successfully listed for sale. We’ll let you know if someone buys it.\",\n        desc:\n            'A paragraph that informs the user that the account has been listed for sale successfully',\n        name: 'listedForSaleParagraph');\n  }\n\n  String get createPrivateSaleParagraph {\n    return Intl.message(\n        \"Enter a price, a receiving account, and a public key below to create a private sale for this account.\",\n        desc:\n            'A paragraph that tells the user to enter a price, a receiver account, and a public key to create a private sale for the account',\n        name: 'createPrivateSaleParagraph');\n  }\n\n  String get creatingPrivateSaleParagraph {\n    return Intl.message(\"Confirm the information below.\",\n        desc:\n            'A paragraph that tells the user to confirm the information below.',\n        name: 'creatingPrivateSaleParagraph');\n  }\n\n  String get createdPrivateSaleParagraph {\n    return Intl.message(\n        \"The private sale has been created successfully. We’ll let you know if it is bought.\",\n        desc:\n            'A paragraph that informs the user that the private sale has been created successfully',\n        name: 'createdPrivateSaleParagraph');\n  }\n\n  String get delistFromSaleParagraph {\n    return Intl.message(\n        \"Confirm that you would like to delist this account from sale.\",\n        desc:\n            'A paragraph that tells the users to confirm that they would like to delist the account from sale.',\n        name: 'delistFromSaleParagraph');\n  }\n\n  String get delistedFromSaleParagraph {\n    return Intl.message(\n        \"Your account has been successfully delisted from sale.\",\n        desc:\n            'A paragraph that informs the user that the account has been delisted from sale successfully',\n        name: 'delistedFromSaleParagraph');\n  }\n  // Operation Related Paragraphs END\n\n  String get feeRequiredParagraph {\n    return Intl.message(\"This operation requires a fee.\",\n        desc: 'A paragraph to indicate that the operation requires a fee',\n        name: 'feeRequiredParagraph');\n  }\n\n  String get feeConfirmAmountParagraph {\n    return Intl.message(\n        \"Please confirm the addition of %1 Pascal fee to this operation to continue.\",\n        desc: 'A paragraph to tell the user to confirm the addition of a fee',\n        name: 'feeConfirmAmountParagraph');\n  }\n\n  String get keyTypeNotSupportedParagraph {\n    return Intl.message(\n        \"This type of private key is not yet supported by Blaise. You may create a new private key and transfer your accounts to it using a different wallet.\",\n        desc:\n            'A paragraph to tell the user that the private key type is not supported',\n        name: 'keyTypeNotSupportedParagraph');\n  }\n\n  // PIN Screen\n  String get enterPINToUnlockParagraph {\n    return Intl.message(\"Enter PIN to unlock Blaise\",\n        desc:\n            'A paragraph that tells the user to enter the PIN to unlock the wallet',\n        name: 'enterPINToUnlockParagraph');\n  }\n\n  String get authenticateToUnlockParagraph {\n    return Intl.message(\"Authenticate to Unlock Blaise\",\n        desc:\n            'A paragraph that tells the user to authenticate to unlock the wallet',\n        name: 'authenticateToUnlockParagraph');\n  }\n\n  String get manyFailedAttemptsParagraph {\n    return Intl.message(\"Too many failed unlock attempts\",\n        desc:\n            'A paragraph to inform the user that there was too many failed unlock attempts',\n        name: 'manyFailedAttemptsParagraph');\n  }\n\n  String get authenticateToChangeNameParagraph {\n    return Intl.message(\"Authenticate to change account name to \\\"%1\\\"\",\n        desc:\n            'A paragraph that tells the user to authenticate to change the name of the account',\n        name: 'authenticateToChangeNameParagraph');\n  }\n\n  String get authenticateToDelistParagraph {\n    return Intl.message(\"Authenticate to delist the account from sale\",\n        desc:\n            'A paragraph that tells the user to authenticate to delist the account from sale',\n        name: 'authenticateToDelistParagraph');\n  }\n\n  String get authenticateToListForSaleParagraph {\n    return Intl.message(\"Authenticate to list account for sale\",\n        desc:\n            'A paragraph that tells the user to authenticate to list the account for sale',\n        name: 'authenticateToListForSaleParagraph');\n  }\n\n  String get authenticateToCreatePrivateSaleParagraph {\n    return Intl.message(\"Authenticate to create private sale\",\n        desc:\n            'A paragraph that tells the user to authenticate to create a private sale for the account',\n        name: 'authenticateToCreatePrivateSaleParagraph');\n  }\n\n  String get authenticateToTransferParagraph {\n    return Intl.message(\"Authenticate to transfer account\",\n        desc:\n            'A paragraph that tells the user to authenticate to transfer the ownership of the account',\n        name: 'authenticateToTransferParagraph');\n  }\n\n  String get authenticateToSendParagraph {\n    return Intl.message(\"Authenticate to send %1 Pascal\",\n        desc:\n            'A paragraph that tells the user to authenticate to send a specified amount of Pascal',\n        name: 'authenticateToSendParagraph');\n  }\n\n  String get authenticateToBackUpParagraph {\n    return Intl.message(\"Authenticate to back up private key\",\n        desc:\n            'A paragraph that tells the user to authenticate to back up the private key',\n        name: 'authenticateToBackUpParagraph');\n  }\n\n  String get invalidPINParagraph {\n    return Intl.message(\"Invalid PIN\",\n        desc: 'A paragraph that tells the user that the entered PIN is invalid',\n        name: 'invalidPINParagraph');\n  }\n\n  String get noMatchPINParagraph {\n    return Intl.message(\"PINs do not match\",\n        desc:\n            'A paragraph that tells the user that the entered PINs do not match',\n        name: 'noMatchPINParagraph');\n  }\n\n  String get confirmPINParagraph {\n    return Intl.message(\"Confirm your PIN\",\n        desc: 'A paragraph that tells the user to confirm the PIN',\n        name: 'confirmPINParagraph');\n  }\n\n  String get enterPINParagraph {\n    return Intl.message(\"Enter PIN\",\n        desc: 'A paragraph that tells the user to enter the PIN',\n        name: 'enterPINParagraph');\n  }\n\n  String get createPINParagraph {\n    return Intl.message(\"Create a 6-digit PIN\",\n        desc: 'A paragraph that tells the user to create a PIN',\n        name: 'createPINParagraph');\n  }\n  // PIN Screen END\n\n  String get addedToContactsParagraph {\n    return Intl.message(\"%1 added to contacts\",\n        desc:\n            'A paragraph that tells the user that the contact has been added to contacts',\n        name: 'addedToContactsParagraph');\n  }\n\n  String get removedFromContactsParagraph {\n    return Intl.message(\"Removed %1 from contacts\",\n        desc:\n            'A paragraph that tells the user that the contact has been removed from contacts',\n        name: 'removedFromContactsParagraph');\n  }\n\n  String get failedToRemoveFromContactsParagraph {\n    return Intl.message(\"Failed to remove %1 from contacts\",\n        desc:\n            'A paragraph that tells the user that the contact removel process is failed',\n        name: 'failedToRemoveFromContactsParagraph');\n  }\n\n  String get successfullyImportedContactsParagraph {\n    return Intl.message(\"Successfully imported %1 contacts\",\n        desc:\n            'A paragraph to tell the user that a specific number of contacts was successfully imported',\n        name: 'successfullyImportedContactsParagraph');\n  }\n\n  String get checkOutBlaiseParagraph {\n    return Intl.message(\n        \"Check out Blaise! Simple, sleek & secure Pascal wallet for iOS and Android: https://blaisewallet.com\",\n        desc:\n            'A paragraph that is shared when the user shares Blaise with others via the option in the settings',\n        name: 'checkOutBlaiseParagraph');\n  }\n\n  String get newAccountParagraph {\n    return Intl.message(\n        \"This is your new account.\\nOnce you receive <colored>Pascal</colored>, operations will show up like below.\",\n        desc:\n            'A paragraph that is shown in the operations list of a new account as an explainer',\n        name: 'newAccountParagraph');\n  }\n  // **** PARAGRAPHS END **** //\n\n  // **** HEADERS **** //\n  // Settings Headers\n  String get settingsHeader {\n    return Intl.message(\"Settings\",\n        desc: 'Header for the settings', name: 'settingsHeader');\n  }\n\n  String get preferencesHeader {\n    return Intl.message(\"Preferences\",\n        desc: 'Header for the preferences section', name: 'preferencesHeader');\n  }\n\n  String get currencyHeader {\n    return Intl.message(\"Currency\",\n        desc: 'Header for the currencies', name: 'currencyHeader');\n  }\n\n  String get languageHeader {\n    return Intl.message(\"Language\",\n        desc: 'Header for the languages', name: 'languageHeader');\n  }\n\n  String get languageColonHeader {\n    return Intl.message(\"Language:\",\n        desc: 'Header for the language option on welcome page', name: 'languageColonHeader');\n  }\n\n  String get systemDefaultHeader {\n    return Intl.message(\"System Default\",\n        desc: 'Header for system default', name: 'systemDefaultHeader');\n  }\n\n  String get themeHeader {\n    return Intl.message(\"Theme\",\n        desc: 'Header for the themes', name: 'themeHeader');\n  }\n\n  String get themeLightHeader {\n    return Intl.message(\"Light\",\n        desc: 'Header for the light theme', name: 'themeLightHeader');\n  }\n\n  String get themeDarkHeader {\n    return Intl.message(\"Dark\",\n        desc: 'Header for the dark theme', name: 'themeDarkHeader');\n  }\n\n  String get themeCopperHeader {\n    return Intl.message(\"Copper\",\n        desc: 'Header for the copper theme', name: 'themeCopperHeader');\n  }\n\n  String get notificationsHeader {\n    return Intl.message(\"Notifications\",\n        desc: 'Header for the notifications', name: 'notificationsHeader');\n  }\n\n  String get securityHeader {\n    return Intl.message(\"Security\",\n        desc: 'Header for the security section', name: 'securityHeader');\n  }\n\n  String get authenticationMethodHeader {\n    return Intl.message(\"Authentication Method\",\n        desc: 'Header for the authentication method',\n        name: 'authenticationMethodHeader');\n  }\n\n  String get authenticationPINHeader {\n    return Intl.message(\"PIN\",\n        desc: 'Header for the PIN authentication method',\n        name: 'authenticationPINHeader');\n  }\n\n  String get authenticationBiometricsHeader {\n    return Intl.message(\"Biometrics\",\n        desc: 'Header for the biometric authentication method',\n        name: 'authenticationBiometricsHeader');\n  }\n\n  String get authenticateOnLaunchHeader {\n    return Intl.message(\"Authenticate on Launch\",\n        desc: 'Header for the authenticate on launch option',\n        name: 'authenticateOnLaunchHeader');\n  }\n\n  String get yesHeader {\n    return Intl.message(\"Yes\",\n        desc: 'Header for the yes option', name: 'yesHeader');\n  }\n\n  String get noHeader {\n    return Intl.message(\"No\",\n        desc: 'Header for the no option', name: 'noHeader');\n  }\n\n  String get automaticallyLockHeader {\n    return Intl.message(\"Automatically Lock\",\n        desc: 'Header for the automatically lock option',\n        name: 'automaticallyLockHeader');\n  }\n\n  String get lockInstantHeader {\n    return Intl.message(\"Instantly\",\n        desc: 'Header for instantly locking option', name: 'lockInstantHeader');\n  }\n\n  String get lock1Header {\n    return Intl.message(\"After %1 minute\",\n        desc: 'Header for locking after 1 minute option', name: 'lock1Header');\n  }\n\n  String get lock5Header {\n    return Intl.message(\"After %1 minutes\",\n        desc: 'Header for locking after 5 minutes option', name: 'lock5Header');\n  }\n\n  String get lock15Header {\n    return Intl.message(\"After %1 minutes\",\n        desc: 'Header for locking after 15 minutes option',\n        name: 'lock15Header');\n  }\n\n  String get lock30Header {\n    return Intl.message(\"After %1 minutes\",\n        desc: 'Header for locking after 30 minutes option',\n        name: 'lock30Header');\n  }\n\n  String get lock60Header {\n    return Intl.message(\"After %1 minutes\",\n        desc: 'Header for locking after 60 minutes option',\n        name: 'lock60Header');\n  }\n\n  String get daemonHeader {\n    return Intl.message(\"Daemon\",\n        desc: 'Header for Pascal daemon setting', name: 'daemonHeader');\n  }\n\n  String get defaultHeader {\n    return Intl.message(\"Default\",\n        desc: 'Header for default option', name: 'defaultHeader');\n  }\n\n  String get manageHeader {\n    return Intl.message(\"Manage\",\n        desc: 'Header for the manage section', name: 'manageHeader');\n  }\n\n  String get contactsHeader {\n    return Intl.message(\"Contacts\",\n        desc: 'Header for the contacts section in settings',\n        name: 'contactsHeader');\n  }\n\n  String get backUpPrivateKeyHeader {\n    return Intl.message(\"Back Up Private Key\",\n        desc: 'Header for the back up private key option in settings',\n        name: 'backUpPrivateKeyHeader');\n  }\n\n  String get viewPublicKeyHeader {\n    return Intl.message(\"View Public Key\",\n        desc: 'Header for the view public key option in settings',\n        name: 'viewPublicKeyHeader');\n  }\n\n  String get shareHeader {\n    return Intl.message(\"Share Blaise\",\n        desc: 'Header for the share Blaise option in settings',\n        name: 'shareHeader');\n  }\n\n  String get logoutHeader {\n    return Intl.message(\"Logout\",\n        desc: 'Header for the logout option in settings', name: 'logoutHeader');\n  }\n\n  String get privacyPolicyHeader {\n    return Intl.message(\"Privacy Policy\",\n        desc: 'Header for the privacy policy option in settings',\n        name: 'privacyPolicyHeader');\n  }\n\n  // Settings Headers END\n\n  // Operations List Headers\n  String get changeAccountNameHeader {\n    return Intl.message(\"Change Account Name\",\n        desc:\n            'Header for the change account name option in other operations list',\n        name: 'changeAccountNameHeader');\n  }\n\n  String get transferAccountHeader {\n    return Intl.message(\"Transfer Account\",\n        desc: 'Header for the transfer account option in other operations list',\n        name: 'transferAccountHeader');\n  }\n\n  String get listAccountForSaleHeader {\n    return Intl.message(\"List Account For Sale\",\n        desc:\n            'Header for the list account for sale option in other operations list',\n        name: 'listAccountForSaleHeader');\n  }\n\n  String get createPrivateSaleHeader {\n    return Intl.message(\"Create Private Sale\",\n        desc:\n            'Header for the create private sale option in other operations list',\n        name: 'createPrivateSaleHeader');\n  }\n\n  String get delistFromSaleHeader {\n    return Intl.message(\"Delist From Sale\",\n        desc: 'Header for the delist from sale option in other operations list',\n        name: 'delistFromSaleHeader');\n  }\n  // Operations List Headers END\n\n  // Sheet Headers\n  String get getAccountSheetHeader {\n    return Intl.message(\"Get Account\",\n        desc: 'Header for the get account sheet (screen)',\n        name: 'getAccountSheetHeader');\n  }\n\n  String get freeAccountSheetHeader {\n    return Intl.message(\"Free Account\",\n        desc: 'Header for the free account sheet (screen)',\n        name: 'freeAccountSheetHeader');\n  }\n\n  String get buyAccountSheetHeader {\n    return Intl.message(\"Buy Account\",\n        desc: 'Header for the buy account sheet (screen)',\n        name: 'buyAccountSheetHeader');\n  }\n\n  String get sendSheetHeader {\n    return Intl.message(\"Send\",\n        desc: 'Header for send sheet (screen)', name: 'sendSheetHeader');\n  }\n\n  String get sendingSheetHeader {\n    return Intl.message(\"Sending\",\n        desc: 'Header for sending sheet (screen)', name: 'sendingSheetHeader');\n  }\n\n  String get sentSheetHeader {\n    return Intl.message(\"Sent\",\n        desc: 'Header for sent sheet (screen)', name: 'sentSheetHeader');\n  }\n\n  String get requestSheetHeader {\n    return Intl.message(\"Request\",\n        desc: 'Header for request sheet (screen)', name: 'requestSheetHeader');\n  }\n\n  String get changeNameSheetHeader {\n    return Intl.message(\"Change Name\",\n        desc: 'Header for change name sheet (screen)',\n        name: 'changeNameSheetHeader');\n  }\n\n  String get changingNameSheetHeader {\n    return Intl.message(\"Changing\",\n        desc: 'Header for name changing sheet (screen)',\n        name: 'changingNameSheetHeader');\n  }\n\n  String get changedNameSheetHeader {\n    return Intl.message(\"Changed\",\n        desc: 'Header for name changed sheet (screen)',\n        name: 'changedNameSheetHeader');\n  }\n\n  String get transferSheetHeader {\n    return Intl.message(\"Transfer\",\n        desc: 'Header for transfer sheet (screen)',\n        name: 'transferSheetHeader');\n  }\n\n  String get transferringSheetHeader {\n    return Intl.message(\"Transferring\",\n        desc: 'Header for transferring sheet (screen)',\n        name: 'transferringSheetHeader');\n  }\n\n  String get transferredSheetHeader {\n    return Intl.message(\"Transferred\",\n        desc: 'Header for transferred sheet (screen)',\n        name: 'transferredSheetHeader');\n  }\n\n  String get listForSaleSheetHeader {\n    return Intl.message(\"List For Sale\",\n        desc: 'Header for list for sale sheet (screen)',\n        name: 'listForSaleSheetHeader');\n  }\n\n  String get listingForSaleSheetHeader {\n    return Intl.message(\"Listing\",\n        desc: 'Header for listing for sale sheet (screen)',\n        name: 'listingForSaleSheetHeader');\n  }\n\n  String get listedForSaleSheetHeader {\n    return Intl.message(\"Listed\",\n        desc: 'Header for listed for sale sheet (screen)',\n        name: 'listedForSaleSheetHeader');\n  }\n\n  String get createPrivateSaleSheetHeader {\n    return Intl.message(\"Private Sale\",\n        desc: 'Header for create private sale sheet (screen)',\n        name: 'createPrivateSaleSheetHeader');\n  }\n\n  String get creatingPrivateSaleSheetHeader {\n    return Intl.message(\"Creating\",\n        desc: 'Header for creating private sale sheet (screen)',\n        name: 'creatingPrivateSaleSheetHeader');\n  }\n\n  String get createdPrivateSaleSheetHeader {\n    return Intl.message(\"Created\",\n        desc: 'Header for created private sale sheet (screen)',\n        name: 'createdPrivateSaleSheetHeader');\n  }\n\n  String get delistingSheetHeader {\n    return Intl.message(\"Delisting\",\n        desc: 'Header for delisting sheet (screen)',\n        name: 'delistingSheetHeader');\n  }\n\n  String get delistedSheetHeader {\n    return Intl.message(\"Delisted\",\n        desc: 'Header for delisted sheet (screen)',\n        name: 'delistedSheetHeader');\n  }\n\n  String get addContactSheetHeader {\n    return Intl.message(\"Add Contact\",\n        desc: 'Header for add contact sheet (screen)',\n        name: 'addContactSheetHeader');\n  }\n\n  String get contactSheetHeader {\n    return Intl.message(\"Contact\",\n        desc: 'Header for contact details sheet (screen)',\n        name: 'contactSheetHeader');\n  }\n\n  String get publicKeySheetHeader {\n    return Intl.message(\"Public Key\",\n        desc: 'Header for public key sheet (screen)',\n        name: 'publicKeySheetHeader');\n  }\n\n  String get privateKeySheetHeader {\n    return Intl.message(\"Private Key\",\n        desc: 'Header for private key sheet (screen)',\n        name: 'privateKeySheetHeader');\n  }\n\n  String get backUpSheetHeader {\n    return Intl.message(\"Back Up\",\n        desc: 'Header for back up sheet (screen)', name: 'backUpSheetHeader');\n  }\n\n  String get encryptSheetHeader {\n    return Intl.message(\"Encrypt\",\n        desc: 'Header for encrypt sheet (screen)', name: 'encryptSheetHeader');\n  }\n\n  String get changeDaemonSheetHeader {\n    return Intl.message(\"Change Daemon\",\n        desc: 'Header for change daemon sheet (screen)',\n        name: 'changeDaemonSheetHeader');\n  }\n  // Sheet Headers END\n\n  // Full screen Headers\n  String get securityFirstHeader {\n    return Intl.message(\"Security First!\",\n        desc: 'Header for security first screen', name: 'securityFirstHeader');\n  }\n\n  String get newPrivateKeyHeader {\n    return Intl.message(\"New Private Key\",\n        desc: 'Header for new private key screen', name: 'newPrivateKeyHeader');\n  }\n\n  String get importPrivateKeyHeader {\n    return Intl.message(\"Import Private Key\",\n        desc: 'Header for import private key screen',\n        name: 'importPrivateKeyHeader');\n  }\n\n  String get decryptAndImportKeyHeader {\n    return Intl.message(\"Decrypt & Import\",\n        desc: 'Header for decrypt & import private key screen',\n        name: 'decryptAndImportKeyHeader');\n  }\n\n  String get backUpKeyHeader {\n    return Intl.message(\"Back Up Your Key!\",\n        desc: 'Header for back up your key screen', name: 'backUpKeyHeader');\n  }\n\n  String get lockedHeader {\n    return Intl.message(\"Locked\",\n        desc: 'Header for locked screen', name: 'lockedHeader');\n  }\n  // Full screen Headers END\n\n  // Text Field Headers\n  String get privateKeyTextFieldHeader {\n    return Intl.message(\"Private Key\",\n        desc: 'Header for private key text field',\n        name: 'privateKeyTextFieldHeader');\n  }\n\n  String get passwordTextFieldHeader {\n    return Intl.message(\"Password\",\n        desc: 'Header for password text field',\n        name: 'passwordTextFieldHeader');\n  }\n\n  String get newPasswordTextFieldHeader {\n    return Intl.message(\"New Password\",\n        desc: 'Header for new password text field',\n        name: 'newPasswordTextFieldHeader');\n  }\n\n  String get confirmPasswordTextFieldHeader {\n    return Intl.message(\"Confirm Password\",\n        desc: 'Header for confirm password text field',\n        name: 'confirmPasswordTextFieldHeader');\n  }\n\n  String get confirmTextFieldHeader {\n    return Intl.message(\"Confirm\",\n        desc: 'Header for confirm text field', name: 'confirmTextFieldHeader');\n  }\n\n  String get countryCodeTextFieldHeader {\n    return Intl.message(\"Country Code\",\n        desc: 'Header for country code text field',\n        name: 'countryCodeTextFieldHeader');\n  }\n\n  String get phoneNumberTextFieldHeader {\n    return Intl.message(\"Phone Number\",\n        desc: 'Header for phone number text field',\n        name: 'phoneNumberTextFieldHeader');\n  }\n\n  String get confirmationCodeTextFieldHeader {\n    return Intl.message(\"Confirmation Code\",\n        desc: 'Header for confirmation code text field',\n        name: 'confirmationCodeTextFieldHeader');\n  }\n\n  String get accountTextFieldHeader {\n    return Intl.message(\"Account\",\n        desc: 'Header for account text field', name: 'accountTextFieldHeader');\n  }\n\n  String get addressTextFieldHeader {\n    return Intl.message(\"Address\",\n        desc: 'Header for address text field', name: 'addressTextFieldHeader');\n  }\n\n  String get contactNameTextFieldHeader {\n    return Intl.message(\"Contact Name\",\n        desc: 'Header for contact name text field',\n        name: 'contactNameTextFieldHeader');\n  }\n\n  String get amountTextFieldHeader {\n    return Intl.message(\"Amount\",\n        desc: 'Header for amount text field', name: 'amountTextFieldHeader');\n  }\n\n  String get payloadTextFieldHeader {\n    return Intl.message(\"Payload\",\n        desc: 'Header for payload text field', name: 'payloadTextFieldHeader');\n  }\n\n  String get nameTextFieldHeader {\n    return Intl.message(\"Name\",\n        desc: 'Header for name text field', name: 'nameTextFieldHeader');\n  }\n\n  String get newAccountNameTextFieldHeader {\n    return Intl.message(\"New Account Name\",\n        desc: 'Header for new account name text field',\n        name: 'newAccountNameTextFieldHeader');\n  }\n\n  String get publicKeyTextFieldHeader {\n    return Intl.message(\"Public Key\",\n        desc: 'Header for public key text field',\n        name: 'publicKeyTextFieldHeader');\n  }\n\n  String get priceTextFieldHeader {\n    return Intl.message(\"Price\",\n        desc: 'Header for price text field', name: 'priceTextFieldHeader');\n  }\n\n  String get receivingAccountTextFieldHeader {\n    return Intl.message(\"Receiving Account\",\n        desc: 'Header for receiving account text field',\n        name: 'receivingAccountTextFieldHeader');\n  }\n\n  String get durationTextFieldHeader {\n    return Intl.message(\"Duration\",\n        desc: 'Header for duration text field',\n        name: 'durationTextFieldHeader');\n  }\n\n  String get feeTextFieldHeader {\n    return Intl.message(\"Fee\",\n        desc: 'Header for fee text field', name: 'feeTextFieldHeader');\n  }\n  // Text Field Headers END\n\n  // Dialog Headers\n  String get otherOperationsHeader {\n    return Intl.message(\"Other Operations\",\n        desc: 'Header for other operations dialog',\n        name: 'otherOperationsHeader');\n  }\n\n  String get warningHeader {\n    return Intl.message(\"Warning\",\n        desc: 'Header for warning dialog', name: 'warningHeader');\n  }\n\n  String get areYouSureHeader {\n    return Intl.message(\"Are You Sure?\",\n        desc: 'Header for are you sure dialog', name: 'areYouSureHeader');\n  }\n\n  String get addFeeHeader {\n    return Intl.message(\"Add Fee\",\n        desc: 'Header for add fee dialog', name: 'addFeeHeader');\n  }\n\n  String get keyTypeNotSupportedHeader {\n    return Intl.message(\"Key Not Supported\",\n        desc: 'Header for key not supported dialog',\n        name: 'keyTypeNotSupportedHeader');\n  }\n\n  String get accountToSendFromHeader {\n    return Intl.message(\"Account to Send From\",\n        desc: 'Header for account to send from dialog',\n        name: 'accountToSendFromHeader');\n  }\n  // Dialog Headers END\n\n  // Operation List Item Headers\n  String get sentHeader {\n    return Intl.message(\"Sent\",\n        desc: 'Header for sent type operation list item', name: 'sentHeader');\n  }\n\n  String get receivedHeader {\n    return Intl.message(\"Received\",\n        desc: 'Header for received type operation list item',\n        name: 'receivedHeader');\n  }\n\n  String get nameChangedHeader {\n    return Intl.message(\"Name Changed\",\n        desc: 'Header for listed for sale type operation list item',\n        name: 'nameChangedHeader');\n  }\n\n  String get listedForSaleHeader {\n    return Intl.message(\"Listed For Sale\",\n        desc: 'Header for listed for sale type operation list item',\n        name: 'listedForSaleHeader');\n  }\n\n  String get privateSaleHeader {\n    return Intl.message(\"Private Sale\",\n        desc: 'Header for private sale type operation list item',\n        name: 'privateSaleHeader');\n  }\n\n  String get delistedFromSaleHeader {\n    return Intl.message(\"Delisted From Sale\",\n        desc: 'Header for delisted from sale type operation list item',\n        name: 'delistedFromSaleHeader');\n  }\n\n  String get delistedHeader {\n    return Intl.message(\"Delisted\",\n        desc: 'Header for delisted type operation list item',\n        name: 'delistedHeader');\n  }\n\n  String get undefinedHeader {\n    return Intl.message(\"Undefined\",\n        desc: 'Header for undefined type operation list item',\n        name: 'undefinedHeader');\n  }\n\n  String get transferredHeader {\n    return Intl.message(\"Transferred\",\n        desc: 'Header for transferred type operation list item',\n        name: 'transferredHeader');\n  }\n  // Operation List Item Headers END\n\n  // Live chat\n  String get connectingHeader {\n    return Intl.message(\n        \"Connecting\",\n        desc:\n            'A header to let the user now that Blaise is currently connecting to (or loading) live chat.',\n        name: 'connectingHeader');\n  }\n\n  // Miscellaneous Headers\n  String get balanceHeader {\n    return Intl.message(\"Balance\",\n        desc: 'Header for balance', name: 'balanceHeader');\n  }\n\n  String get totalBalanceHeader {\n    return Intl.message(\"Total Balance\",\n        desc: 'Header for total balance', name: 'totalBalanceHeader');\n  }\n\n  String get accountBalanceHeader {\n    return Intl.message(\"Account Balance\",\n        desc: 'Header for account balance', name: 'accountBalanceHeader');\n  }\n\n  String get accountsHeader {\n    return Intl.message(\"Accounts\",\n        desc: 'Header for accounts', name: 'accountsHeader');\n  }\n\n  String get operationsHeader {\n    return Intl.message(\"Operations\",\n        desc: 'Header for operations', name: 'operationsHeader');\n  }\n\n  String get encryptThePayloadHeader {\n    return Intl.message(\"Encrypt the Payload\",\n        desc: 'Header for encrypt the payload switch',\n        name: 'encryptThePayloadHeader');\n  }\n\n  String get encryptPayloadHeader {\n    return Intl.message(\"Encrypt Payload\",\n        desc: 'Header for encrypt payload switch',\n        name: 'encryptPayloadHeader');\n  }\n\n  String get forSaleHeader {\n    return Intl.message(\"For Sale\",\n        desc: 'Header of for sale tag', name: 'forSaleHeader');\n  }\n\n  String get borrowedHeader {\n    return Intl.message(\"Borrowed\",\n        desc: 'Header for borrowed tag', name: 'borrowedHeader');\n  }\n\n  String get borrowedTransferredHeader {\n    return Intl.message(\"Transfer Pending\",\n        desc: 'Header for borrowed tag, after account is transferred but not confirmed', name: 'borrowedTransferredHeader');\n  }\n\n  String get borrowedAccountHeader {\n    return Intl.message(\"Borrowed Account\",\n        desc: 'Header for borrowed account tag', name: 'borrowedAccountHeader');\n  }\n\n  String get feeColonHeader {\n    return Intl.message(\"Fee:\",\n        desc: 'Header for fee amount', name: 'feeColonHeader');\n  }\n\n  String get pendingHeader {\n    return Intl.message(\"Pending\",\n        desc: 'Header to indicate that an operation is pending',\n        name: 'pendingHeader');\n  }\n\n  String get onHeader {\n    return Intl.message(\"On\",\n        desc: \"A header to indicate that something is on\", name: \"onHeader\");\n  }\n\n  String get offHeader {\n    return Intl.message(\"Off\",\n        desc: \"A header to indicate that something is off\", name: \"offHeader\");\n  }\n  // Miscellaneous Headers\n\n  // **** HEADERS END **** //\n\n  // **** ERROR TEXT **** //\n  String get priceRequiredError {\n    return Intl.message(\"Price is required\",\n        desc: 'Error that tells the user that the price is required',\n        name: 'priceRequiredError');\n  }\n\n  String get amountRequiredError {\n    return Intl.message(\"Amount is required\",\n        desc: 'Error that tells the user that the amount is required',\n        name: 'amountRequiredError');\n  }\n\n  String get nameRequiredError {\n    return Intl.message(\"Name is required\",\n        desc: 'Error that tells the user that the name is required',\n        name: 'nameRequiredError');\n  }\n\n  String get zeroPriceError {\n    return Intl.message(\"Price can't be 0\",\n        desc: 'Error that tells the user that the price cant be zero',\n        name: 'zeroPriceError');\n  }\n\n  String get zeroAmountError {\n    return Intl.message(\"Amount can't be 0\",\n        desc: 'Error that tells the user that the amount cant be zero',\n        name: 'zeroAmountError');\n  }\n\n  String get invalidAccountNameError {\n    return Intl.message(\"Invalid account name\",\n        desc: 'Error that tells the user that the account name is invalid',\n        name: 'invalidAccountNameError');\n  }\n\n  String get invalidReceivingAccountError {\n    return Intl.message(\"Invalid receiving account\",\n        desc: 'Error that tells the user that the receiving account is invalid',\n        name: 'invalidReceivingAccountError');\n  }\n\n  String get invalidPublicKeyError {\n    return Intl.message(\"Invalid public key\",\n        desc: 'Error that tells the user that the public key is invalid',\n        name: 'invalidPublicKeyError');\n  }\n\n  String get invalidPrivateKeyError {\n    return Intl.message(\"Invalid private key\",\n        desc: 'Error that tells the user that the private key is invalid',\n        name: 'invalidPrivateKeyError');\n  }\n\n  String get invalidAddressError {\n    return Intl.message(\"Invalid address\",\n        desc: 'Error that tells the user that the address is invalid',\n        name: 'invalidAddressError');\n  }\n\n  String get invalidAccountError {\n    return Intl.message(\"Invalid account\",\n        desc: 'Error that tells the user that the account is invalid',\n        name: 'invalidAccountError');\n  }\n\n  String get invalidDestinationError {\n    return Intl.message(\"Invalid destination\",\n        desc: 'Error that tells the user that the destination is invalid',\n        name: 'invalidDestinationError');\n  }\n\n  String get insufficientBalanceError {\n    return Intl.message(\"Insufficient balance\",\n        desc: 'Error that tells the user that the balance is insufficient',\n        name: 'insufficientBalanceError');\n  }\n\n  String get threeCharacterNameError {\n    return Intl.message(\"Must be at least 3 characters\",\n        desc:\n            'Error that tells the user that the account name cant be shorter than 3 characters',\n        name: 'threeCharacterNameError');\n  }\n\n  String get contactDoesntExistError {\n    return Intl.message(\"Contact doesn't exist\",\n        desc: 'Error that tells the user that the contact doesnt exist',\n        name: 'contactDoesntExistError');\n  }\n\n  String get contactAlreadyExistsError {\n    return Intl.message(\"Contact already exists\",\n        desc: 'Error that tells the user that the contact already exists',\n        name: 'contactAlreadyExistsError');\n  }\n\n  String get cantSendToYourselfError {\n    return Intl.message(\"Can't send to yourself\",\n        desc: 'Error that tells the user that you cant send to yourself',\n        name: 'cantSendToYourselfError');\n  }\n\n  String get somethingWentWrongError {\n    return Intl.message(\"Something went wrong, please try again later\",\n        desc: 'Error that tells the user that something went wrong',\n        name: 'somethingWentWrongError');\n  }\n\n  String get failedToEncryptPayloadError {\n    return Intl.message(\"Failed to encrypt the payload\",\n        desc: 'Error that tells the user that payload encrypt is failed',\n        name: 'failedToEncryptPayloadError');\n  }\n\n  String get emptyPasswordError {\n    return Intl.message(\"Password can't be empty\",\n        desc: 'Error that tells the user that the password cant be empty',\n        name: 'emptyPasswordError');\n  }\n\n  String get noMatchPasswordError {\n    return Intl.message(\"Passwords don't match\",\n        desc: 'Error that tells the user that the passwords dont match',\n        name: 'noMatchPasswordError');\n  }\n\n  String get invalidPasswordError {\n    return Intl.message(\"Invalid password\",\n        desc: 'Error that tells the user that the password is invalid',\n        name: 'invalidPasswordError');\n  }\n\n  String get didNotGetResponseError {\n    return Intl.message(\"Did not get a response from server\",\n        desc:\n            'Error that tells the user that there is no response from the server',\n        name: 'didNotGetResponseError');\n  }\n\n  String get noContactsToExportError {\n    return Intl.message(\"No contacts to export\",\n        desc: 'Error that tells the user that there is no contacts to export',\n        name: 'noContactsToExportError');\n  }\n\n  String get noContactsToImportError {\n    return Intl.message(\"No contacts to import\",\n        desc: 'Error that tells the user that there is no contacts to import',\n        name: 'noContactsToImportError');\n  }\n\n  String get failedToImportContactsError {\n    return Intl.message(\"Failed to import contacts\",\n        desc: 'Error that tells the user that there is no contacts to export',\n        name: 'failedToImportContactsError');\n  }\n  // **** ERROR TEXT END **** //\n\n  // **** OPDETAILS **** //\n  String get blockchainRewardOPDetails {\n    return Intl.message(\"Blockchain Reward (%1)\",\n        desc: 'Operation details header for blockchain reward',\n        name: 'blockchainRewardOPDetails');\n  }\n\n  String get transactionOPDetails {\n    return Intl.message(\"Transaction (%1)\",\n        desc: 'Operation details header for transaction',\n        name: 'transactionOPDetails');\n  }\n\n  String get changeKeyOPDetails {\n    return Intl.message(\"Change key (%1)\",\n        desc: 'Operation details header for change key',\n        name: 'changeKeyOPDetails');\n  }\n\n  String get recoverFundsOPDetails {\n    return Intl.message(\"Recover Funds (%1)\",\n        desc: 'Operation details header for recover funds',\n        name: 'recoverFundsOPDetails');\n  }\n\n  String get listAccountForSaleOPDetails {\n    return Intl.message(\"List Account for Sale (%1)\",\n        desc: 'Operation details header for list account for sale',\n        name: 'listAccountForSaleOPDetails');\n  }\n\n  String get delistAccountOPDetails {\n    return Intl.message(\"Delist Account (%1)\",\n        desc: 'Operation details header for delist account',\n        name: 'delistAccountOPDetails');\n  }\n\n  String get buyAccountOPDetails {\n    return Intl.message(\"Buy Account (%1)\",\n        desc: 'Operation details header for buy account',\n        name: 'buyAccountOPDetails');\n  }\n\n  String get changeKeySignedOPDetails {\n    return Intl.message(\"Change Key Signed (%1)\",\n        desc: 'Operation details header for change key signed',\n        name: 'changeKeySignedOPDetails');\n  }\n\n  String get changeAccountInfoOPDetails {\n    return Intl.message(\"Change Account Info (%1)\",\n        desc: 'Operation details header for change account info',\n        name: 'changeAccountInfoOPDetails');\n  }\n\n  String get multioperationOPDetails {\n    return Intl.message(\"Multioperation (%1)\",\n        desc: 'Operation details header for multioperation',\n        name: 'multioperationOPDetails');\n  }\n\n  String get unknownOPDetails {\n    return Intl.message(\"Unknown (%1)\",\n        desc: 'Operation details header for unknown', name: 'unknownOPDetails');\n  }\n\n  String get sendingAccountOPDetails {\n    return Intl.message(\"Sending Account\",\n        desc: 'Operation details header for sending account',\n        name: 'sendingAccountOPDetails');\n  }\n\n  String get receivingAccountOPDetails {\n    return Intl.message(\"Receiving Account\",\n        desc: 'Operation details header for receiving account',\n        name: 'receivingAccountOPDetails');\n  }\n\n  String get changingAccountOPDetails {\n    return Intl.message(\"Changing Account\",\n        desc: 'Operation details header for changing account',\n        name: 'changingAccountOPDetails');\n  }\n\n  String get sendAmountOPDetails {\n    return Intl.message(\"Send Amount\",\n        desc: 'Operation details header for send amount',\n        name: 'sendAmountOPDetails');\n  }\n\n  String get payloadOPDetails {\n    return Intl.message(\"Payload\",\n        desc: 'Operation details header for payload', name: 'payloadOPDetails');\n  }\n\n  String get newPublicKeyOPDetails {\n    return Intl.message(\"New Public Key\",\n        desc: 'Operation details header for new public key',\n        name: 'newPublicKeyOPDetails');\n  }\n\n  String get newNameOPDetails {\n    return Intl.message(\"New Name\",\n        desc: 'Operation details header for new name',\n        name: 'newNameOPDetails');\n  }\n\n  String get sellerAccountOPDetails {\n    return Intl.message(\"Seller Account\",\n        desc: 'Operation details header for seller account',\n        name: 'sellerAccountOPDetails');\n  }\n\n  String get accountPriceOPDetails {\n    return Intl.message(\"Account Price\",\n        desc: 'Operation details header for account price',\n        name: 'accountPriceOPDetails');\n  }\n\n  String get lockedUntilBlockOPDetails {\n    return Intl.message(\"Locked Until Block\",\n        desc: 'Operation details header for locked until block',\n        name: 'lockedUntilBlockOPDetails');\n  }\n\n  String get blockOPDetails {\n    return Intl.message(\"block\",\n        desc: 'Operation details header for block', name: 'blockOPDetails');\n  }\n\n  String get optxtOPDetails {\n    return Intl.message(\"optxt\",\n        desc: 'Operation details header for optxt', name: 'optxtOPDetails');\n  }\n\n  String get timeOPDetails {\n    return Intl.message(\"time\",\n        desc: 'Operation details header for time', name: 'timeOPDetails');\n  }\n\n  String get naOPDetails {\n    return Intl.message(\"N/A\",\n        desc: 'Operation details header for N/A', name: 'naOPDetails');\n  }\n\n  String get ophashOPDetails {\n    return Intl.message(\"ophash\",\n        desc: 'Operation details header for ophash', name: 'ophashOPDetails');\n  }\n\n  String get optypeOPDetails {\n    return Intl.message(\"optype\",\n        desc: 'Operation details header for optype', name: 'optypeOPDetails');\n  }\n\n  String get maturationOPDetails {\n    return Intl.message(\"maturation\",\n        desc: 'Operation details header for maturation',\n        name: 'maturationOPDetails');\n  }\n\n  String get nullOPDetails {\n    return Intl.message(\"null\",\n        desc: 'Operation details header for null', name: 'nullOPDetails');\n  }\n\n  String get feeOPDetails {\n    return Intl.message(\"fee\",\n        desc: 'Operation details header for fee', name: 'feeOPDetails');\n  }\n\n  String get opblockOPDetails {\n    return Intl.message(\"opblock\",\n        desc: 'Operation details header for opblock', name: 'opblockOPDetails');\n  }\n\n  String get noperationOPDetails {\n    return Intl.message(\"n_operation\",\n        desc: 'Operation details header for n_operation',\n        name: 'noperationOPDetails');\n  }\n\n  String get accountOPDetails {\n    return Intl.message(\"account\",\n        desc: 'Operation details header for account', name: 'accountOPDetails');\n  }\n\n  String get signeraccountOPDetails {\n    return Intl.message(\"signer_account\",\n        desc: 'Operation details header for signer_account',\n        name: 'signeraccountOPDetails');\n  }\n  // **** OPDETAILS END**** //\n}\n\nclass AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> {\n  final LanguageSetting languageSetting;\n\n  const AppLocalizationsDelegate(this.languageSetting);\n\n  @override\n  bool isSupported(Locale locale) {\n    return languageSetting != null;\n  }\n\n  @override\n  Future<AppLocalization> load(Locale locale) {\n    if (languageSetting.language == AvailableLanguage.DEFAULT) {\n      return AppLocalization.load(locale);\n    }\n    return AppLocalization.load(Locale(languageSetting.getLocaleString()));\n  }\n\n  @override\n  bool shouldReload(LocalizationsDelegate<AppLocalization> old) {\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'dart:io';\n\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_security_first.dart';\nimport 'package:blaise_wallet_flutter/ui/lockscreen/lock_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/overview.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_backup_confirm.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_decrypt_and_import_private_key.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_import_private_key.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_new_private_key.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/contacts/contacts.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/security.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/intro/intro_welcome.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:firebase_core/firebase_core.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:logger/logger.dart';\nimport 'package:oktoast/oktoast.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  // Register services\n  setupServiceLocator();\n  // Setup logger, only show warning and higher in release mode.\n  if (kReleaseMode) {\n    Logger.level = Level.warning;\n  } else {\n    Logger.level = Level.debug;\n  }\n  // Setup firebase\n  await Firebase.initializeApp();\n  // Run app\n  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])\n      .then((_) {\n    runApp(StateContainer(child: App()));\n  });\n}\n\nclass App extends StatefulWidget {\n  @override\n  _AppState createState() => _AppState();\n}\n\nclass _AppState extends State<App> {\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  // This widget is the root of the application.\n  @override\n  Widget build(BuildContext context) {\n    SystemChrome.setSystemUIOverlayStyle(\n        StateContainer.of(context).curTheme.statusBar);\n    return OKToast(\n      textStyle: AppStyles.snackbar(context),\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      child: MaterialApp(\n        debugShowCheckedModeBanner: false,\n        title: 'Blaise',\n        theme: ThemeData(\n          dialogBackgroundColor:\n              StateContainer.of(context).curTheme.backgroundPrimary,\n          primaryColor: StateContainer.of(context).curTheme.primary,\n          accentColor: StateContainer.of(context).curTheme.primary,\n          backgroundColor:\n              StateContainer.of(context).curTheme.backgroundPrimary,\n          fontFamily: 'Metropolis',\n          brightness: StateContainer.of(context).curTheme.brightness,\n          splashColor: StateContainer.of(context).curTheme.primary30,\n          highlightColor: StateContainer.of(context).curTheme.primary15,\n        ),\n        localizationsDelegates: [\n          AppLocalizationsDelegate(StateContainer.of(context).curLanguage),\n          GlobalMaterialLocalizations.delegate,\n          GlobalCupertinoLocalizations.delegate,\n          GlobalWidgetsLocalizations.delegate\n        ],\n        initialRoute: '/',\n        onGenerateRoute: (RouteSettings settings) {\n          switch (settings.name) {\n            case '/':\n              return NoTransitionRoute(\n                builder: (context) => Splash(),\n                settings: settings,\n              );\n            case '/lock_screen':\n              if (settings.arguments != null &&\n                  settings.arguments is TransitionOption &&\n                  settings.arguments == TransitionOption.NONE) {\n                return NoTransitionRoute(\n                  builder: (context) => LockScreenPage(),\n                  settings: settings,\n                );\n              }\n              return MaterialPageRoute(\n                builder: (context) => LockScreenPage(),\n                settings: settings,\n              );\n            case '/intro_welcome':\n              return NoTransitionRoute(\n                builder: (context) => IntroWelcomePage(),\n                settings: settings,\n              );\n            case '/intro_security_first':\n              return MaterialPageRoute(\n                builder: (context) => IntroSecurityFirstPage(),\n                settings: settings,\n              );\n            case '/intro_new_private_key':\n              return MaterialPageRoute(\n                builder: (context) => IntroNewPrivateKeyPage(),\n                settings: settings,\n              );\n            case '/intro_backup_confirm':\n              return MaterialPageRoute(\n                builder: (context) => IntroBackupConfirmPage(),\n                settings: settings,\n              );\n            case '/intro_import_private_key':\n              return MaterialPageRoute(\n                builder: (context) => IntroImportPrivateKeyPage(),\n                settings: settings,\n              );\n            case '/intro_decrypt_and_import_private_key':\n              return MaterialPageRoute(\n                builder: (context) => IntroDecryptAndImportPrivateKeyPage(\n                    encryptedKey: settings.arguments),\n                settings: settings,\n              );\n            case '/overview':\n              if (settings.arguments != null &&\n                  settings.arguments is TransitionOption &&\n                  settings.arguments == TransitionOption.NONE) {\n                return NoTransitionRoute(\n                  builder: (context) => OverviewPage(),\n                  settings: settings,\n                );\n              }\n              return MaterialPageRoute(\n                builder: (context) => OverviewPage(),\n                settings: settings,\n              );\n            case '/account':\n              return MaterialPageRoute(\n                builder: (context) => AccountPage(account: settings.arguments),\n                settings: settings,\n              );\n            case '/security':\n              return MaterialPageRoute(\n                builder: (context) => SecurityPage(),\n                settings: settings,\n              );\n            case '/contacts':\n              return MaterialPageRoute(\n                builder: (context) => ContactsPage(account: settings.arguments),\n                settings: settings,\n              );\n            default:\n              return null;\n          }\n        },\n        locale: StateContainer.of(context).curLanguage == null ||\n                StateContainer.of(context).curLanguage.language ==\n                    AvailableLanguage.DEFAULT\n            ? null\n            : StateContainer.of(context).curLanguage.getLocale(),\n        supportedLocales: [\n          // Languages\n          const Locale('en', 'US'), // English\n          const Locale('de', 'DE'), // German\n          const Locale('es'), // Spanish\n          const Locale('tr'), // Turkish\n          const Locale('ar'), // Arabic\n          const Locale.fromSubtags(\n              languageCode: 'zh', scriptCode: 'Hans'), // Chinese Simplified\n          // Currency-default requires country included\n          const Locale(\"es\", \"AR\"),\n          const Locale(\"en\", \"AU\"),\n          const Locale(\"en\", \"US\"),\n          const Locale(\"pt\", \"BR\"),\n          const Locale(\"en\", \"CA\"),\n          const Locale(\"de\", \"CH\"),\n          const Locale(\"es\", \"CL\"),\n          const Locale(\"zh\", \"CN\"),\n          const Locale(\"cs\", \"CZ\"),\n          const Locale(\"da\", \"DK\"),\n          const Locale(\"fr\", \"FR\"),\n          const Locale(\"en\", \"GB\"),\n          const Locale(\"zh\", \"HK\"),\n          const Locale(\"hu\", \"HU\"),\n          const Locale(\"id\", \"ID\"),\n          const Locale(\"he\", \"IL\"),\n          const Locale(\"hi\", \"IN\"),\n          const Locale(\"ja\", \"JP\"),\n          const Locale(\"ko\", \"KR\"),\n          const Locale(\"es\", \"MX\"),\n          const Locale(\"ta\", \"MY\"),\n          const Locale(\"en\", \"NZ\"),\n          const Locale(\"tl\", \"PH\"),\n          const Locale(\"ur\", \"PK\"),\n          const Locale(\"pl\", \"PL\"),\n          const Locale(\"ru\", \"RU\"),\n          const Locale(\"sv\", \"SE\"),\n          const Locale(\"zh\", \"SG\"),\n          const Locale(\"th\", \"TH\"),\n          const Locale(\"tr\", \"TR\"),\n          const Locale(\"en\", \"TW\"),\n          const Locale(\"es\", \"VE\"),\n          const Locale(\"en\", \"ZA\"),\n          const Locale(\"en\", \"US\"),\n          const Locale(\"es\", \"AR\"),\n          const Locale(\"de\", \"AT\"),\n          const Locale(\"fr\", \"BE\"),\n          const Locale(\"de\", \"BE\"),\n          const Locale(\"nl\", \"BE\"),\n          const Locale(\"tr\", \"CY\"),\n          const Locale(\"et\", \"EE\"),\n          const Locale(\"fi\", \"FI\"),\n          const Locale(\"fr\", \"FR\"),\n          const Locale(\"el\", \"GR\"),\n          const Locale(\"es\", \"AR\"),\n          const Locale(\"en\", \"IE\"),\n          const Locale(\"it\", \"IT\"),\n          const Locale(\"es\", \"AR\"),\n          const Locale(\"lv\", \"LV\"),\n          const Locale(\"lt\", \"LT\"),\n          const Locale(\"fr\", \"LU\"),\n          const Locale(\"en\", \"MT\"),\n          const Locale(\"nl\", \"NL\"),\n          const Locale(\"pt\", \"PT\"),\n          const Locale(\"sk\", \"SK\"),\n          const Locale(\"sl\", \"SI\"),\n          const Locale(\"es\", \"ES\"),\n          const Locale(\"ar\", \"AE\"), // UAE\n          const Locale(\"ar\", \"SA\"), // Saudi Arabia\n          const Locale(\"ar\", \"KW\"), // Kuwait\n        ],\n      ),\n    );\n  }\n}\n\n/// Splash\n/// Default page route that determines if user is logged in and routes them appropriately.\nclass Splash extends StatefulWidget {\n  @override\n  SplashState createState() => SplashState();\n}\n\nclass SplashState extends State<Splash> with WidgetsBindingObserver {\n  bool _hasCheckedLoggedIn;\n\n  Future checkLoggedIn({bool retry = false, bool legacyStorage = false}) async {\n    try {\n      if (!_hasCheckedLoggedIn) {\n        _hasCheckedLoggedIn = true;\n        if (await sl.get<SharedPrefsUtil>().getFirstLaunch()) {\n          await sl.get<SharedPrefsUtil>().deleteAll(firstLaunch: true);\n          await sl.get<Vault>().deleteAll();\n          await sl.get<SharedPrefsUtil>().setFirstLaunch();\n          Navigator.of(context).pushReplacementNamed('/intro_welcome');\n        } else if ((await sl.get<Vault>().getPrivateKey() != null) &&\n            (await sl.get<SharedPrefsUtil>().getPrivateKeyBackedUp())) {\n          if (await sl.get<SharedPrefsUtil>().getLock() ||\n              await sl.get<SharedPrefsUtil>().shouldLock()) {\n            Navigator.of(context).pushReplacementNamed('/lock_screen',\n                arguments: TransitionOption.NONE);\n          } else {\n            walletState.requestUpdate();\n            Navigator.of(context).pushReplacementNamed('/overview',\n                arguments: TransitionOption.NONE);\n          }\n        } else {\n          Navigator.of(context).pushReplacementNamed('/intro_welcome');\n        }\n      }\n    } catch (e) {\n      // Attempt to retry if this failed\n      if (!retry) {\n        await sl.get<Vault>().deleteAll();\n        await sl.get<SharedPrefsUtil>().deleteAll();\n        checkLoggedIn(retry: true, legacyStorage: false);\n      } else if (Platform.isAndroid &&\n          e.toString().contains(\"flutter_secure\") &&\n          !legacyStorage) {\n        /// Fallback secure storage\n        /// A very small percentage of users are encountering issues writing to the\n        /// Android keyStore using the flutter_secure_storage plugin.\n        ///\n        /// Instead of telling them they are out of luck, this is an automatic \"fallback\"\n        /// It will generate a 64-byte secret using the native android \"bottlerocketstudios\" Vault\n        /// This secret is used to encrypt sensitive data and save it in SharedPreferences\n        if (!(await sl.get<SharedPrefsUtil>().useLegacyStorage())) {\n          await sl.get<SharedPrefsUtil>().setUseLegacyStorage();\n          checkLoggedIn(retry: true, legacyStorage: true);\n        }\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _hasCheckedLoggedIn = false;\n    if (SchedulerBinding.instance.schedulerPhase ==\n        SchedulerPhase.persistentCallbacks) {\n      SchedulerBinding.instance.addPostFrameCallback((_) => checkLoggedIn());\n    }\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    super.dispose();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    // Account for user changing locale when leaving the app\n    switch (state) {\n      case AppLifecycleState.paused:\n        super.didChangeAppLifecycleState(state);\n        break;\n      case AppLifecycleState.resumed:\n        setLanguage();\n        super.didChangeAppLifecycleState(state);\n        break;\n      default:\n        super.didChangeAppLifecycleState(state);\n        break;\n    }\n  }\n\n  void setLanguage() {\n    setState(() {\n      StateContainer.of(context).deviceLocale = Localizations.localeOf(context);\n    });\n    sl.get<SharedPrefsUtil>().getLanguage().then((setting) {\n      setState(() {\n        StateContainer.of(context).updateLanguage(setting);\n      });\n    });\n  }\n\n  void setDeviceLocaleAndCurrency() {\n    setState(() {\n      StateContainer.of(context).deviceLocale = Localizations.localeOf(context);\n      sl\n          .get<SharedPrefsUtil>()\n          .getCurrency(StateContainer.of(context).deviceLocale)\n          .then((currency) {\n        StateContainer.of(context).curCurrency = currency;\n      });\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    setDeviceLocaleAndCurrency();\n    setLanguage();\n    return Scaffold(\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/model/authentication_method.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\n\nenum AuthMethod { PIN, BIOMETRICS }\n\n/// Represent the available authentication methods our app supports\nclass AuthenticationMethod extends SettingSelectionItem {\n  AuthMethod method;\n\n  AuthenticationMethod(this.method);\n\n  String getDisplayName(BuildContext context) {\n    switch (method) {\n      case AuthMethod.BIOMETRICS:\n        return AppLocalization.of(context).authenticationBiometricsHeader;\n      case AuthMethod.PIN:\n        return AppLocalization.of(context).authenticationPINHeader;\n      default:\n        return AppLocalization.of(context).authenticationPINHeader;\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return method.index;\n  }\n}\n"
  },
  {
    "path": "lib/model/available_currency.dart",
    "content": "import 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\nimport 'dart:ui';\n\nenum AvailableCurrencyEnum { USD, ARS, AUD, BRL, CAD, CHF, CLP, CNY, CZK, DKK,\n                  EUR, GBP, HKD, HUF, IDR, ILS, INR, JPY, KRW, KWD,\n                  MXN, MYR, NOK, NZD, PHP, PKR, PLN, RUB, SAR, SEK,\n                  SGD, THB, TRY, TWD, AED, ZAR }\n\n/// Represent the available authentication methods our app supports\nclass AvailableCurrency extends SettingSelectionItem {\n  AvailableCurrencyEnum currency;\n\n  AvailableCurrency(this.currency);\n\n  String getIso4217Code() {\n    return currency.toString().split('.')[1];\n  }\n\n  String getDisplayName(BuildContext context) {\n    return getCurrencySymbol() + \" \" + getDisplayNameNoSymbol();\n  }\n\n  String getDisplayNameNoSymbol() {\n    switch (getIso4217Code()) {\n      case \"ARS\":\n          return \"Argentine Peso\";\n      case \"AUD\":\n          return \"Australian Dollar\";\n      case \"BRL\":\n          return \"Brazilian Real\";\n      case \"CAD\":\n          return \"Canadian Dollar\";\n      case \"CHF\":\n          return \"Swiss Franc\";\n      case \"CLP\":\n          return \"Chilean Peso\";\n      case \"CNY\":\n          return \"Chinese Yuan\";\n      case \"CZK\":\n          return \"Czech Koruna\";\n      case \"DKK\":\n          return \"Danish Krone\";\n      case \"EUR\":\n          return \"Euro\";\n      case \"GBP\":\n          return \"Great Britain Pound\";\n      case \"HKD\":\n          return \"Hong Kong Dollar\";\n      case \"HUF\":\n          return \"Hungarian Forint\";\n      case \"IDR\":\n          return \"Indonesian Rupiah\";\n      case \"ILS\":\n          return \"Israeli Shekel\";\n      case \"INR\":\n          return \"Indian Rupee\";\n      case \"JPY\":\n          return \"Japanese Yen\";\n      case \"KRW\":\n          return \"South Korean Won\";\n      case \"KWD\":\n          return \"Kuwaiti Dinar\";\n      case \"MXN\":\n          return \"Mexican Peso\";\n      case \"MYR\":\n          return \"Malaysian Ringgit\";\n      case \"NOK\":\n          return \"Norwegian Krone\";\n      case \"NZD\":\n          return \"New Zealand Dollar\";\n      case \"PHP\":\n          return \"Philippine Peso\";\n      case \"PKR\":\n          return \"Pakistani Rupee\";\n      case \"PLN\":\n          return \"Polish Zloty\";\n      case \"RUB\":\n          return \"Russian Ruble\";\n      case \"SAR\":\n          return \"Saudi Riyal\";\n      case \"SEK\":\n          return \"Swedish Krona\";\n      case \"SGD\":\n          return \"Singapore Dollar\";\n      case \"THB\":\n          return \"Thai Baht\";\n      case \"TRY\":\n          return \"Turkish Lira\";\n      case \"TWD\":\n          return \"Taiwan Dollar\";\n      case \"AED\":\n          return \"UAE Dirham\";\n      case \"ZAR\":\n          return \"South African Rand\";\n      case \"USD\":\n      default:\n          return \"US Dollar\";\n      }\n  }\n\n  String getCurrencySymbol() {\n    switch (getIso4217Code()) {\n      case \"ARS\":\n          return \"\\$\";\n      case \"AUD\":\n          return \"\\$\";\n      case \"BRL\":\n          return \"R\\$\";\n      case \"CAD\":\n          return \"\\$\";\n      case \"CHF\":\n          return \"CHF\";\n      case \"CLP\":\n          return \"\\$\";\n      case \"CNY\":\n          return \"¥\";\n      case \"CZK\":\n          return \"Kč\";\n      case \"DKK\":\n          return \"kr.\";\n      case \"EUR\":\n          return \"€\";\n      case \"GBP\":\n          return \"£\";\n      case \"HKD\":\n          return \"HK\\$\";\n      case \"HUF\":\n          return \"Ft\";\n      case \"IDR\":\n          return \"Rp\";\n      case \"ILS\":\n          return \"₪\";\n      case \"INR\":\n          return \"₹\";\n      case \"JPY\":\n          return \"¥\";\n      case \"KRW\":\n          return \"₩\";\n      case \"KWD\":\n          return \"KD\";\n      case \"MXN\":\n          return \"\\$\";\n      case \"MYR\":\n          return \"RM\";\n      case \"NOK\":\n          return \"kr\";\n      case \"NZD\":\n          return \"\\$\";\n      case \"PHP\":\n          return \"₱\";\n      case \"PKR\":\n          return \"Rs\";\n      case \"PLN\":\n          return \"zł\";\n      case \"RUB\":\n          return \"\\u20BD\";\n      case \"SAR\":\n          return \"SR\";\n      case \"SEK\":\n          return \"kr\";\n      case \"SGD\":\n          return \"\\$\";\n      case \"THB\":\n          return \"THB\";\n      case \"TRY\":\n          return \"₺\";\n      case \"TWD\":\n          return \"NT\\$\";\n      case \"AED\":\n          return \"د.إ\";\n      case \"ZAR\":\n          return \"R\\$\";\n      case \"USD\":\n      default:\n          return \"\\$\";\n    }\n  }\n\n  Locale getLocale() {\n    switch (getIso4217Code()) {\n      case \"ARS\":\n          return Locale(\"es\", \"AR\");\n      case \"AUD\":\n          return Locale(\"en\", \"AU\");\n      case \"BRL\":\n          return Locale(\"pt\", \"BR\");\n      case \"CAD\":\n          return Locale(\"en\", \"CA\");\n      case \"CHF\":\n          return Locale(\"de\", \"CH\");\n      case \"CLP\":\n          return Locale(\"es\", \"CL\");\n      case \"CNY\":\n          return Locale(\"zh\", \"CN\");\n      case \"CZK\":\n          return Locale(\"cs\", \"CZ\");\n      case \"DKK\":\n          return Locale(\"da\", \"DK\");\n      case \"EUR\":\n          return Locale(\"fr\", \"FR\");\n      case \"GBP\":\n          return Locale(\"en\", \"GB\");\n      case \"HKD\":\n          return Locale(\"zh\", \"HK\");\n      case \"HUF\":\n          return Locale(\"hu\", \"HU\");\n      case \"IDR\":\n          return Locale(\"id\", \"ID\");\n      case \"ILS\":\n          return Locale(\"he\", \"IL\");\n      case \"INR\":\n          return Locale(\"hi\", \"IN\");\n      case \"JPY\":\n          return Locale(\"ja\", \"JP\");\n      case \"KRW\":\n          return Locale(\"ko\", \"KR\");\n      case \"KWD\":\n          return Locale(\"ar\", \"KW\");\n      case \"MXN\":\n          return Locale(\"es\", \"MX\");\n      case \"MYR\":\n          return Locale(\"ta\", \"MY\");\n      case \"NOK\":\n          return Locale(\"no\", \"NO\");\n      case \"NZD\":\n          return Locale(\"en\", \"NZ\");\n      case \"PHP\":\n          return Locale(\"tl\", \"PH\");\n      case \"PKR\":\n          return Locale(\"ur\", \"PK\");\n      case \"PLN\":\n          return Locale(\"pl\", \"PL\");\n      case \"RUB\":\n          return Locale(\"ru\", \"RU\");\n      case \"SAR\":\n          return Locale(\"ar\", \"SA\");\n      case \"SEK\":\n          return Locale(\"sv\", \"SE\");\n      case \"SGD\":\n          return Locale(\"zh\", \"SG\");\n      case \"THB\":\n          return Locale(\"th\", \"TH\");\n      case \"TRY\":\n          return Locale(\"tr\", \"TR\");\n      case \"TWD\":\n          return Locale(\"en\", \"TW\");\n      case \"AED\":\n          return Locale(\"ar\", \"AE\");\n      case \"ZAR\":\n          return Locale(\"en\", \"ZA\");\n      case \"USD\":\n      default:\n          return Locale(\"en\", \"US\");\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return currency.index;\n  }\n\n  // Get best currency for a given locale\n  // Default to USD\n  static AvailableCurrency getBestForLocale(Locale locale) {\n    for (AvailableCurrencyEnum value in AvailableCurrencyEnum.values) {\n      AvailableCurrency currency = AvailableCurrency(value);\n      if (locale != null && locale.countryCode != null) {\n        // Special cases\n        if (['AT', 'BE', 'CY', 'EE', 'FI', 'FR', 'DE', 'GR', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PT', 'SK', 'SI', 'ES'].contains(locale.countryCode)) {\n          return AvailableCurrency(AvailableCurrencyEnum.EUR);\n        } else if (currency.getLocale().countryCode.toUpperCase() == locale.countryCode.toUpperCase()) {\n          return currency;\n        }\n      }\n    }\n    return AvailableCurrency(AvailableCurrencyEnum.USD);\n  }\n}"
  },
  {
    "path": "lib/model/available_languages.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\n\nenum AvailableLanguage {\n  DEFAULT,\n  ENGLISH,\n  ARABIC,\n  CATALAN,\n  CHINESE_SIMPLIFIED,\n  GERMAN,\n  SPANISH,\n  TURKISH\n}\n\n/// Represent the available languages our app supports\nclass LanguageSetting extends SettingSelectionItem {\n  AvailableLanguage language;\n\n  LanguageSetting(this.language);\n\n  String getDisplayName(BuildContext context) {\n    switch (language) {\n      case AvailableLanguage.ENGLISH:\n        return \"English (en)\";\n      case AvailableLanguage.CATALAN:\n        return \"Català (ca)\";        \n      case AvailableLanguage.ARABIC:\n        return \"العَرَبِيَّة‎ (ar)\";\n      case AvailableLanguage.CHINESE_SIMPLIFIED:\n        return \"简体字 (zh-Hans)\";\n      case AvailableLanguage.GERMAN:\n        return \"Deutsch (de)\";\n      case AvailableLanguage.SPANISH:\n        return \"Español (es)\";\n      case AvailableLanguage.TURKISH:\n        return \"Türkçe (tr)\";\n      default:\n        return AppLocalization.of(context).systemDefaultHeader;\n    }\n  }\n\n  String getLocaleString() {\n    switch (language) {\n      case AvailableLanguage.ENGLISH:\n        return \"en\";\n      case AvailableLanguage.ARABIC:\n        return \"ar\";\n      case AvailableLanguage.CATALAN:\n        return \"ca\";        \n      case AvailableLanguage.CHINESE_SIMPLIFIED:\n        return \"zh-Hans\";\n      case AvailableLanguage.GERMAN:\n        return \"de\";\n      case AvailableLanguage.SPANISH:\n        return \"es\";\n      case AvailableLanguage.TURKISH:\n        return \"tr\";\n      default:\n        return \"DEFAULT\";\n    }\n  }\n\n  Locale getLocale() {\n    String localeStr = getLocaleString();\n    if (localeStr == 'DEFAULT') {\n      return Locale('en');\n    } else if (localeStr == 'zh-Hans' || localeStr == 'zh-Hant') {\n      return Locale.fromSubtags(languageCode: 'zh', scriptCode: localeStr.split('-')[1]);\n    }\n    return Locale(localeStr);\n  }\n\n  // For saving to shared prefs\n  String getId() {\n    return language.toString();\n  }\n}"
  },
  {
    "path": "lib/model/available_themes.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:blaise_wallet_flutter/themes.dart';\nimport 'package:flutter/material.dart';\n\nenum ThemeOptions { LIGHT, DARK, COPPER }\n\n/// Represent notification on/off setting\nclass ThemeSetting extends SettingSelectionItem {\n  ThemeOptions theme;\n\n  ThemeSetting(this.theme);\n\n  String getDisplayName(BuildContext context) {\n    switch (theme) {\n      case ThemeOptions.DARK:\n        return AppLocalization.of(context).themeDarkHeader;\n      case ThemeOptions.COPPER:\n        return AppLocalization.of(context).themeCopperHeader;\n      case ThemeOptions.LIGHT:\n      default:\n        return AppLocalization.of(context).themeLightHeader;\n    }\n  }\n\n  BaseTheme getTheme() {\n    switch (theme) {\n      case ThemeOptions.COPPER:\n        return BlaiseCopperTheme();\n      case ThemeOptions.DARK:\n        return BlaiseDarkTheme();\n      case ThemeOptions.LIGHT:\n      default:\n        return BlaiseLightTheme();\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return theme.index;\n  }\n}\n"
  },
  {
    "path": "lib/model/db/appdb.dart",
    "content": "import 'dart:async';\nimport 'dart:io' as io;\nimport 'package:flutter/foundation.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:path/path.dart';\nimport 'package:sqflite/sqflite.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\n\nclass DBHelper{\n  static const int DB_VERSION = 1;\n  static const String CONTACTS_SQL =\n    \"\"\"CREATE TABLE Contacts( \n        id INTEGER PRIMARY KEY AUTOINCREMENT, \n        name TEXT, \n        account INTEGER, \n        payload TEXT)\"\"\";\n\n  static Database _db;\n\n  Future<Database> get db async {\n    if(_db != null)\n      return _db;\n    _db = await initDb();\n    return _db;\n  }\n\n  initDb() async {\n    io.Directory documentsDirectory = await getApplicationDocumentsDirectory();\n    String path = join(documentsDirectory.path, \"blaise.db\");\n    var theDb = await openDatabase(path, version: DB_VERSION, onCreate: _onCreate, onUpgrade: _onUpgrade);\n    return theDb;\n  }\n\n  void _onCreate(Database db, int version) async {\n    // When creating the db, create the tables\n    await db.execute(CONTACTS_SQL);\n  }\n\n  void _onUpgrade(Database db, int oldVersion, int newVersion) async {\n    return;\n  }\n\n  // Contacts\n  Future<List<Contact>> getContacts() async {\n    var dbClient = await db;\n    List<Map> list = await dbClient.rawQuery('SELECT * FROM Contacts ORDER BY name');\n    List<Contact> contacts = new List();\n    for (int i = 0; i < list.length; i++) {\n      contacts.add(new Contact(id: list[i][\"id\"], name: list[i][\"name\"], account: AccountNumber.fromInt(list[i][\"account\"]), payload: list[i][\"payload\"]));\n    }\n    return contacts;\n  }\n\n  Future<List<Contact>> getContactsWithNameLike(String pattern) async {\n    var dbClient = await db;\n    List<Map> list = await dbClient.rawQuery('SELECT * FROM Contacts WHERE name LIKE \\'%$pattern%\\' ORDER BY LOWER(name)');\n    List<Contact> contacts = new List();\n    for (int i = 0; i < list.length; i++) {\n      contacts.add(new Contact(id: list[i][\"id\"], name: list[i][\"name\"], account: AccountNumber.fromInt(list[i][\"account\"]), payload: list[i][\"payload\"]));\n    }\n    return contacts;\n  }\n\n  Future<Contact> getContactWithAccount(AccountNumber account) async {\n    var dbClient = await db;\n    List<Map> list = await dbClient.rawQuery('SELECT * FROM Contacts WHERE account = ?', [account.account]);\n    if (list.length > 0) {\n      return Contact(id: list[0][\"id\"], name: list[0][\"name\"], account: AccountNumber.fromInt(list[0][\"account\"]), payload: list[0][\"payload\"]);\n    }\n    return null;\n  }\n\n  Future<Contact> getContactWithName(String name) async {\n    var dbClient = await db;\n    List<Map> list = await dbClient.rawQuery('SELECT * FROM Contacts WHERE name = ?', [name]);\n    if (list.length > 0) {\n      return Contact(id: list[0][\"id\"], name: list[0][\"name\"], account: AccountNumber.fromInt(list[0][\"account\"]), payload: list[0][\"payload\"]);\n    }\n    return null;\n  }\n\n  Future<bool> contactExistsWithName(String name) async {\n    var dbClient = await db;\n    int count = Sqflite.firstIntValue(await dbClient.rawQuery('SELECT count(*) FROM Contacts WHERE lower(name) = ?', [name.toLowerCase()]));\n    return count > 0;\n  }\n\n  Future<bool> contactExistsWithAccount(AccountNumber account) async {\n    var dbClient = await db;\n    int count = Sqflite.firstIntValue(await dbClient.rawQuery('SELECT count(*) FROM Contacts WHERE account = ?', [account.account]));\n    return count > 0;\n  }\n\n  Future<int> saveContact(Contact contact) async {\n    var dbClient = await db;\n    return await dbClient.rawInsert('INSERT INTO Contacts (name, account, payload) values(?, ?, ?)', [contact.name, contact.account.account, contact.payload]);\n  }\n\n  Future<int> saveContacts(List<Contact> contacts) async {\n    int count = 0;\n    for (Contact c in contacts) {\n      if (await saveContact(c) > 0) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  Future<bool> deleteContact(Contact contact) async {\n    var dbClient = await db;\n    return await dbClient.rawDelete(\"DELETE FROM Contacts WHERE account = ?\", [contact.account.account]) > 0;\n  }\n}"
  },
  {
    "path": "lib/model/db/contact.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/core.dart';\n\npart 'contact.g.dart';\n\n@JsonSerializable()\nclass Contact {\n  @JsonKey(ignore:true)\n  int id;\n  @JsonKey(name:'name')\n  String name;\n  @JsonKey(name:'account', fromJson: intToAccountNum, toJson: accountNumToInt)\n  AccountNumber account;\n  @JsonKey(name:'payload')\n  String payload;\n\n  Contact({@required this.name, @required this.account, this.id, this.payload = \"\"});\n\n  factory Contact.fromJson(Map<String, dynamic> json) => _$ContactFromJson(json);\n  Map<String, dynamic> toJson() => _$ContactToJson(this);\n\n  bool operator ==(o) => o is Contact && o.name == name && o.account == account && o.payload == payload;\n  int get hashCode => hash3(name.hashCode, account.hashCode, payload.hashCode);\n}"
  },
  {
    "path": "lib/model/db/contact.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'contact.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nContact _$ContactFromJson(Map<String, dynamic> json) {\n  return Contact(\n    name: json['name'] as String,\n    account: intToAccountNum(json['account'] as int),\n    payload: json['payload'] as String,\n  );\n}\n\nMap<String, dynamic> _$ContactToJson(Contact instance) => <String, dynamic>{\n      'name': instance.name,\n      'account': accountNumToInt(instance.account),\n      'payload': instance.payload,\n    };\n"
  },
  {
    "path": "lib/model/lock_timeout.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\n\nenum LockTimeoutOption { ZERO, ONE, FIVE, FIFTEEN, THIRTY, SIXTY }\n\n/// Represent auto-lock delay when requiring auth to open\nclass LockTimeoutSetting extends SettingSelectionItem {\n  LockTimeoutOption setting;\n\n  LockTimeoutSetting(this.setting);\n\n  String getDisplayName(BuildContext context) {\n    switch (setting) {\n      case LockTimeoutOption.ZERO:\n        return AppLocalization.of(context).lockInstantHeader;\n      case LockTimeoutOption.ONE:\n        return AppLocalization.of(context).lock1Header.replaceAll(\"%1\", \"1\");\n      case LockTimeoutOption.FIVE:\n        return AppLocalization.of(context).lock5Header.replaceAll(\"%1\", \"5\");\n      case LockTimeoutOption.FIFTEEN:\n        return AppLocalization.of(context).lock15Header.replaceAll(\"%1\", \"15\");\n      case LockTimeoutOption.THIRTY:\n        return AppLocalization.of(context).lock30Header.replaceAll(\"%1\", \"30\");\n      case LockTimeoutOption.SIXTY:\n        return AppLocalization.of(context).lock60Header.replaceAll(\"%1\", \"60\");\n      default:\n        return AppLocalization.of(context).lock1Header.replaceAll(\"%1\", \"1\");\n    }\n  }\n\n  Duration getDuration() {\n    switch (setting) {\n      case LockTimeoutOption.ZERO:\n        return Duration(seconds: 3);\n      case LockTimeoutOption.ONE:\n        return Duration(minutes: 1);\n      case LockTimeoutOption.FIVE:\n        return Duration(minutes: 5);\n      case LockTimeoutOption.FIFTEEN:\n        return Duration(minutes: 15);\n      case LockTimeoutOption.THIRTY:\n        return Duration(minutes: 30);\n      case LockTimeoutOption.SIXTY:\n        return Duration(minutes: 60);\n      default:\n        return Duration(minutes: 1);\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return setting.index;\n  }\n}\n"
  },
  {
    "path": "lib/model/notification_enabled.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\n\nenum NotificationOptions { ON, OFF }\n\n/// Represent notification on/off setting\nclass NotificationSetting extends SettingSelectionItem {\n  NotificationOptions setting;\n\n  NotificationSetting(this.setting);\n\n  String getDisplayName(BuildContext context) {\n    switch (setting) {\n      case NotificationOptions.ON:\n        return AppLocalization.of(context).onHeader;\n      case NotificationOptions.OFF:\n      default:\n        return AppLocalization.of(context).offHeader;\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return setting.index;\n  }\n}\n"
  },
  {
    "path": "lib/model/setting_item.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// Models that are used in settings dialogs/dropdowns\nabstract class SettingSelectionItem {\n  String getDisplayName(BuildContext context);\n}"
  },
  {
    "path": "lib/model/unlock_setting.dart",
    "content": "import 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/setting_item.dart';\nimport 'package:flutter/material.dart';\n\nenum UnlockOption { YES, NO }\n\n/// Represent authenticate to open setting\nclass UnlockSetting extends SettingSelectionItem {\n  UnlockOption setting;\n\n  UnlockSetting(this.setting);\n\n  String getDisplayName(BuildContext context) {\n    switch (setting) {\n      case UnlockOption.YES:\n        return AppLocalization.of(context).yesHeader;\n      case UnlockOption.NO:\n      default:\n        return AppLocalization.of(context).noHeader;\n    }\n  }\n\n  // For saving to shared prefs\n  int getIndex() {\n    return setting.index;\n  }\n}"
  },
  {
    "path": "lib/network/http_client.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/request/borrow_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/freepasa_get_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/freepasa_verify_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/getborrowed_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/borrow_response.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/getborrowed_response.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:http/http.dart' as http;\nimport 'dart:convert';\n\nimport 'package:logger/logger.dart';\n\n/// Blaise HTTP API Client\nclass HttpAPI {\n  static const String API_URL = 'https://blaiseapi.appditto.com/v1';\n  static Logger log = sl.get<Logger>();\n\n  static Future<BorrowResponse> getBorrowed(String b58pubkey) async {\n    try {\n      GetBorrowedRequest request = GetBorrowedRequest(b58pubkey: b58pubkey);\n      http.Response response = await http.post(Uri.parse(API_URL),\n          body: json.encode(request.toJson()));\n      if (response.statusCode != 200) {\n        return null;\n      }\n      Map<dynamic, dynamic> jsonResp = json.decode(response.body);\n      if (jsonResp.containsKey('borrowed_account') &&\n          jsonResp['borrowed_account'] != '') {\n        GetBorrowedResponse bResp = GetBorrowedResponse.fromJson(jsonResp);\n        return bResp.account;\n      } else if (jsonResp['borrowed_account'] == '') {\n        return BorrowResponse();\n      }\n      return null;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  static Future<BorrowResponse> borrowAccount(String b58pubkey) async {\n    try {\n      BorrowRequest request = BorrowRequest(b58pubkey: b58pubkey);\n      http.Response response = await http.post(Uri.parse(API_URL),\n          body: json.encode(request.toJson()));\n      if (response.statusCode != 200) {\n        return null;\n      }\n      Map<dynamic, dynamic> jsonResp = json.decode(response.body);\n      if (jsonResp.containsKey('pasa')) {\n        BorrowResponse bResp = BorrowResponse.fromJson(jsonResp);\n        return bResp;\n      }\n      return null;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  /// Request a FreePASA, using phone number\n  /// Response is a request ID, which can be used in the verify phone number request\n  static Future<String> getFreePASA(\n      String isoCode, String phoneNumber, String b58pubkey) async {\n    try {\n      FreePASAGetRequest request = FreePASAGetRequest(\n          phoneIso: isoCode, phoneNumber: phoneNumber, b58pubkey: b58pubkey);\n      http.Response response = await http.post(Uri.parse(API_URL),\n          body: json.encode(request.toJson()));\n      if (response.statusCode != 200) {\n        return null;\n      }\n      Map<dynamic, dynamic> jsonResp = json.decode(response.body);\n      if (jsonResp.containsKey('success')) {\n        return jsonResp['success'];\n      }\n      return null;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  /// Verify a FreePASA, using phone number\n  /// Response is the account that has been received\n  static Future<int> verifyFreePASA(String requestId, String code) async {\n    try {\n      FreePASAVerifyRequest request =\n          FreePASAVerifyRequest(requestId: requestId, code: code);\n      http.Response response = await http.post(Uri.parse(API_URL),\n          body: json.encode(request.toJson()));\n      if (response.statusCode != 200) {\n        log.d(\"RECEIVED STATUS CODE NOT OK ${response.statusCode}\");\n        return null;\n      }\n      Map<dynamic, dynamic> jsonResp = json.decode(response.body);\n      log.d(\"Received response ${response.body}\");\n      if (jsonResp.containsKey('success')) {\n        log.d(\"New account is ${jsonResp['success']}\");\n        return int.parse(jsonResp['success'].toString());\n      }\n      return null;\n    } catch (e) {\n      log.e(\"Caughe exception in freepasa request ${e.toString()}\", e);\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/network/model/base_request.dart",
    "content": "abstract class BaseRequest {\n  Map<String, dynamic> toJson();\n}"
  },
  {
    "path": "lib/network/model/request/borrow_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\n\npart 'borrow_request.g.dart';\n\n@JsonSerializable()\nclass BorrowRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'b58_pubkey')\n  String b58pubkey;\n\n  BorrowRequest({this.action = \"borrow_account\", this.b58pubkey}) : super();\n\n  factory BorrowRequest.fromJson(Map<String, dynamic> json) => _$BorrowRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$BorrowRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/borrow_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'borrow_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nBorrowRequest _$BorrowRequestFromJson(Map<String, dynamic> json) {\n  return BorrowRequest(\n    action: json['action'] as String,\n    b58pubkey: json['b58_pubkey'] as String,\n  );\n}\n\nMap<String, dynamic> _$BorrowRequestToJson(BorrowRequest instance) =>\n    <String, dynamic>{\n      'action': instance.action,\n      'b58_pubkey': instance.b58pubkey,\n    };\n"
  },
  {
    "path": "lib/network/model/request/fcm_delete_account_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'fcm_delete_account_request.g.dart';\n\n@JsonSerializable()\nclass FcmDeleteAccountRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'account', includeIfNull: false)\n  int account;\n\n  @JsonKey(name:'fcm_token', includeIfNull: false)\n  String fcmToken;\n\n  FcmDeleteAccountRequest({@required int account, @required String fcmToken}) : super() {\n    this.action = 'fcm_update';\n    this.account = account;\n    this.fcmToken = fcmToken;\n  }\n\n  factory FcmDeleteAccountRequest.fromJson(Map<String, dynamic> json) => _$FcmDeleteAccountRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$FcmDeleteAccountRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/fcm_delete_account_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'fcm_delete_account_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nFcmDeleteAccountRequest _$FcmDeleteAccountRequestFromJson(\n    Map<String, dynamic> json) {\n  return FcmDeleteAccountRequest(\n    account: json['account'] as int,\n    fcmToken: json['fcm_token'] as String,\n  )..action = json['action'] as String;\n}\n\nMap<String, dynamic> _$FcmDeleteAccountRequestToJson(\n    FcmDeleteAccountRequest instance) {\n  final val = <String, dynamic>{\n    'action': instance.action,\n  };\n\n  void writeNotNull(String key, dynamic value) {\n    if (value != null) {\n      val[key] = value;\n    }\n  }\n\n  writeNotNull('account', instance.account);\n  writeNotNull('fcm_token', instance.fcmToken);\n  return val;\n}\n"
  },
  {
    "path": "lib/network/model/request/fcm_update_bulk_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'fcm_update_bulk_request.g.dart';\n\n@JsonSerializable()\nclass FcmUpdateBulkRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'account', includeIfNull: false)\n  List<int> accounts;\n\n  @JsonKey(name:'b58_pubkey', includeIfNull: false)\n  String b58pubkey;\n\n  @JsonKey(name:'fcm_token', includeIfNull: false)\n  String fcmToken;\n\n  @JsonKey(name:'enabled')\n  bool enabled;\n\n  FcmUpdateBulkRequest({@required this.accounts, @required this.fcmToken, @required this.enabled, @required this.b58pubkey}) : super() {\n    this.action = 'fcm_update_bulk';\n  }\n\n  factory FcmUpdateBulkRequest.fromJson(Map<String, dynamic> json) => _$FcmUpdateBulkRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$FcmUpdateBulkRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/fcm_update_bulk_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'fcm_update_bulk_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nFcmUpdateBulkRequest _$FcmUpdateBulkRequestFromJson(Map<String, dynamic> json) {\n  return FcmUpdateBulkRequest(\n    accounts: (json['account'] as List)?.map((e) => e as int)?.toList(),\n    fcmToken: json['fcm_token'] as String,\n    enabled: json['enabled'] as bool,\n    b58pubkey: json['b58_pubkey'] as String,\n  )..action = json['action'] as String;\n}\n\nMap<String, dynamic> _$FcmUpdateBulkRequestToJson(\n    FcmUpdateBulkRequest instance) {\n  final val = <String, dynamic>{\n    'action': instance.action,\n  };\n\n  void writeNotNull(String key, dynamic value) {\n    if (value != null) {\n      val[key] = value;\n    }\n  }\n\n  writeNotNull('account', instance.accounts);\n  writeNotNull('b58_pubkey', instance.b58pubkey);\n  writeNotNull('fcm_token', instance.fcmToken);\n  val['enabled'] = instance.enabled;\n  return val;\n}\n"
  },
  {
    "path": "lib/network/model/request/fcm_update_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'fcm_update_request.g.dart';\n\n@JsonSerializable()\nclass FcmUpdateRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'account', includeIfNull: false)\n  int account;\n\n  @JsonKey(name:'b58_pubkey', includeIfNull: false)\n  String b58pubkey;\n\n  @JsonKey(name:'fcm_token', includeIfNull: false)\n  String fcmToken;\n\n  @JsonKey(name:'enabled')\n  bool enabled;\n\n  FcmUpdateRequest({@required this.account, @required this.fcmToken, @required this.enabled, @required this.b58pubkey}) : super() {\n    this.action = 'fcm_update';\n  }\n\n  factory FcmUpdateRequest.fromJson(Map<String, dynamic> json) => _$FcmUpdateRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$FcmUpdateRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/fcm_update_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'fcm_update_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nFcmUpdateRequest _$FcmUpdateRequestFromJson(Map<String, dynamic> json) {\n  return FcmUpdateRequest(\n    account: json['account'] as int,\n    fcmToken: json['fcm_token'] as String,\n    enabled: json['enabled'] as bool,\n    b58pubkey: json['b58_pubkey'] as String,\n  )..action = json['action'] as String;\n}\n\nMap<String, dynamic> _$FcmUpdateRequestToJson(FcmUpdateRequest instance) {\n  final val = <String, dynamic>{\n    'action': instance.action,\n  };\n\n  void writeNotNull(String key, dynamic value) {\n    if (value != null) {\n      val[key] = value;\n    }\n  }\n\n  writeNotNull('account', instance.account);\n  writeNotNull('b58_pubkey', instance.b58pubkey);\n  writeNotNull('fcm_token', instance.fcmToken);\n  val['enabled'] = instance.enabled;\n  return val;\n}\n"
  },
  {
    "path": "lib/network/model/request/freepasa_get_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'freepasa_get_request.g.dart';\n\n@JsonSerializable()\nclass FreePASAGetRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'phone_iso')\n  String phoneIso;\n\n  @JsonKey(name:'phone_number')\n  String phoneNumber;\n\n  @JsonKey(name:'b58_pubkey')\n  String b58pubkey;\n\n\n  FreePASAGetRequest({@required this.phoneIso, @required this.phoneNumber, @required this.b58pubkey}) : super() {\n    this.action = 'freepasa_get';\n  }\n\n  factory FreePASAGetRequest.fromJson(Map<String, dynamic> json) => _$FreePASAGetRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$FreePASAGetRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/freepasa_get_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'freepasa_get_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nFreePASAGetRequest _$FreePASAGetRequestFromJson(Map<String, dynamic> json) {\n  return FreePASAGetRequest(\n    phoneIso: json['phone_iso'] as String,\n    phoneNumber: json['phone_number'] as String,\n    b58pubkey: json['b58_pubkey'] as String,\n  )..action = json['action'] as String;\n}\n\nMap<String, dynamic> _$FreePASAGetRequestToJson(FreePASAGetRequest instance) =>\n    <String, dynamic>{\n      'action': instance.action,\n      'phone_iso': instance.phoneIso,\n      'phone_number': instance.phoneNumber,\n      'b58_pubkey': instance.b58pubkey,\n    };\n"
  },
  {
    "path": "lib/network/model/request/freepasa_verify_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'freepasa_verify_request.g.dart';\n\n@JsonSerializable()\nclass FreePASAVerifyRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'request_id')\n  String requestId;\n\n  @JsonKey(name:'code')\n  String code;\n\n  FreePASAVerifyRequest({@required this.requestId, @required this.code}) : super() {\n    this.action = 'freepasa_verify';\n  }\n\n  factory FreePASAVerifyRequest.fromJson(Map<String, dynamic> json) => _$FreePASAVerifyRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$FreePASAVerifyRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/freepasa_verify_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'freepasa_verify_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nFreePASAVerifyRequest _$FreePASAVerifyRequestFromJson(\n    Map<String, dynamic> json) {\n  return FreePASAVerifyRequest(\n    requestId: json['request_id'] as String,\n    code: json['code'] as String,\n  )..action = json['action'] as String;\n}\n\nMap<String, dynamic> _$FreePASAVerifyRequestToJson(\n        FreePASAVerifyRequest instance) =>\n    <String, dynamic>{\n      'action': instance.action,\n      'request_id': instance.requestId,\n      'code': instance.code,\n    };\n"
  },
  {
    "path": "lib/network/model/request/getborrowed_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\n\npart 'getborrowed_request.g.dart';\n\n@JsonSerializable()\nclass GetBorrowedRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'b58_pubkey')\n  String b58pubkey;\n\n  GetBorrowedRequest({this.action = \"getborrowed\", this.b58pubkey}) : super();\n\n  factory GetBorrowedRequest.fromJson(Map<String, dynamic> json) => _$GetBorrowedRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$GetBorrowedRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/getborrowed_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'getborrowed_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nGetBorrowedRequest _$GetBorrowedRequestFromJson(Map<String, dynamic> json) {\n  return GetBorrowedRequest(\n    action: json['action'] as String,\n    b58pubkey: json['b58_pubkey'] as String,\n  );\n}\n\nMap<String, dynamic> _$GetBorrowedRequestToJson(GetBorrowedRequest instance) =>\n    <String, dynamic>{\n      'action': instance.action,\n      'b58_pubkey': instance.b58pubkey,\n    };\n"
  },
  {
    "path": "lib/network/model/request/subscribe_request.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:json_annotation/json_annotation.dart';\n\npart 'subscribe_request.g.dart';\n\n@JsonSerializable()\nclass SubscribeRequest extends BaseRequest {\n  @JsonKey(name:'action')\n  String action;\n\n  @JsonKey(name:'account', includeIfNull: false)\n  int account;\n\n  @JsonKey(name:'currency', includeIfNull: false)\n  String currency;\n\n  @JsonKey(name:'uuid', includeIfNull: false)\n  String uuid;\n\n  @JsonKey(name:'b58_pubkey', includeIfNull: false)\n  String b58pubkey;\n\n  @JsonKey(name:'fcm_token', includeIfNull: false)\n  String fcmToken;\n\n  @JsonKey(name:'notification_enabled', includeIfNull: false)\n  bool notificationEnabled;\n\n  SubscribeRequest({this.action = \"account_subscribe\", this.account, this.currency, this.uuid, this.b58pubkey, this.fcmToken, this.notificationEnabled}) : super();\n\n  factory SubscribeRequest.fromJson(Map<String, dynamic> json) => _$SubscribeRequestFromJson(json);\n  Map<String, dynamic> toJson() => _$SubscribeRequestToJson(this);\n}"
  },
  {
    "path": "lib/network/model/request/subscribe_request.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'subscribe_request.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nSubscribeRequest _$SubscribeRequestFromJson(Map<String, dynamic> json) {\n  return SubscribeRequest(\n    action: json['action'] as String,\n    account: json['account'] as int,\n    currency: json['currency'] as String,\n    uuid: json['uuid'] as String,\n    b58pubkey: json['b58_pubkey'] as String,\n    fcmToken: json['fcm_token'] as String,\n    notificationEnabled: json['notification_enabled'] as bool,\n  );\n}\n\nMap<String, dynamic> _$SubscribeRequestToJson(SubscribeRequest instance) {\n  final val = <String, dynamic>{\n    'action': instance.action,\n  };\n\n  void writeNotNull(String key, dynamic value) {\n    if (value != null) {\n      val[key] = value;\n    }\n  }\n\n  writeNotNull('account', instance.account);\n  writeNotNull('currency', instance.currency);\n  writeNotNull('uuid', instance.uuid);\n  writeNotNull('b58_pubkey', instance.b58pubkey);\n  writeNotNull('fcm_token', instance.fcmToken);\n  writeNotNull('notification_enabled', instance.notificationEnabled);\n  return val;\n}\n"
  },
  {
    "path": "lib/network/model/request_item.dart",
    "content": "import 'dart:convert';\n\n/// Top-level function for running in isolate via flutter compute function\nString encodeRequestItem(dynamic request) {\n  return json.encode(request.toJson());\n}\n\nclass RequestItem<T> {\n  // After this time a request will expire\n  static const int EXPIRE_TIME_S = 15;\n\n  DateTime expireDt;\n  bool isProcessing;\n  T request;\n\n  RequestItem(T request) {\n    this.expireDt = DateTime.now().add(new Duration(seconds: EXPIRE_TIME_S));\n    this.isProcessing = false;\n    this.request = request;\n  }\n}"
  },
  {
    "path": "lib/network/model/response/accounts_response_borrowed.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/response/borrow_response.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\npart 'accounts_response_borrowed.g.dart';\n\n@JsonSerializable()\nclass AccountsResponseBorrowed extends AccountsResponse {\n  @JsonKey(name: 'borrowed_account')\n  BorrowResponse borrowedAccount;\n\n  @JsonKey(name: 'borrow_eligible')\n  bool borrowEligible;\n\n  AccountsResponseBorrowed({this.borrowedAccount, this.borrowEligible}) : super();\n\n  factory AccountsResponseBorrowed.fromJson(Map<String, dynamic> json) => _$AccountsResponseBorrowedFromJson(json);\n  Map<String, dynamic> toJson() => _$AccountsResponseBorrowedToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/accounts_response_borrowed.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'accounts_response_borrowed.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nAccountsResponseBorrowed _$AccountsResponseBorrowedFromJson(\n    Map<String, dynamic> json) {\n  return AccountsResponseBorrowed(\n    borrowedAccount: json['borrowed_account'] == null\n        ? null\n        : BorrowResponse.fromJson(\n            json['borrowed_account'] as Map<String, dynamic>),\n    borrowEligible: json['borrow_eligible'] as bool,\n  )..accounts = (json['result'] as List)\n      ?.map((e) =>\n          e == null ? null : PascalAccount.fromJson(e as Map<String, dynamic>))\n      ?.toList();\n}\n\nMap<String, dynamic> _$AccountsResponseBorrowedToJson(\n        AccountsResponseBorrowed instance) =>\n    <String, dynamic>{\n      'result': instance.accounts,\n      'borrowed_account': instance.borrowedAccount,\n      'borrow_eligible': instance.borrowEligible,\n    };\n"
  },
  {
    "path": "lib/network/model/response/borrow_response.dart",
    "content": "import 'package:json_annotation/json_annotation.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\npart 'borrow_response.g.dart';\n\nDateTime _toDateTime(int v) {\n  return v == null ? null : DateTime.fromMillisecondsSinceEpoch(v);\n}\n\nint _fromDateTime(DateTime v) {\n  return v?.millisecondsSinceEpoch;\n}\n\n@JsonSerializable()\nclass BorrowResponse {\n  @JsonKey(name:'pasa', fromJson: intToAccountNum, toJson: accountNumToInt)\n  AccountNumber account;\n\n  @JsonKey(\n      name: 'expires',\n      fromJson: _toDateTime,\n      toJson: _fromDateTime,\n      includeIfNull: false)\n  DateTime expiry;\n\n  @JsonKey(\n      name: 'price',\n      includeIfNull: false,\n      toJson: currencyToDouble,\n      fromJson: pascalToCurrency)\n  Currency price;\n\n  @JsonKey(name: 'paid')\n  bool paid;\n\n  @JsonKey(name: 'transferred')\n  bool transferred;\n\n  BorrowResponse();\n\n  factory BorrowResponse.fromJson(Map<String, dynamic> json) => _$BorrowResponseFromJson(json);\n  Map<String, dynamic> toJson() => _$BorrowResponseToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/borrow_response.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'borrow_response.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nBorrowResponse _$BorrowResponseFromJson(Map<String, dynamic> json) {\n  return BorrowResponse()\n    ..account = intToAccountNum(json['pasa'] as int)\n    ..expiry = _toDateTime(json['expires'] as int)\n    ..price = pascalToCurrency(json['price'] as num)\n    ..paid = json['paid'] as bool\n    ..transferred = json['transferred'] as bool;\n}\n\nMap<String, dynamic> _$BorrowResponseToJson(BorrowResponse instance) {\n  final val = <String, dynamic>{\n    'pasa': accountNumToInt(instance.account),\n  };\n\n  void writeNotNull(String key, dynamic value) {\n    if (value != null) {\n      val[key] = value;\n    }\n  }\n\n  writeNotNull('expires', _fromDateTime(instance.expiry));\n  writeNotNull('price', currencyToDouble(instance.price));\n  val['paid'] = instance.paid;\n  val['transferred'] = instance.transferred;\n  return val;\n}\n"
  },
  {
    "path": "lib/network/model/response/error_response.dart",
    "content": "import 'package:json_annotation/json_annotation.dart';\n\npart 'error_response.g.dart';\n\n@JsonSerializable()\nclass ErrorResponse {\n  @JsonKey(name:'error')\n  String error;\n\n  ErrorResponse();\n\n  factory ErrorResponse.fromJson(Map<String, dynamic> json) => _$ErrorResponseFromJson(json);\n  Map<String, dynamic> toJson() => _$ErrorResponseToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/error_response.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'error_response.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nErrorResponse _$ErrorResponseFromJson(Map<String, dynamic> json) {\n  return ErrorResponse()..error = json['error'] as String;\n}\n\nMap<String, dynamic> _$ErrorResponseToJson(ErrorResponse instance) =>\n    <String, dynamic>{\n      'error': instance.error,\n    };\n"
  },
  {
    "path": "lib/network/model/response/getborrowed_response.dart",
    "content": "import 'package:blaise_wallet_flutter/network/model/response/borrow_response.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\npart 'getborrowed_response.g.dart';\n\n@JsonSerializable()\nclass GetBorrowedResponse {\n  @JsonKey(name:'borrowed_account')\n  BorrowResponse account;\n\n  GetBorrowedResponse();\n\n  factory GetBorrowedResponse.fromJson(Map<String, dynamic> json) => _$GetBorrowedResponseFromJson(json);\n  Map<String, dynamic> toJson() => _$GetBorrowedResponseToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/getborrowed_response.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'getborrowed_response.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nGetBorrowedResponse _$GetBorrowedResponseFromJson(Map<String, dynamic> json) {\n  return GetBorrowedResponse()\n    ..account = json['borrowed_account'] == null\n        ? null\n        : BorrowResponse.fromJson(\n            json['borrowed_account'] as Map<String, dynamic>);\n}\n\nMap<String, dynamic> _$GetBorrowedResponseToJson(\n        GetBorrowedResponse instance) =>\n    <String, dynamic>{\n      'borrowed_account': instance.account,\n    };\n"
  },
  {
    "path": "lib/network/model/response/price_response.dart",
    "content": "import 'package:json_annotation/json_annotation.dart';\n\npart 'price_response.g.dart';\n\ndouble _toDouble(v) {\n  return double.tryParse(v.toString());\n}\n\n@JsonSerializable()\nclass PriceResponse {\n  @JsonKey(name:'currency')\n  String currency;\n\n  @JsonKey(name:'price', fromJson:_toDouble)\n  double price;\n\n  @JsonKey(name:'btc', fromJson:_toDouble)\n  double btcPrice;\n\n  PriceResponse();\n\n  factory PriceResponse.fromJson(Map<String, dynamic> json) => _$PriceResponseFromJson(json);\n  Map<String, dynamic> toJson() => _$PriceResponseToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/price_response.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'price_response.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nPriceResponse _$PriceResponseFromJson(Map<String, dynamic> json) {\n  return PriceResponse()\n    ..currency = json['currency'] as String\n    ..price = _toDouble(json['price'])\n    ..btcPrice = _toDouble(json['btc']);\n}\n\nMap<String, dynamic> _$PriceResponseToJson(PriceResponse instance) =>\n    <String, dynamic>{\n      'currency': instance.currency,\n      'price': instance.price,\n      'btc': instance.btcPrice,\n    };\n"
  },
  {
    "path": "lib/network/model/response/subscribe_response.dart",
    "content": "import 'package:json_annotation/json_annotation.dart';\n\npart 'subscribe_response.g.dart';\n\ndouble _toDouble(v) {\n  return double.tryParse(v.toString());\n}\n\n/// For running in an isolate, needs to be top-level function\nSubscribeResponse subscribeResponseFromJson(Map<dynamic, dynamic> json) {\n  return SubscribeResponse.fromJson(json);\n} \n\n@JsonSerializable()\nclass SubscribeResponse {\n  // Server provides a uuid for each connection\n  @JsonKey(name:'uuid')\n  String uuid;\n\n  @JsonKey(name:'price', fromJson:_toDouble)\n  double price;\n\n  @JsonKey(name:'btc', fromJson:_toDouble)\n  double btcPrice;\n\n  @JsonKey(name:'borrow_eligible', defaultValue: false)\n  bool borrowEligible;\n\n  SubscribeResponse();\n\n  factory SubscribeResponse.fromJson(Map<String, dynamic> json) => _$SubscribeResponseFromJson(json);\n  Map<String, dynamic> toJson() => _$SubscribeResponseToJson(this);\n}"
  },
  {
    "path": "lib/network/model/response/subscribe_response.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'subscribe_response.dart';\n\n// **************************************************************************\n// JsonSerializableGenerator\n// **************************************************************************\n\nSubscribeResponse _$SubscribeResponseFromJson(Map<String, dynamic> json) {\n  return SubscribeResponse()\n    ..uuid = json['uuid'] as String\n    ..price = _toDouble(json['price'])\n    ..btcPrice = _toDouble(json['btc'])\n    ..borrowEligible = json['borrow_eligible'] as bool ?? false;\n}\n\nMap<String, dynamic> _$SubscribeResponseToJson(SubscribeResponse instance) =>\n    <String, dynamic>{\n      'uuid': instance.uuid,\n      'price': instance.price,\n      'btc': instance.btcPrice,\n      'borrow_eligible': instance.borrowEligible,\n    };\n"
  },
  {
    "path": "lib/network/ws_client.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\n\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/network/model/base_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/subscribe_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request_item.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/price_response.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/subscribe_response.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:pascaldart/pascaldart.dart' as pd;\n\nimport 'package:web_socket_channel/io.dart';\nimport 'package:package_info/package_info.dart';\nimport 'package:logger/logger.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:synchronized/synchronized.dart';\n\n// For running in isolate\nMap decodeJson(dynamic src) {\n  return json.decode(src);\n}\n\n// WSClient singleton\nclass WSClient {\n  final Logger log = sl.get<Logger>();\n\n  // For all requests we place them on a queue with expiry to be processed sequentially\n  Queue<RequestItem> _requestQueue;\n\n  // WS Client\n  IOWebSocketChannel _channel;\n\n  // WS connection status\n  bool _isConnected;\n  bool _isConnecting;\n  bool suspended; // When the app explicity closes the connection\n\n  // Lock instnace for synchronization\n  Lock _lock;\n\n  // Constructor\n  WSClient() {\n    _requestQueue = Queue();\n    _isConnected = false;\n    _isConnecting = false;\n    suspended = false;\n    _lock = Lock();\n    initCommunication(unsuspend: true);\n  }\n\n  // Re-connect handling\n  bool _isInRetryState = false;\n  StreamSubscription<dynamic> reconnectStream;\n\n  /// Retry up to once per 3 seconds\n  Future<void> reconnectToService() async {\n    if (_isInRetryState) {\n      return;\n    } else if (reconnectStream != null) {\n      reconnectStream.cancel();\n    }\n    _isInRetryState = true;\n    log.d(\"Retrying connection in 3 seconds...\");\n    Future<dynamic> delayed = new Future.delayed(new Duration(seconds: 3));\n    delayed.then((_) {\n      return true;\n    });\n    reconnectStream = delayed.asStream().listen((_) {\n      log.d(\"Attempting connection to service\");\n      initCommunication(unsuspend: true);\n      _isInRetryState = false;\n    });\n  }\n\n  // Connect to server\n  Future<void> initCommunication({bool unsuspend = false}) async {\n    if (_isConnected || _isConnecting) {\n      return;\n    } else if (suspended && !unsuspend) {\n      return;\n    } else if (!unsuspend) {\n      reconnectToService();\n      return;\n    }\n    _isConnecting = true;\n    try {\n      var packageInfo = await PackageInfo.fromPlatform();\n\n      _isConnecting = true;\n      suspended = false;\n      _channel = new IOWebSocketChannel\n                      .connect(AppConstants.WS_API_URL,\n                               headers: {\n                                'X-Client-Version': packageInfo.buildNumber\n                               });\n      log.d(\"Connected to service\");\n      _isConnecting = false;\n      _isConnected = true;\n      EventTaxiImpl.singleton().fire(ConnStatusEvent(status: ConnectionStatus.CONNECTED));\n      _channel.stream.listen(_onMessageReceived, onDone: connectionClosed, onError: connectionClosedError);\n    } catch(e){\n      log.e(\"Error from service ${e.toString()}\", e);\n      _isConnected = false;\n      _isConnecting = false;\n      EventTaxiImpl.singleton().fire(ConnStatusEvent(status: ConnectionStatus.DISCONNECTED));\n    }\n  }\n\n  // Connection closed (normally)\n  void connectionClosed() {\n    _isConnected = false;\n    _isConnecting = false;\n    clearQueue();\n    log.d(\"disconnected from service\");\n    // Send disconnected message\n    EventTaxiImpl.singleton().fire(ConnStatusEvent(status: ConnectionStatus.DISCONNECTED));\n  }\n\n  // Connection closed (with error)\n  void connectionClosedError(e) {\n    _isConnected = false;\n    _isConnecting = false;\n    clearQueue();\n    log.d(\"disconnected from service with error ${e.toString()}\");\n    // Send disconnected message\n    EventTaxiImpl.singleton().fire(ConnStatusEvent(status: ConnectionStatus.DISCONNECTED));\n  }\n\n  // Close connection\n  void reset({bool suspend = false}){\n    suspended = suspend;\n    if (_channel != null && _channel.sink != null) {\n      _channel.sink.close();\n      _isConnected = false;\n      _isConnecting = false;\n    }\n  }\n\n  // Send message\n  Future<void> _send(String message) async {\n    bool reset = false;\n    try {\n      if (_channel != null && _channel.sink != null && _isConnected) {\n        _channel.sink.add(message);\n      } else {\n        reset = true; // Re-establish connection\n      }\n    } catch (e) {\n      reset = true;\n    } finally {\n      if (reset) {\n        // Reset queue item statuses\n        _requestQueue.forEach((requestItem) {\n          requestItem.isProcessing = false;\n        });\n        if (!_isConnecting && !suspended) {\n          initCommunication();\n        }\n      }\n    }\n  }\n\n  Future<void> _onMessageReceived(dynamic message) async {\n    if (suspended) {\n      return;\n    }\n    await _lock.synchronized(() async {\n      _isConnected = true;\n      _isConnecting = false;\n      // TODO showing full length for debugging\n      log.d(message);\n      //log.d(\"Received ${message.length > 30 ? message.substring(0, 30) : message}\");\n      Map msg = await compute(decodeJson, message);\n      // Determine response type\n      if (msg.containsKey(\"subscribe\") ||\n          msg.containsKey(\"error\") && msg.containsKey(\"currency\")) {\n        // Subscribe response\n        SubscribeResponse resp = await compute(subscribeResponseFromJson, msg);\n        // Post to callbacks\n        EventTaxiImpl.singleton().fire(SubscribeEvent(response: resp));\n      } else if (msg.containsKey(\"currency\") && msg.containsKey(\"price\") && msg.containsKey(\"btc\")) {\n        // Price info sent from server\n        PriceResponse resp = PriceResponse.fromJson(msg);\n        EventTaxiImpl.singleton().fire(PriceEvent(response: resp));\n      } else if (msg.containsKey(\"block\") && msg.containsKey(\"ophash\")) {\n        // Operation\n        pd.PascalOperation op = pd.PascalOperation.fromJson(msg);\n        EventTaxiImpl.singleton().fire(NewOperationEvent(operation: op));\n      }\n      return;\n    });\n  }\n\n  /* Send Request */\n  Future<void> sendRequest(BaseRequest request) async {\n    // We don't care about order or server response in these requests\n    log.d(\"sending ${json.encode(request.toJson())}\");\n    _send(await compute(encodeRequestItem, request));\n  }\n\n  /* Enqueue Request */\n  void queueRequest(BaseRequest request) {\n    log.d(\"requetest ${json.encode(request.toJson())}, q length: ${_requestQueue.length}\");\n    _requestQueue.add(new RequestItem(request));\n  }\n\n  /* Process Queue */\n  Future<void> processQueue() async {\n    await _lock.synchronized(() async {\n      log.d(\"Request Queue length ${_requestQueue.length}\");\n      if (_requestQueue != null && _requestQueue.length > 0) {\n        RequestItem requestItem = _requestQueue.first;\n        if (requestItem != null && !requestItem.isProcessing) {\n          if (!_isConnected && !_isConnecting && !suspended) {\n            initCommunication();\n            return;\n          } else if (suspended) {\n            return;\n          }\n          requestItem.isProcessing = true;\n          String requestJson = await compute(encodeRequestItem, requestItem.request);\n          log.d(\"Sending: $requestJson\");\n          await _send(requestJson);\n        } else if (requestItem != null && (DateTime\n            .now()\n            .difference(requestItem.expireDt)\n            .inSeconds > RequestItem.EXPIRE_TIME_S)) {\n          pop();\n          processQueue();\n        }\n      }\n    });\n  }\n\n  // Queue Utilities\n  void removeSubscribeFromQueue() {\n    if (_requestQueue != null && _requestQueue.length > 0) {\n      List<RequestItem> toRemove = new List();\n      _requestQueue.forEach((requestItem) {\n        if ((requestItem.request is SubscribeRequest)\n              && !requestItem.isProcessing) {\n          toRemove.add(requestItem);\n        }\n      });\n      toRemove.forEach((requestItem) {\n        _requestQueue.remove(requestItem);\n      });\n    }    \n  }\n\n  RequestItem pop() {\n    return _requestQueue.length > 0 ? _requestQueue.removeFirst() : null;\n  }\n\n  RequestItem peek() {\n    return _requestQueue.length > 0 ? _requestQueue.first : null;\n  }\n  \n  /// Clear entire queue, except for AccountsBalancesRequest\n  void clearQueue() {\n    List<RequestItem> reQueue = List();\n    _requestQueue.forEach((requestItem) {\n    });\n    _requestQueue.clear();\n    // Re-queue requests\n    reQueue.forEach((requestItem) {\n      requestItem.isProcessing = false;\n      _requestQueue.add(requestItem);\n    });\n  }\n\n  Queue<RequestItem> get requestQueue => _requestQueue;\n}"
  },
  {
    "path": "lib/service_locator.dart",
    "content": "import 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/network/ws_client.dart';\nimport 'package:blaise_wallet_flutter/util/pascal_util.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:get_it/get_it.dart';\nimport 'package:logger/logger.dart';\n\n/// Service locator that provides various singletons\nGetIt sl = GetIt.instance;\n\nvoid setupServiceLocator() {\n  sl.registerLazySingleton<PascalUtil>(() => PascalUtil());\n  sl.registerLazySingleton<Vault>(() => Vault());\n  sl.registerLazySingleton<SharedPrefsUtil>(() => SharedPrefsUtil());\n  sl.registerLazySingleton<DBHelper>(() => DBHelper());\n  sl.registerLazySingleton<WSClient>(() => WSClient());\n  sl.registerLazySingleton<Logger>(() => Logger());\n}\n"
  },
  {
    "path": "lib/store/account/account.dart",
    "content": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/update_history_event.dart';\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flutter/material.dart';\nimport 'package:meta/meta.dart';\nimport 'package:mobx/mobx.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:logger/logger.dart';\n\npart 'account.g.dart';\n\nclass Account = AccountBase with _$Account;\n\n/// State for a specific account\nabstract class AccountBase with Store {\n  Logger log = sl.get<Logger>();\n\n  @observable\n  bool operationsLoading = true;\n\n  @observable\n  RPCClient rpcClient;\n\n  @observable\n  PascalAccount account;\n\n  @observable\n  Currency accountBalance;\n\n  @observable\n  List<PascalOperation> operations;\n\n  @observable\n  List<PascalOperation> operationsToDisplay;\n\n  @observable\n  bool paid;\n\n  AccountBase({@required this.rpcClient, @required this.account}) {\n    this.accountBalance = account.balance;\n    this.paid = false;\n  }\n\n  @action\n  void decrementBalance(Currency delta) {\n    this.account.balance -= delta;\n    this.accountBalance -= delta;\n  }\n\n  @action\n  void incrementBalance(Currency delta) {\n    this.account.balance += delta;\n    this.accountBalance += delta;\n  }\n\n @action\n  Future<RPCResponse> jRpcRequest(Map<String, dynamic> request) async {\n    /// This custom request includes borrowed accounts\n    request['id'] = this.rpcClient.id;\n    String responseJson = await this.rpcClient.rpcPost(request);\n    if (responseJson == null) {\n      throw Exception('Did not receive a response');\n    }\n    // Parse base response\n    BaseResponse resp = BaseResponse.fromJson(json.decode(responseJson));\n    // Determine if error response\n    if (resp is Map &&\n        resp.result.containsKey('code') &&\n        resp.result.containsKey('message')) {\n      return ErrorResponse.fromJson(resp.result);\n    }\n    // Determine correct response type\n    if (resp.result.containsKey('paid')) {\n      this.paid = resp.result['paid'];\n      resp.result.remove('paid');\n    }\n    return PascalAccount.fromJson(resp.result);\n  }\n\n  @action\n  Future<bool> updateAccount() async {\n    // Update account information via getaccount, return false is unsuccessful true otherwise\n    bool hasCustomDaemon = (await sl.get<SharedPrefsUtil>().getRpcUrl()) != AppConstants.DEFAULT_RPC_HTTP_URL;\n    GetAccountRequest request = GetAccountRequest(account: this.account.account.account);\n    Map<String, dynamic> requestJson = request.toJson();\n    if (!hasCustomDaemon && account.isBorrowed) {\n      requestJson['params'].putIfAbsent('borrowed', () => true);\n    }\n    RPCResponse resp = await this.jRpcRequest(requestJson);\n    if (resp.isError) {\n      return false;\n    }\n    PascalAccount updatedAccount = resp;\n    // See if this accounts borrowed status has changed\n    if (this.account.isBorrowed) {\n      String curAcctPubkey = PublicKeyCoder().encodeToBase58(updatedAccount.encPubkey);\n      String curWalletPubkey = PublicKeyCoder().encodeToBase58(walletState.publicKey);\n      if (curAcctPubkey != curWalletPubkey) {\n        updatedAccount.isBorrowed = true;\n      }\n    }\n    this.account = updatedAccount;\n    this.accountBalance = updatedAccount.balance;\n    return true;\n  }\n\n  @action\n  void addNewOperation(PascalOperation op) {\n    /// Add operation if:\n    /// 1) We don't have it\n    /// 2) We do have it, but it has since been confirmed\n    /// 3) This account is not borrowed\n    if (this.operations == null) {\n      return;\n    }\n    if (!this.operations.contains(op) || this.operations.contains(op) && this.operations.firstWhere((nOp) => nOp == op).maturation == null && op.maturation != null) {\n      if (this.operations.contains(op)) {\n        this.operations.remove(op);\n      }\n      this.operations.insert(0, op);\n      // Re-sort this list\n      // Remove pendings\n      List<PascalOperation> pendings = this.operations.where((op) => op.maturation == null).toList();\n      this.operations.removeWhere((op) => op.maturation == null);\n      // Sort by time\n      this.operations.sort((a, b) => b.time.compareTo(a.time));\n      this.operations.insertAll(0, pendings);\n      // Update to display\n      this.operationsToDisplay = getOperationsToDisplay();\n      // Refresh total wallet balance\n      EventTaxiImpl.singleton().fire(UpdateHistoryEvent());\n    }\n  }\n\n  @action\n  void diffAndSortOperations(List<PascalOperation> newOperationList) {\n    // Get pendings\n    List<PascalOperation> pendingOperations = newOperationList.where((op) => op.maturation == null).toList();\n    // Remove pendings that have since been confirmed\n    this.operations.removeWhere((op) => op.maturation == null && !pendingOperations.contains(op));\n    // Add all operations not already in the list and not pending\n    this.operations.addAll(newOperationList.where((op) => (!this.operations.contains(op)) && op.maturation != null));\n    // Sort by time\n    this.operations.sort((a, b) => b.time.compareTo(a.time));\n    // Add all pendings\n    this.operations.removeWhere((op) => pendingOperations.contains(op));\n    this.operations.insertAll(0, pendingOperations);\n  }\n\n  @action\n  Future<void> getAccountOperations() async {\n    GetAccountOperationsRequest request =\n        GetAccountOperationsRequest(account: account.account.account,\n                                    start: -1);\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    if (resp.isError) {\n      ErrorResponse err = resp;\n      log.e(\"getaccountoperations resulted in error ${err.errorMessage}\");\n      return null;\n    }\n    OperationsResponse opResp = resp;\n    if (this.operations == null) {\n      this.operations = opResp.operations;\n      this.operationsToDisplay = getOperationsToDisplay();\n    } else {\n      // Diff and update operations\n      this.diffAndSortOperations(opResp.operations);\n      this.operationsToDisplay = getOperationsToDisplay();\n      EventTaxiImpl.singleton().fire(UpdateHistoryEvent());\n    }\n    this.operationsLoading = false;\n  }\n\n  @action\n  List<PascalOperation> getOperationsToDisplay() {\n    return this.operations.where((op) => shouldDisplayOperation(op)).toList();\n  }\n\n  @action\n  bool shouldDisplayOperation(PascalOperation op) {\n    if (op.optype == OpType.TRANSACTION) {\n      if (op.senders.length > 0 && op.receivers.length > 0 && op.senders[0].nOperation == 1 && op.receivers[0].receivingAccount == AccountNumber(\"1000\")) {\n        return false;\n      }\n      return true;\n    } else if (op.optype == OpType.CHANGE_ACCOUNT_INFO) {\n      if (op.changers.length > 0 && op.changers[0].newName != null) {\n        return true;\n      }\n    } else if (op.optype == OpType.LIST_FORSALE) {\n      if (op.changers.length >0 && op.changers[0].sellerAccount != null && op.changers[0].accountPrice != null) {\n        return true;\n      }\n    } else if (op.optype == OpType.DELIST_FORSALE) {\n      return true;\n    }\n    return false;\n  }\n\n  @action\n  bool hasOperationsToDisplay() {\n    if (this.operationsLoading || this.operations == null || this.operations.length == 0) {\n      return false;\n    }\n    for (PascalOperation op in this.operations) {\n      if (shouldDisplayOperation(op)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  @action\n  void changeAccountState(AccountState accountState) {\n    this.account.state = accountState;\n  }\n\n  @action\n  Future<RPCResponse> doSend({@required String amount, @required String destination, Currency fee, Uint8List encryptedPayload, String payload = \"\"}) async {\n    fee = fee == null ? Currency('0') : fee;\n    // Construct send\n    TransactionOperation op = TransactionOperation(\n      sender: this.account.account,\n      target: AccountNumber(destination),\n      amount: Currency(amount)\n    )\n    ..withNOperation(this.account.nOperation + 1)\n    ..withPayload(encryptedPayload == null ? PDUtil.stringToBytesUtf8(payload) : encryptedPayload)\n    ..withFee(fee)\n    ..sign(PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey())));\n    // Construct execute request\n    ExecuteOperationsRequest request = ExecuteOperationsRequest(\n      rawOperations: PDUtil.byteToHex(RawOperationCoder.encodeToBytes(op))\n    );\n    // Make request\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    if (resp.isError) {\n      return resp;\n    }\n    OperationsResponse opResp = resp;\n    if (opResp.operations[0].valid == null || opResp.operations[0].valid) {\n      this.decrementBalance(Currency(amount));\n      this.account.nOperation++;\n      this.getAccountOperations();\n    }\n    return resp;\n  }\n\n  @action\n  Future<RPCResponse> transferAccount(String strPubkey, {Currency fee}) async {\n    PublicKey newPubkey;\n    try {\n      newPubkey = PublicKeyCoder().decodeFromBase58(strPubkey);\n    } catch (e) {\n      try {\n        newPubkey = PublicKeyCoder().decodeFromBytes(PDUtil.hexToBytes(strPubkey));\n      } catch (e) {\n        throw Exception('Invalid Public key');\n      }\n    }\n    fee = fee == null ? Currency('0') : fee;\n    // Construct transfer\n    ChangeKeyOperation op = ChangeKeyOperation(\n      signer: account.account,\n      newPublicKey: newPubkey\n    )\n    ..withNOperation(account.nOperation + 1)\n    ..withPayload(PDUtil.stringToBytesUtf8(\"\"))\n    ..withFee(fee)\n    ..sign(PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey())));\n    // Construct execute request\n    ExecuteOperationsRequest request = ExecuteOperationsRequest(\n      rawOperations: PDUtil.byteToHex(RawOperationCoder.encodeToBytes(op))\n    );\n    // Make request\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    return resp;\n  }\n\n  @action\n  Future<RPCResponse> changeAccountName(AccountName newName, {Currency fee}) async {\n    fee = fee == null ? Currency('0') : fee;\n    // Construct name change\n    ChangeAccountInfoOperation op = ChangeAccountInfoOperation(\n      accountSigner: account.account,\n      targetSigner: account.account,\n      newName: newName,\n      withNewName: true\n    )\n    ..withNOperation(account.nOperation + 1)\n    ..withPayload(PDUtil.stringToBytesUtf8(\"\"))\n    ..withFee(fee)\n    ..sign(PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey())));\n    // Construct execute request\n    ExecuteOperationsRequest request = ExecuteOperationsRequest(\n      rawOperations: PDUtil.byteToHex(RawOperationCoder.encodeToBytes(op))\n    );\n    // Make request\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    if (resp.isError) {\n      return resp;\n    }\n    OperationsResponse opResp = resp;\n    if (opResp.operations[0].valid == null || opResp.operations[0].valid) {\n      this.account.nOperation++;\n      this.getAccountOperations();\n    }\n    return resp;\n  }\n\n  @action\n  Future<RPCResponse> listAccountForSale(Currency price, AccountNumber accountToPay, {PublicKey newPubKey, Currency fee}) async {\n    fee = fee == null ? Currency('0') : fee;\n    // Construct list for sale\n    ListForSaleOperation op = ListForSaleOperation(\n      accountSigner: account.account,\n      targetSigner: account.account,\n      price: price,\n      accountToPay: accountToPay,\n      newPublicKey: newPubKey\n    )\n    ..withNOperation(account.nOperation + 1)\n    ..withPayload(PDUtil.stringToBytesUtf8(\"\"))\n    ..withFee(fee)\n    ..sign(PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey())));\n    // Execute request\n    ExecuteOperationsRequest request = ExecuteOperationsRequest(\n      rawOperations: PDUtil.byteToHex(RawOperationCoder.encodeToBytes(op))\n    );\n    // Make request\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    if (resp.isError) {\n      return resp;\n    }\n    OperationsResponse opResp = resp;\n    if (opResp.operations[0].valid == null || opResp.operations[0].valid) {\n      this.account.nOperation++;\n      this.getAccountOperations();\n    }\n    return resp;\n  }\n\n  @action\n  Future<RPCResponse> delistAccountForSale({Currency fee}) async {\n    fee = fee == null ? Currency('0') : fee;\n    // Construct list for sale\n    DeListForSaleOperation op = DeListForSaleOperation(\n      accountSigner: account.account,\n      targetSigner: account.account\n    )\n    ..withNOperation(account.nOperation + 1)\n    ..withPayload(PDUtil.stringToBytesUtf8(\"\"))\n    ..withFee(fee)\n    ..sign(PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey())));\n    // Execute request\n    ExecuteOperationsRequest request = ExecuteOperationsRequest(\n      rawOperations: PDUtil.byteToHex(RawOperationCoder.encodeToBytes(op))\n    );\n    // Make request\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(request);\n    if (resp.isError) {\n      return resp;\n    }\n    OperationsResponse opResp = resp;\n    if (opResp.operations[0].valid == null || opResp.operations[0].valid) {\n      this.account.nOperation++;\n      this.getAccountOperations();\n    }\n    return resp;\n  }\n\n  @action\n  Future<Uint8List> encryptPayloadEcies(String payload, AccountNumber account) async {\n    try {\n      // Do getaccountrequest to get the public key of this account\n      GetAccountRequest req = GetAccountRequest(\n        account: account.account\n      );\n      // Execute request\n      RPCResponse resp = await rpcClient.makeRpcRequest(req);\n      if (resp.isError) {\n        return null;\n      }\n      PascalAccount receiverAcct = resp;\n      return EciesCrypt.encrypt(PDUtil.stringToBytesUtf8(payload), receiverAcct.encPubkey);\n    } catch (e) {\n      return null;\n    }\n  }\n}\n\n"
  },
  {
    "path": "lib/store/account/account.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'account.dart';\n\n// **************************************************************************\n// StoreGenerator\n// **************************************************************************\n\n// ignore_for_file: non_constant_identifier_names, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic\n\nmixin _$Account on AccountBase, Store {\n  final _$operationsLoadingAtom = Atom(name: 'AccountBase.operationsLoading');\n\n  @override\n  bool get operationsLoading {\n    _$operationsLoadingAtom.context.enforceReadPolicy(_$operationsLoadingAtom);\n    _$operationsLoadingAtom.reportObserved();\n    return super.operationsLoading;\n  }\n\n  @override\n  set operationsLoading(bool value) {\n    _$operationsLoadingAtom.context.conditionallyRunInAction(() {\n      super.operationsLoading = value;\n      _$operationsLoadingAtom.reportChanged();\n    }, _$operationsLoadingAtom, name: '${_$operationsLoadingAtom.name}_set');\n  }\n\n  final _$rpcClientAtom = Atom(name: 'AccountBase.rpcClient');\n\n  @override\n  RPCClient get rpcClient {\n    _$rpcClientAtom.context.enforceReadPolicy(_$rpcClientAtom);\n    _$rpcClientAtom.reportObserved();\n    return super.rpcClient;\n  }\n\n  @override\n  set rpcClient(RPCClient value) {\n    _$rpcClientAtom.context.conditionallyRunInAction(() {\n      super.rpcClient = value;\n      _$rpcClientAtom.reportChanged();\n    }, _$rpcClientAtom, name: '${_$rpcClientAtom.name}_set');\n  }\n\n  final _$accountAtom = Atom(name: 'AccountBase.account');\n\n  @override\n  PascalAccount get account {\n    _$accountAtom.context.enforceReadPolicy(_$accountAtom);\n    _$accountAtom.reportObserved();\n    return super.account;\n  }\n\n  @override\n  set account(PascalAccount value) {\n    _$accountAtom.context.conditionallyRunInAction(() {\n      super.account = value;\n      _$accountAtom.reportChanged();\n    }, _$accountAtom, name: '${_$accountAtom.name}_set');\n  }\n\n  final _$accountBalanceAtom = Atom(name: 'AccountBase.accountBalance');\n\n  @override\n  Currency get accountBalance {\n    _$accountBalanceAtom.context.enforceReadPolicy(_$accountBalanceAtom);\n    _$accountBalanceAtom.reportObserved();\n    return super.accountBalance;\n  }\n\n  @override\n  set accountBalance(Currency value) {\n    _$accountBalanceAtom.context.conditionallyRunInAction(() {\n      super.accountBalance = value;\n      _$accountBalanceAtom.reportChanged();\n    }, _$accountBalanceAtom, name: '${_$accountBalanceAtom.name}_set');\n  }\n\n  final _$operationsAtom = Atom(name: 'AccountBase.operations');\n\n  @override\n  List<PascalOperation> get operations {\n    _$operationsAtom.context.enforceReadPolicy(_$operationsAtom);\n    _$operationsAtom.reportObserved();\n    return super.operations;\n  }\n\n  @override\n  set operations(List<PascalOperation> value) {\n    _$operationsAtom.context.conditionallyRunInAction(() {\n      super.operations = value;\n      _$operationsAtom.reportChanged();\n    }, _$operationsAtom, name: '${_$operationsAtom.name}_set');\n  }\n\n  final _$operationsToDisplayAtom =\n      Atom(name: 'AccountBase.operationsToDisplay');\n\n  @override\n  List<PascalOperation> get operationsToDisplay {\n    _$operationsToDisplayAtom.context\n        .enforceReadPolicy(_$operationsToDisplayAtom);\n    _$operationsToDisplayAtom.reportObserved();\n    return super.operationsToDisplay;\n  }\n\n  @override\n  set operationsToDisplay(List<PascalOperation> value) {\n    _$operationsToDisplayAtom.context.conditionallyRunInAction(() {\n      super.operationsToDisplay = value;\n      _$operationsToDisplayAtom.reportChanged();\n    }, _$operationsToDisplayAtom,\n        name: '${_$operationsToDisplayAtom.name}_set');\n  }\n\n  final _$paidAtom = Atom(name: 'AccountBase.paid');\n\n  @override\n  bool get paid {\n    _$paidAtom.context.enforceReadPolicy(_$paidAtom);\n    _$paidAtom.reportObserved();\n    return super.paid;\n  }\n\n  @override\n  set paid(bool value) {\n    _$paidAtom.context.conditionallyRunInAction(() {\n      super.paid = value;\n      _$paidAtom.reportChanged();\n    }, _$paidAtom, name: '${_$paidAtom.name}_set');\n  }\n\n  final _$jRpcRequestAsyncAction = AsyncAction('jRpcRequest');\n\n  @override\n  Future<RPCResponse> jRpcRequest(Map<String, dynamic> request) {\n    return _$jRpcRequestAsyncAction.run(() => super.jRpcRequest(request));\n  }\n\n  final _$updateAccountAsyncAction = AsyncAction('updateAccount');\n\n  @override\n  Future<bool> updateAccount() {\n    return _$updateAccountAsyncAction.run(() => super.updateAccount());\n  }\n\n  final _$getAccountOperationsAsyncAction = AsyncAction('getAccountOperations');\n\n  @override\n  Future<void> getAccountOperations() {\n    return _$getAccountOperationsAsyncAction\n        .run(() => super.getAccountOperations());\n  }\n\n  final _$doSendAsyncAction = AsyncAction('doSend');\n\n  @override\n  Future<RPCResponse> doSend(\n      {@required String amount,\n      @required String destination,\n      Currency fee,\n      Uint8List encryptedPayload,\n      String payload = \"\"}) {\n    return _$doSendAsyncAction.run(() => super.doSend(\n        amount: amount,\n        destination: destination,\n        fee: fee,\n        encryptedPayload: encryptedPayload,\n        payload: payload));\n  }\n\n  final _$transferAccountAsyncAction = AsyncAction('transferAccount');\n\n  @override\n  Future<RPCResponse> transferAccount(String strPubkey, {Currency fee}) {\n    return _$transferAccountAsyncAction\n        .run(() => super.transferAccount(strPubkey, fee: fee));\n  }\n\n  final _$changeAccountNameAsyncAction = AsyncAction('changeAccountName');\n\n  @override\n  Future<RPCResponse> changeAccountName(AccountName newName, {Currency fee}) {\n    return _$changeAccountNameAsyncAction\n        .run(() => super.changeAccountName(newName, fee: fee));\n  }\n\n  final _$listAccountForSaleAsyncAction = AsyncAction('listAccountForSale');\n\n  @override\n  Future<RPCResponse> listAccountForSale(\n      Currency price, AccountNumber accountToPay,\n      {PublicKey newPubKey, Currency fee}) {\n    return _$listAccountForSaleAsyncAction.run(() => super.listAccountForSale(\n        price, accountToPay,\n        newPubKey: newPubKey, fee: fee));\n  }\n\n  final _$delistAccountForSaleAsyncAction = AsyncAction('delistAccountForSale');\n\n  @override\n  Future<RPCResponse> delistAccountForSale({Currency fee}) {\n    return _$delistAccountForSaleAsyncAction\n        .run(() => super.delistAccountForSale(fee: fee));\n  }\n\n  final _$encryptPayloadEciesAsyncAction = AsyncAction('encryptPayloadEcies');\n\n  @override\n  Future<Uint8List> encryptPayloadEcies(String payload, AccountNumber account) {\n    return _$encryptPayloadEciesAsyncAction\n        .run(() => super.encryptPayloadEcies(payload, account));\n  }\n\n  final _$AccountBaseActionController = ActionController(name: 'AccountBase');\n\n  @override\n  void decrementBalance(Currency delta) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.decrementBalance(delta);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void incrementBalance(Currency delta) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.incrementBalance(delta);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void addNewOperation(PascalOperation op) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.addNewOperation(op);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void diffAndSortOperations(List<PascalOperation> newOperationList) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.diffAndSortOperations(newOperationList);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  List<PascalOperation> getOperationsToDisplay() {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.getOperationsToDisplay();\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  bool shouldDisplayOperation(PascalOperation op) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.shouldDisplayOperation(op);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  bool hasOperationsToDisplay() {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.hasOperationsToDisplay();\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void changeAccountState(AccountState accountState) {\n    final _$actionInfo = _$AccountBaseActionController.startAction();\n    try {\n      return super.changeAccountState(accountState);\n    } finally {\n      _$AccountBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  String toString() {\n    final string =\n        'operationsLoading: ${operationsLoading.toString()},rpcClient: ${rpcClient.toString()},account: ${account.toString()},accountBalance: ${accountBalance.toString()},operations: ${operations.toString()},operationsToDisplay: ${operationsToDisplay.toString()},paid: ${paid.toString()}';\n    return '{$string}';\n  }\n}\n"
  },
  {
    "path": "lib/store/wallet/wallet.dart",
    "content": "import 'dart:convert';\nimport 'dart:ui';\n\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/network/http_client.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/fcm_delete_account_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/fcm_update_bulk_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/fcm_update_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/request/subscribe_request.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/accounts_response_borrowed.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/borrow_response.dart';\nimport 'package:blaise_wallet_flutter/network/model/response/subscribe_response.dart';\nimport 'package:blaise_wallet_flutter/network/ws_client.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:firebase_messaging/firebase_messaging.dart';\nimport 'package:mobx/mobx.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:logger/logger.dart';\nimport 'package:intl/intl.dart';\nimport 'package:decimal/decimal.dart';\n\npart 'wallet.g.dart';\n\nclass Wallet = WalletBase with _$Wallet;\n\n/// The global wallet state and mutation actions\nabstract class WalletBase with Store {\n  final Currency NO_FEE = Currency('0');\n  final Currency MIN_FEE = Currency('0.0001');\n\n  final Logger log = sl.get<Logger>();\n\n  @observable\n  bool walletLoading = true;\n\n  @observable\n  Currency totalWalletBalance = Currency('0');\n\n  @observable\n  List<PascalAccount> walletAccounts = [];\n\n  @observable\n  RPCClient rpcClient;\n\n  @observable\n  PublicKey publicKey;\n\n  @observable\n  Map<int, Account> accountStateMap = Map();\n\n  @observable\n  double localCurrencyPrice;\n  @observable\n  double btcPrice;\n\n  @observable\n  String uuid;\n\n  @observable\n  AccountNumber activeAccount;\n\n  @observable\n  BorrowResponse borrowedAccount;\n\n  @observable\n  bool isBorrowEligible = false;\n\n  @observable\n  bool hasExceededBorrowLimit = false;\n\n  @observable\n  bool hasReceivedSubscribeResponse = false;\n\n  @action\n  Future<void> initializeRpc() async {\n    this.rpcClient =\n        RPCClient(rpcAddress: await sl.get<SharedPrefsUtil>().getRpcUrl());\n  }\n\n  @action\n  Future<dynamic> getBalanceAndInsertBorrowed() async {\n    if (borrowedAccount != null &&\n        !this.walletAccounts.contains(borrowedAccount.account)) {\n      RPCResponse resp = await rpcClient.makeRpcRequest(\n          GetAccountRequest(account: borrowedAccount.account.account));\n      if (resp is PascalAccount) {\n        resp.isBorrowed = true;\n        this\n            .walletAccounts\n            .removeWhere((acct) => acct.account == borrowedAccount.account);\n        this.walletAccounts.add(resp);\n        return resp;\n      }\n    }\n    return null;\n  }\n\n  @action\n  Future<dynamic> updateBorrowed() async {\n    BorrowResponse resp = await HttpAPI.getBorrowed(\n        PublicKeyCoder().encodeToBase58(this.publicKey));\n    if (resp == null) {\n      isBorrowEligible = false;\n    } else if (resp.account == null) {\n      isBorrowEligible = true;\n      borrowedAccount = null;\n    } else {\n      isBorrowEligible = false;\n      borrowedAccount = resp;\n      return await this.getBalanceAndInsertBorrowed();\n    }\n    return null;\n  }\n\n  @action\n  Future<dynamic> initiateBorrow() async {\n    if (isBorrowEligible) {\n      BorrowResponse resp = await HttpAPI.borrowAccount(\n          PublicKeyCoder().encodeToBase58(this.publicKey));\n      if (resp == null) {\n        isBorrowEligible = false;\n      } else {\n        isBorrowEligible = false;\n        borrowedAccount = resp;\n        return await this.getBalanceAndInsertBorrowed();\n      }\n    }\n    return null;\n  }\n\n  @action\n  Future<RPCResponse> findAccountsRequest(FindAccountsRequest request) async {\n    /// This custom request includes borrowed accounts\n    request.id = this.rpcClient.id;\n    String responseJson = await this.rpcClient.rpcPost(request.toJson());\n    if (responseJson == null) {\n      throw Exception('Did not receive a response');\n    }\n    // Parse base response\n    BaseResponse resp = BaseResponse.fromJson(json.decode(responseJson));\n    // Determine if error response\n    if (resp is Map &&\n        resp.result.containsKey('code') &&\n        resp.result.containsKey('message')) {\n      return ErrorResponse.fromJson(resp.result);\n    }\n    // Determine correct response type\n    return AccountsResponseBorrowed.fromJson(json.decode(responseJson));\n  }\n\n  @action\n  Future<List<PascalAccount>> findAccountsWithNameLike(String name) async {\n    // TODO - this RPC request is broken when exact is set to false\n    FindAccountsRequest findAccountsRequest =\n        FindAccountsRequest(name: name, exact: true);\n    RPCResponse resp = await this.rpcClient.makeRpcRequest(findAccountsRequest);\n    if (resp.isError) {\n      ErrorResponse err = resp;\n      log.d(\"findaccounts returned error ${err.errorMessage}\");\n      return null;\n    }\n    AccountsResponse accountsResponse = resp;\n    return accountsResponse.accounts;\n  }\n\n  @action\n  Future<bool> loadWallet() async {\n    if (this.publicKey == null) {\n      PrivateKey privKey = PrivateKeyCoder().decodeFromBytes(\n          PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey()));\n      this.publicKey = Keys.fromPrivateKey(privKey).publicKey;\n    }\n\n    /// Load the initial wallet, returns false if it loaded with an error\n    if (this.rpcClient == null) {\n      await initializeRpc();\n    }\n    // Get total balance and list of accounts\n    // TODO - pagination?\n    FindAccountsRequest findAccountsRequest = FindAccountsRequest(\n        b58Pubkey: PublicKeyCoder().encodeToBase58(this.publicKey), max: 25);\n    RPCResponse resp = await this.findAccountsRequest(findAccountsRequest);\n    if (resp.isError) {\n      ErrorResponse err = resp;\n      log.d(\"findaccounts returned error ${err.errorMessage}\");\n      return false;\n    }\n    AccountsResponseBorrowed accountsResponse = resp;\n    bool hasCustomDaemon = (await sl.get<SharedPrefsUtil>().getRpcUrl()) !=\n        AppConstants.DEFAULT_RPC_HTTP_URL;\n    if (hasCustomDaemon) {\n      PascalAccount borrowedAccount = this\n          .walletAccounts\n          .firstWhere((acct) => acct.isBorrowed, orElse: () => null);\n      if (borrowedAccount != null &&\n          !accountsResponse.accounts.contains(borrowedAccount)) {\n        accountsResponse.accounts.add(borrowedAccount);\n      }\n    } else if (accountsResponse.borrowedAccount != null) {\n      accountsResponse.accounts\n          .where((acct) =>\n              acct.account == accountsResponse.borrowedAccount.account)\n          .forEach((acct) {\n        acct.isBorrowed = true;\n      });\n      this.borrowedAccount = accountsResponse.borrowedAccount;\n      this.isBorrowEligible = false;\n    } else if (accountsResponse.borrowedAccount == null) {\n      this.isBorrowEligible = true;\n      this.borrowedAccount = null;\n    }\n    if (accountsResponse.borrowEligible != null) {\n      this.hasExceededBorrowLimit = !accountsResponse.borrowEligible;\n    }\n    // Check for freepasa account\n    AccountNumber freepasaAccount =\n        await sl.get<SharedPrefsUtil>().getFreepasaAccount();\n    if (freepasaAccount != null) {\n      PascalAccount fpasaAccount = PascalAccount(\n          account: freepasaAccount, balance: Currency('0'), isFreepasa: true);\n      fpasaAccount.name = AccountName(\"\");\n      if (!accountsResponse.accounts.contains(fpasaAccount)) {\n        accountsResponse.accounts.add(fpasaAccount);\n      }\n    }\n    this.walletAccounts = accountsResponse.accounts;\n    Currency totalBalance = Currency('0');\n    this.walletAccounts.forEach((acct) {\n      totalBalance += acct.balance;\n    });\n    if (hasCustomDaemon) {\n      this.updateBorrowed();\n    }\n    this.totalWalletBalance = totalBalance;\n    this.walletLoading = false;\n    return true;\n  }\n\n  @action\n  Account getAccountState(PascalAccount account) {\n    accountStateMap.putIfAbsent(account.account.account,\n        () => Account(rpcClient: this.rpcClient, account: account));\n    return accountStateMap[account.account.account];\n  }\n\n  @action\n  void changeRpcUrl(String rpcUrl) {\n    this.rpcClient = RPCClient(rpcAddress: rpcUrl);\n    accountStateMap.forEach((k, v) {\n      v.rpcClient = this.rpcClient;\n    });\n  }\n\n  @action\n  void removeAccount(PascalAccount account) {\n    // Remove account from wallet\n    this.totalWalletBalance -= account.balance;\n    this.walletAccounts.removeWhere((acct) => acct == account);\n    this.accountStateMap.remove(account.account.account);\n    this.fcmDeleteAccount(account.account);\n  }\n\n  @action\n  void updateAccountName(PascalAccount account, AccountName newName) {\n    this\n        .walletAccounts\n        .where((acct) => acct.account == account.account)\n        .forEach((pa) {\n      pa.name = newName;\n    });\n    if (this.accountStateMap.containsKey(account.account.account)) {\n      this.accountStateMap[account.account.account].account.name = newName;\n    }\n  }\n\n  @action\n  List<PascalAccount> getNonzeroBalanceAccounts() {\n    if (walletLoading || walletAccounts.length == 0) {\n      return [];\n    }\n    List<PascalAccount> ret = [];\n    walletAccounts.forEach((acct) {\n      if (acct.balance > Currency('0')) {\n        ret.add(acct);\n      }\n    });\n    return ret;\n  }\n\n  @action\n  bool shouldHaveFee() {\n    return true;\n    /*\n    for (Account accountState in accountStateMap.values) {\n      if (accountState.operations == null) {\n        continue;\n      }\n      if (accountState.operations.indexWhere((operation) => operation.maturation == null && operation.fee == NO_FEE && operation.signerAccount == accountState.account.account) > -1) {\n        return true;\n      }\n    }\n    return false;*/\n  }\n\n  @action\n  String getLocalCurrencyDisplay(\n      {AvailableCurrency currency, Currency amount, int decimalDigits}) {\n    if (localCurrencyPrice == null) {\n      return null;\n    }\n    currency = currency ?? AvailableCurrency(AvailableCurrencyEnum.USD);\n    Decimal converted = Decimal.parse(localCurrencyPrice.toString()) *\n        Decimal.parse(amount.toStringOpt());\n    return NumberFormat.currency(\n            locale: currency.getLocale().toString(),\n            name: currency.getIso4217Code(),\n            symbol: currency.getCurrencySymbol(),\n            decimalDigits: decimalDigits)\n        .format(converted.toDouble());\n  }\n\n  /// Websocket Actions\n  // Websocket Methods\n  @action\n  void disconnect() {\n    sl.get<WSClient>().reset(suspend: true);\n  }\n\n  @action\n  void reconnect() {\n    sl.get<WSClient>().initCommunication(unsuspend: true);\n  }\n\n  @action\n  Future<void> requestUpdate() async {\n    if (this.publicKey == null) {\n      PrivateKey privKey = PrivateKeyCoder().decodeFromBytes(\n          PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey()));\n      this.publicKey = Keys.fromPrivateKey(privKey).publicKey;\n    }\n    String uuid = await sl.get<SharedPrefsUtil>().getUuid();\n    AvailableCurrency curCurrency =\n        await sl.get<SharedPrefsUtil>().getCurrency(Locale(\"en\", \"US\"));\n    String fcmToken = await FirebaseMessaging.instance.getToken();\n    bool notificationsEnabled =\n        await sl.get<SharedPrefsUtil>().getNotificationsOn();\n    sl.get<WSClient>().clearQueue();\n    sl.get<WSClient>().queueRequest(SubscribeRequest(\n        currency: curCurrency.getIso4217Code(),\n        uuid: uuid,\n        account: this.activeAccount == null ? null : this.activeAccount.account,\n        fcmToken: fcmToken,\n        notificationEnabled: notificationsEnabled,\n        b58pubkey: PublicKeyCoder().encodeToBase58(this.publicKey)));\n    sl.get<WSClient>().processQueue();\n  }\n\n  @action\n  Future<void> fcmUpdate(AccountNumber account) async {\n    if (this.publicKey == null) {\n      PrivateKey privKey = PrivateKeyCoder().decodeFromBytes(\n          PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey()));\n      this.publicKey = Keys.fromPrivateKey(privKey).publicKey;\n    }\n    bool enabled = await sl.get<SharedPrefsUtil>().getNotificationsOn();\n    String fcmToken = await FirebaseMessaging.instance.getToken();\n    sl.get<WSClient>().sendRequest(FcmUpdateRequest(\n        account: account.account,\n        enabled: enabled,\n        fcmToken: fcmToken,\n        b58pubkey: PublicKeyCoder().encodeToBase58(this.publicKey)));\n  }\n\n  @action\n  Future<void> fcmDeleteAccount(AccountNumber account) async {\n    String fcmToken = await FirebaseMessaging.instance.getToken();\n    sl.get<WSClient>().sendRequest(\n        FcmDeleteAccountRequest(account: account.account, fcmToken: fcmToken));\n  }\n\n  @action\n  Future<void> fcmUpdateBulk({bool forceDisable = false}) async {\n    if (this.publicKey == null) {\n      PrivateKey privKey = PrivateKeyCoder().decodeFromBytes(\n          PDUtil.hexToBytes(await sl.get<Vault>().getPrivateKey()));\n      this.publicKey = Keys.fromPrivateKey(privKey).publicKey;\n    }\n    if (walletLoading) {\n      return;\n    }\n    bool enabled = forceDisable\n        ? false\n        : await sl.get<SharedPrefsUtil>().getNotificationsOn();\n    String fcmToken = await FirebaseMessaging.instance.getToken();\n    List<int> accounts = [];\n    for (PascalAccount acct in walletAccounts) {\n      if (!acct.isBorrowed) {\n        accounts.add(acct.account.account);\n      }\n    }\n    sl.get<WSClient>().sendRequest(FcmUpdateBulkRequest(\n        accounts: accounts,\n        enabled: enabled,\n        fcmToken: fcmToken,\n        b58pubkey: PublicKeyCoder().encodeToBase58(this.publicKey)));\n  }\n\n  @action\n  void addNewOp(PascalOperation op) {\n    this.accountStateMap.forEach((k, acct) {\n      if (op.senders.isNotEmpty &&\n          op.senders[0].sendingAccount == acct.account.account) {\n        acct.addNewOperation(op);\n      } else if (op.receivers.isNotEmpty &&\n          op.receivers[0].receivingAccount == acct.account.account) {\n        acct.addNewOperation(op);\n      }\n    });\n  }\n\n  @action\n  void reset() {\n    // Reset all properties (for when logging out, etc)\n    this.fcmUpdateBulk(forceDisable: true);\n    this.walletLoading = true;\n    this.totalWalletBalance = Currency('0');\n    this.rpcClient = null;\n    this.walletAccounts = [];\n    this.publicKey = null;\n    this.accountStateMap = Map();\n    this.borrowedAccount = null;\n    this.isBorrowEligible = false;\n    this.hasExceededBorrowLimit = false;\n  }\n}\n"
  },
  {
    "path": "lib/store/wallet/wallet.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'wallet.dart';\n\n// **************************************************************************\n// StoreGenerator\n// **************************************************************************\n\n// ignore_for_file: non_constant_identifier_names, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic\n\nmixin _$Wallet on WalletBase, Store {\n  final _$walletLoadingAtom = Atom(name: 'WalletBase.walletLoading');\n\n  @override\n  bool get walletLoading {\n    _$walletLoadingAtom.context.enforceReadPolicy(_$walletLoadingAtom);\n    _$walletLoadingAtom.reportObserved();\n    return super.walletLoading;\n  }\n\n  @override\n  set walletLoading(bool value) {\n    _$walletLoadingAtom.context.conditionallyRunInAction(() {\n      super.walletLoading = value;\n      _$walletLoadingAtom.reportChanged();\n    }, _$walletLoadingAtom, name: '${_$walletLoadingAtom.name}_set');\n  }\n\n  final _$totalWalletBalanceAtom = Atom(name: 'WalletBase.totalWalletBalance');\n\n  @override\n  Currency get totalWalletBalance {\n    _$totalWalletBalanceAtom.context\n        .enforceReadPolicy(_$totalWalletBalanceAtom);\n    _$totalWalletBalanceAtom.reportObserved();\n    return super.totalWalletBalance;\n  }\n\n  @override\n  set totalWalletBalance(Currency value) {\n    _$totalWalletBalanceAtom.context.conditionallyRunInAction(() {\n      super.totalWalletBalance = value;\n      _$totalWalletBalanceAtom.reportChanged();\n    }, _$totalWalletBalanceAtom, name: '${_$totalWalletBalanceAtom.name}_set');\n  }\n\n  final _$walletAccountsAtom = Atom(name: 'WalletBase.walletAccounts');\n\n  @override\n  List<PascalAccount> get walletAccounts {\n    _$walletAccountsAtom.context.enforceReadPolicy(_$walletAccountsAtom);\n    _$walletAccountsAtom.reportObserved();\n    return super.walletAccounts;\n  }\n\n  @override\n  set walletAccounts(List<PascalAccount> value) {\n    _$walletAccountsAtom.context.conditionallyRunInAction(() {\n      super.walletAccounts = value;\n      _$walletAccountsAtom.reportChanged();\n    }, _$walletAccountsAtom, name: '${_$walletAccountsAtom.name}_set');\n  }\n\n  final _$rpcClientAtom = Atom(name: 'WalletBase.rpcClient');\n\n  @override\n  RPCClient get rpcClient {\n    _$rpcClientAtom.context.enforceReadPolicy(_$rpcClientAtom);\n    _$rpcClientAtom.reportObserved();\n    return super.rpcClient;\n  }\n\n  @override\n  set rpcClient(RPCClient value) {\n    _$rpcClientAtom.context.conditionallyRunInAction(() {\n      super.rpcClient = value;\n      _$rpcClientAtom.reportChanged();\n    }, _$rpcClientAtom, name: '${_$rpcClientAtom.name}_set');\n  }\n\n  final _$publicKeyAtom = Atom(name: 'WalletBase.publicKey');\n\n  @override\n  PublicKey get publicKey {\n    _$publicKeyAtom.context.enforceReadPolicy(_$publicKeyAtom);\n    _$publicKeyAtom.reportObserved();\n    return super.publicKey;\n  }\n\n  @override\n  set publicKey(PublicKey value) {\n    _$publicKeyAtom.context.conditionallyRunInAction(() {\n      super.publicKey = value;\n      _$publicKeyAtom.reportChanged();\n    }, _$publicKeyAtom, name: '${_$publicKeyAtom.name}_set');\n  }\n\n  final _$accountStateMapAtom = Atom(name: 'WalletBase.accountStateMap');\n\n  @override\n  Map<int, Account> get accountStateMap {\n    _$accountStateMapAtom.context.enforceReadPolicy(_$accountStateMapAtom);\n    _$accountStateMapAtom.reportObserved();\n    return super.accountStateMap;\n  }\n\n  @override\n  set accountStateMap(Map<int, Account> value) {\n    _$accountStateMapAtom.context.conditionallyRunInAction(() {\n      super.accountStateMap = value;\n      _$accountStateMapAtom.reportChanged();\n    }, _$accountStateMapAtom, name: '${_$accountStateMapAtom.name}_set');\n  }\n\n  final _$localCurrencyPriceAtom = Atom(name: 'WalletBase.localCurrencyPrice');\n\n  @override\n  double get localCurrencyPrice {\n    _$localCurrencyPriceAtom.context\n        .enforceReadPolicy(_$localCurrencyPriceAtom);\n    _$localCurrencyPriceAtom.reportObserved();\n    return super.localCurrencyPrice;\n  }\n\n  @override\n  set localCurrencyPrice(double value) {\n    _$localCurrencyPriceAtom.context.conditionallyRunInAction(() {\n      super.localCurrencyPrice = value;\n      _$localCurrencyPriceAtom.reportChanged();\n    }, _$localCurrencyPriceAtom, name: '${_$localCurrencyPriceAtom.name}_set');\n  }\n\n  final _$btcPriceAtom = Atom(name: 'WalletBase.btcPrice');\n\n  @override\n  double get btcPrice {\n    _$btcPriceAtom.context.enforceReadPolicy(_$btcPriceAtom);\n    _$btcPriceAtom.reportObserved();\n    return super.btcPrice;\n  }\n\n  @override\n  set btcPrice(double value) {\n    _$btcPriceAtom.context.conditionallyRunInAction(() {\n      super.btcPrice = value;\n      _$btcPriceAtom.reportChanged();\n    }, _$btcPriceAtom, name: '${_$btcPriceAtom.name}_set');\n  }\n\n  final _$uuidAtom = Atom(name: 'WalletBase.uuid');\n\n  @override\n  String get uuid {\n    _$uuidAtom.context.enforceReadPolicy(_$uuidAtom);\n    _$uuidAtom.reportObserved();\n    return super.uuid;\n  }\n\n  @override\n  set uuid(String value) {\n    _$uuidAtom.context.conditionallyRunInAction(() {\n      super.uuid = value;\n      _$uuidAtom.reportChanged();\n    }, _$uuidAtom, name: '${_$uuidAtom.name}_set');\n  }\n\n  final _$activeAccountAtom = Atom(name: 'WalletBase.activeAccount');\n\n  @override\n  AccountNumber get activeAccount {\n    _$activeAccountAtom.context.enforceReadPolicy(_$activeAccountAtom);\n    _$activeAccountAtom.reportObserved();\n    return super.activeAccount;\n  }\n\n  @override\n  set activeAccount(AccountNumber value) {\n    _$activeAccountAtom.context.conditionallyRunInAction(() {\n      super.activeAccount = value;\n      _$activeAccountAtom.reportChanged();\n    }, _$activeAccountAtom, name: '${_$activeAccountAtom.name}_set');\n  }\n\n  final _$borrowedAccountAtom = Atom(name: 'WalletBase.borrowedAccount');\n\n  @override\n  BorrowResponse get borrowedAccount {\n    _$borrowedAccountAtom.context.enforceReadPolicy(_$borrowedAccountAtom);\n    _$borrowedAccountAtom.reportObserved();\n    return super.borrowedAccount;\n  }\n\n  @override\n  set borrowedAccount(BorrowResponse value) {\n    _$borrowedAccountAtom.context.conditionallyRunInAction(() {\n      super.borrowedAccount = value;\n      _$borrowedAccountAtom.reportChanged();\n    }, _$borrowedAccountAtom, name: '${_$borrowedAccountAtom.name}_set');\n  }\n\n  final _$isBorrowEligibleAtom = Atom(name: 'WalletBase.isBorrowEligible');\n\n  @override\n  bool get isBorrowEligible {\n    _$isBorrowEligibleAtom.context.enforceReadPolicy(_$isBorrowEligibleAtom);\n    _$isBorrowEligibleAtom.reportObserved();\n    return super.isBorrowEligible;\n  }\n\n  @override\n  set isBorrowEligible(bool value) {\n    _$isBorrowEligibleAtom.context.conditionallyRunInAction(() {\n      super.isBorrowEligible = value;\n      _$isBorrowEligibleAtom.reportChanged();\n    }, _$isBorrowEligibleAtom, name: '${_$isBorrowEligibleAtom.name}_set');\n  }\n\n  final _$hasExceededBorrowLimitAtom =\n      Atom(name: 'WalletBase.hasExceededBorrowLimit');\n\n  @override\n  bool get hasExceededBorrowLimit {\n    _$hasExceededBorrowLimitAtom.context\n        .enforceReadPolicy(_$hasExceededBorrowLimitAtom);\n    _$hasExceededBorrowLimitAtom.reportObserved();\n    return super.hasExceededBorrowLimit;\n  }\n\n  @override\n  set hasExceededBorrowLimit(bool value) {\n    _$hasExceededBorrowLimitAtom.context.conditionallyRunInAction(() {\n      super.hasExceededBorrowLimit = value;\n      _$hasExceededBorrowLimitAtom.reportChanged();\n    }, _$hasExceededBorrowLimitAtom,\n        name: '${_$hasExceededBorrowLimitAtom.name}_set');\n  }\n\n  final _$hasReceivedSubscribeResponseAtom =\n      Atom(name: 'WalletBase.hasReceivedSubscribeResponse');\n\n  @override\n  bool get hasReceivedSubscribeResponse {\n    _$hasReceivedSubscribeResponseAtom.context\n        .enforceReadPolicy(_$hasReceivedSubscribeResponseAtom);\n    _$hasReceivedSubscribeResponseAtom.reportObserved();\n    return super.hasReceivedSubscribeResponse;\n  }\n\n  @override\n  set hasReceivedSubscribeResponse(bool value) {\n    _$hasReceivedSubscribeResponseAtom.context.conditionallyRunInAction(() {\n      super.hasReceivedSubscribeResponse = value;\n      _$hasReceivedSubscribeResponseAtom.reportChanged();\n    }, _$hasReceivedSubscribeResponseAtom,\n        name: '${_$hasReceivedSubscribeResponseAtom.name}_set');\n  }\n\n  final _$initializeRpcAsyncAction = AsyncAction('initializeRpc');\n\n  @override\n  Future<void> initializeRpc() {\n    return _$initializeRpcAsyncAction.run(() => super.initializeRpc());\n  }\n\n  final _$getBalanceAndInsertBorrowedAsyncAction =\n      AsyncAction('getBalanceAndInsertBorrowed');\n\n  @override\n  Future<dynamic> getBalanceAndInsertBorrowed() {\n    return _$getBalanceAndInsertBorrowedAsyncAction\n        .run(() => super.getBalanceAndInsertBorrowed());\n  }\n\n  final _$updateBorrowedAsyncAction = AsyncAction('updateBorrowed');\n\n  @override\n  Future<dynamic> updateBorrowed() {\n    return _$updateBorrowedAsyncAction.run(() => super.updateBorrowed());\n  }\n\n  final _$initiateBorrowAsyncAction = AsyncAction('initiateBorrow');\n\n  @override\n  Future<dynamic> initiateBorrow() {\n    return _$initiateBorrowAsyncAction.run(() => super.initiateBorrow());\n  }\n\n  final _$findAccountsRequestAsyncAction = AsyncAction('findAccountsRequest');\n\n  @override\n  Future<RPCResponse> findAccountsRequest(FindAccountsRequest request) {\n    return _$findAccountsRequestAsyncAction\n        .run(() => super.findAccountsRequest(request));\n  }\n\n  final _$findAccountsWithNameLikeAsyncAction =\n      AsyncAction('findAccountsWithNameLike');\n\n  @override\n  Future<List<PascalAccount>> findAccountsWithNameLike(String name) {\n    return _$findAccountsWithNameLikeAsyncAction\n        .run(() => super.findAccountsWithNameLike(name));\n  }\n\n  final _$loadWalletAsyncAction = AsyncAction('loadWallet');\n\n  @override\n  Future<bool> loadWallet() {\n    return _$loadWalletAsyncAction.run(() => super.loadWallet());\n  }\n\n  final _$requestUpdateAsyncAction = AsyncAction('requestUpdate');\n\n  @override\n  Future<void> requestUpdate() {\n    return _$requestUpdateAsyncAction.run(() => super.requestUpdate());\n  }\n\n  final _$fcmUpdateAsyncAction = AsyncAction('fcmUpdate');\n\n  @override\n  Future<void> fcmUpdate(AccountNumber account) {\n    return _$fcmUpdateAsyncAction.run(() => super.fcmUpdate(account));\n  }\n\n  final _$fcmDeleteAccountAsyncAction = AsyncAction('fcmDeleteAccount');\n\n  @override\n  Future<void> fcmDeleteAccount(AccountNumber account) {\n    return _$fcmDeleteAccountAsyncAction\n        .run(() => super.fcmDeleteAccount(account));\n  }\n\n  final _$fcmUpdateBulkAsyncAction = AsyncAction('fcmUpdateBulk');\n\n  @override\n  Future<void> fcmUpdateBulk({bool forceDisable = false}) {\n    return _$fcmUpdateBulkAsyncAction\n        .run(() => super.fcmUpdateBulk(forceDisable: forceDisable));\n  }\n\n  final _$WalletBaseActionController = ActionController(name: 'WalletBase');\n\n  @override\n  Account getAccountState(PascalAccount account) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.getAccountState(account);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void changeRpcUrl(String rpcUrl) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.changeRpcUrl(rpcUrl);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void removeAccount(PascalAccount account) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.removeAccount(account);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void updateAccountName(PascalAccount account, AccountName newName) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.updateAccountName(account, newName);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  List<PascalAccount> getNonzeroBalanceAccounts() {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.getNonzeroBalanceAccounts();\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  bool shouldHaveFee() {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.shouldHaveFee();\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  String getLocalCurrencyDisplay(\n      {AvailableCurrency currency, Currency amount, int decimalDigits}) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.getLocalCurrencyDisplay(\n          currency: currency, amount: amount, decimalDigits: decimalDigits);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void disconnect() {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.disconnect();\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void reconnect() {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.reconnect();\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void addNewOp(PascalOperation op) {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.addNewOp(op);\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  void reset() {\n    final _$actionInfo = _$WalletBaseActionController.startAction();\n    try {\n      return super.reset();\n    } finally {\n      _$WalletBaseActionController.endAction(_$actionInfo);\n    }\n  }\n\n  @override\n  String toString() {\n    final string =\n        'walletLoading: ${walletLoading.toString()},totalWalletBalance: ${totalWalletBalance.toString()},walletAccounts: ${walletAccounts.toString()},rpcClient: ${rpcClient.toString()},publicKey: ${publicKey.toString()},accountStateMap: ${accountStateMap.toString()},localCurrencyPrice: ${localCurrencyPrice.toString()},btcPrice: ${btcPrice.toString()},uuid: ${uuid.toString()},activeAccount: ${activeAccount.toString()},borrowedAccount: ${borrowedAccount.toString()},isBorrowEligible: ${isBorrowEligible.toString()},hasExceededBorrowLimit: ${hasExceededBorrowLimit.toString()},hasReceivedSubscribeResponse: ${hasReceivedSubscribeResponse.toString()}';\n    return '{$string}';\n  }\n}\n"
  },
  {
    "path": "lib/themes.dart",
    "content": "import 'dart:io';\n\nimport 'package:barcode_scan/barcode_scan.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nabstract class BaseTheme {\n  int themeID;\n\n  Color primary;\n  Color primary60;\n  Color primary50;\n  Color primary30;\n  Color primary15;\n  Color primary10;\n\n  Color secondary;\n\n  Color success;\n  Color success30;\n  Color success15;\n  Color success10;\n\n  Color danger;\n  Color danger30;\n  Color danger15;\n\n  Color backgroundPrimary;\n  Color backgroundPrimary60;\n  Color backgroundPrimary30;\n  Color backgroundPrimary15;\n\n  Color backgroundSecondary;\n\n  Color shadow;\n  Color shadow50;\n  Color shadow10;\n\n  Color textDark;\n  Color textDark60;\n  Color textDark50;\n  Color textDark40;\n  Color textDark30;\n  Color textDark15;\n  Color textDark10;\n\n  Color textLight;\n  Color textLight30;\n  Color textLight15;\n\n  Color overlay30;\n  Color overlay20;\n  Color overlay15;\n  Color overlay10;\n\n  Color switchKnob;\n  Color switchTrack;\n\n  LinearGradient gradientPrimary;\n\n  LinearGradient gradientListTop;\n\n  BoxShadow shadowPrimaryOne;\n  BoxShadow shadowPrimaryTwo;\n\n  BoxShadow shadowSuccessOne;\n  BoxShadow shadowSuccessTwo;\n\n  BoxShadow shadowDangerOne;\n  BoxShadow shadowDangerTwo;\n\n  BoxShadow shadowSucces;\n\n  BoxShadow shadowTextDark;\n  BoxShadow shadowTextDarkTwo;\n\n  BoxShadow shadowMainCard;\n\n  BoxShadow shadowAccountCard;\n\n  BoxShadow shadowBottomBar;\n\n  BoxShadow shadowSettingsList;\n\n  String illustrationNewWallet;\n  String illustrationBackup;\n  String illustrationTwoOptions;\n  String illustrationBorrowed;\n  String illustrationSecurity;\n\n  String animationWelcome;\n  String animationSend;\n  String animationNameChange;\n  String animationSale;\n  String animationTransfer;\n  String animationGetAccount;\n  String animationSearch;\n\n  Brightness brightness;\n  SystemUiOverlayStyle statusBar;\n  AppIconEnum appIcon;\n  OverlayTheme scannerTheme;\n\n  /// Operator overrides\n  bool operator ==(o) => (o != null && o.hashCode == hashCode);\n  int get hashCode => themeID.hashCode;\n}\n\nclass BlaiseLightTheme extends BaseTheme {\n  int themeID = 1;\n\n  static const Color orange = Color(0xFFF7941F);\n  static const Color yellow = Color(0xFFFCC642);\n  static const Color teal = Color(0xFF00C5C3);\n  static const Color red = Color(0xFFFF6C59);\n  static const Color white = Color(0xFFFFFFFF);\n  static const Color white00 = Color(0x00FFFFFF);\n  static const Color grayDark = Color(0xFF6B6C71);\n  static const Color black = Color(0xFF000000);\n\n  Color primary = orange;\n  Color primary60 = orange.withOpacity(0.6);\n  Color primary50 = orange.withOpacity(0.5);\n  Color primary30 = orange.withOpacity(0.3);\n  Color primary15 = orange.withOpacity(0.15);\n  Color primary10 = orange.withOpacity(0.10);\n\n  Color secondary = yellow;\n\n  Color success = teal;\n  Color success30 = teal.withOpacity(0.3);\n  Color success15 = teal.withOpacity(0.15);\n  Color success10 = teal.withOpacity(0.1);\n\n  Color danger = red;\n  Color danger30 = red.withOpacity(0.3);\n  Color danger15 = red.withOpacity(0.15);\n\n  Color backgroundPrimary = white;\n  Color backgroundPrimary60 = white.withOpacity(0.6);\n  Color backgroundPrimary30 = white.withOpacity(0.3);\n  Color backgroundPrimary15 = white.withOpacity(0.15);\n\n  Color backgroundSecondary = white;\n\n  Color textDark = grayDark;\n  Color textDark60 = grayDark.withOpacity(0.6);\n  Color textDark50 = grayDark.withOpacity(0.5);\n  Color textDark40 = grayDark.withOpacity(0.4);\n  Color textDark30 = grayDark.withOpacity(0.3);\n  Color textDark15 = grayDark.withOpacity(0.15);\n  Color textDark10 = grayDark.withOpacity(0.1);\n\n  Color shadow = grayDark;\n  Color shadow50 = grayDark.withOpacity(0.5);\n  Color shadow10 = grayDark.withOpacity(0.1);\n\n  Color textLight = white;\n  Color textLight30 = white.withOpacity(0.3);\n  Color textLight15 = white.withOpacity(0.15);\n\n  Color overlay30 = black.withOpacity(0.3);\n  Color overlay20 = black.withOpacity(0.2);\n  Color overlay15 = black.withOpacity(0.15);\n  Color overlay10 = black.withOpacity(0.10);\n\n  Color switchKnob = white;\n  Color switchTrack = black.withOpacity(0.1);\n\n  LinearGradient gradientPrimary = LinearGradient(\n    begin: Alignment.bottomLeft,\n    end: Alignment.topRight,\n    stops: [0.0, 1],\n    colors: [orange, yellow],\n  );\n\n  LinearGradient gradientListTop = LinearGradient(\n    begin: Alignment.topCenter,\n    end: Alignment.bottomCenter,\n    stops: [0.0, 1],\n    colors: [white, white00],\n  );\n\n  BoxShadow shadowPrimaryOne = BoxShadow(\n      color: orange.withOpacity(0.5),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowPrimaryTwo = BoxShadow(\n      color: orange.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowSuccessOne = BoxShadow(\n      color: teal.withOpacity(0.5),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowSuccessTwo = BoxShadow(\n      color: teal.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowSuccess = BoxShadow(\n      color: teal.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowTextDark = BoxShadow(\n      color: grayDark.withOpacity(0.15),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowTextDarkTwo = BoxShadow(\n      color: grayDark.withOpacity(0.25),\n      offset: Offset(0, 12),\n      blurRadius: 24,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowMainCard = BoxShadow(\n      color: grayDark.withOpacity(0.2),\n      offset: Offset(0, 10),\n      blurRadius: 20,\n      spreadRadius: -3.3);\n\n  BoxShadow shadowAccountCard = BoxShadow(\n      color: grayDark.withOpacity(0.15),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -2.6);\n\n  BoxShadow shadowBottomBar = BoxShadow(\n      color: grayDark.withOpacity(0.2),\n      offset: Offset(0, -15),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowSettingsList = BoxShadow(\n      color: grayDark.withOpacity(0.4),\n      offset: Offset(0, 10),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowDangerOne = BoxShadow(\n      color: red.withOpacity(0.5),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  BoxShadow shadowDangerTwo = BoxShadow(\n      color: red.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  String illustrationNewWallet = 'assets/illustration_new_wallet.svg';\n  String illustrationBackup = 'assets/illustration_backup.svg';\n  String illustrationTwoOptions = 'assets/illustration_two_options.svg';\n  String illustrationBorrowed = 'assets/illustration_borrowed.svg';\n  String illustrationSecurity = 'assets/illustration_security.svg';\n\n  String animationWelcome = 'assets/animation_welcome.flr';\n  String animationSend = 'assets/animation_send.flr';\n  String animationNameChange = 'assets/animation_name_change.flr';\n  String animationSale = 'assets/animation_sale.flr';\n  String animationTransfer = 'assets/animation_transfer.flr';\n  String animationGetAccount = 'assets/animation_get_account.flr';\n  String animationSearch = 'assets/animation_search.flr';\n\n  Brightness brightness = Brightness.dark;\n  SystemUiOverlayStyle statusBar =\n      SystemUiOverlayStyle.light.copyWith(statusBarColor: Colors.transparent);\n  \n  AppIconEnum appIcon = AppIconEnum.LIGHT;\n\n  OverlayTheme scannerTheme = OverlayTheme.BLAISE;\n}\n\nclass BlaiseDarkTheme extends BaseTheme {\n  int themeID = 2;\n\n  static const Color blueish = Color(0xFF8287B5);\n  static const Color blueish2 = Color(0xFF6F70A8);\n  static const Color blueishLight = Color(0xFFACB7D1);\n  static const Color green = Color(0xFF7CBFA1);\n  static const Color red = Color(0xFFCC7A7A);\n  static const Color white = Color(0xFFFFFFFF);\n  static const Color white00 = Color(0x00FFFFFF);\n  static const Color grayLight = Color(0xFFB5B5BF);\n  static const Color grayLightish = Color(0xFF2D3136);\n  static const Color grayDark = Color(0xFF1C1E21);\n  static const Color grayDark00 = Color(0x001C1E21);\n  static const Color black = Color(0xFF000000);\n\n  Color primary = blueish;\n  Color primary60 = blueish.withOpacity(0.6);\n  Color primary50 = blueish.withOpacity(0.5);\n  Color primary30 = blueish.withOpacity(0.3);\n  Color primary15 = blueish.withOpacity(0.15);\n  Color primary10 = blueish.withOpacity(0.10);\n\n  Color secondary = blueishLight;\n\n  Color success = green;\n  Color success30 = green.withOpacity(0.3);\n  Color success15 = green.withOpacity(0.15);\n  Color success10 = green.withOpacity(0.1);\n\n  Color danger = red;\n  Color danger30 = red.withOpacity(0.3);\n  Color danger15 = red.withOpacity(0.15);\n\n  Color backgroundPrimary = grayDark;\n  Color backgroundPrimary60 = grayDark.withOpacity(0.6);\n  Color backgroundPrimary30 = grayDark.withOpacity(0.3);\n  Color backgroundPrimary15 = grayDark.withOpacity(0.15);\n\n  Color backgroundSecondary = grayDark;\n\n  Color textDark = grayLight;\n  Color textDark60 = grayLight.withOpacity(0.6);\n  Color textDark50 = grayLight.withOpacity(0.5);\n  Color textDark40 = grayLight.withOpacity(0.4);\n  Color textDark30 = grayLight.withOpacity(0.3);\n  Color textDark15 = grayLight.withOpacity(0.15);\n  Color textDark10 = grayLight.withOpacity(0.1);\n\n  Color shadow = black;\n  Color shadow50 = black.withOpacity(0.5);\n  Color shadow10 = black.withOpacity(0.1);\n\n  Color textLight = grayDark;\n  Color textLight30 = grayDark.withOpacity(0.3);\n  Color textLight15 = grayDark.withOpacity(0.15);\n\n  Color overlay30 = black.withOpacity(0.3);\n  Color overlay20 = black.withOpacity(0.2);\n  Color overlay15 = black.withOpacity(0.15);\n  Color overlay10 = black.withOpacity(0.10);\n\n  Color switchKnob = grayLightish;\n  Color switchTrack = black.withOpacity(0.3);\n\n  LinearGradient gradientPrimary = LinearGradient(\n    begin: Alignment.bottomLeft,\n    end: Alignment.topRight,\n    stops: [0.0, 1],\n    colors: [blueish2, blueishLight],\n  );\n\n  LinearGradient gradientListTop = LinearGradient(\n    begin: Alignment.topCenter,\n    end: Alignment.bottomCenter,\n    stops: [0.0, 1],\n    colors: [grayDark, grayDark00],\n  );\n\n  BoxShadow shadowPrimaryOne = BoxShadow(\n      color: blueish.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowPrimaryTwo = BoxShadow(\n      color: blueish.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowSuccessOne = BoxShadow(\n      color: green.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowSuccessTwo = BoxShadow(\n      color: green.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowTextDark = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowTextDarkTwo = BoxShadow(\n      color: black.withOpacity(0.35),\n      offset: Offset(0, 12),\n      blurRadius: 24,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowMainCard = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 10),\n      blurRadius: 20,\n      spreadRadius: -3.3);\n\n  BoxShadow shadowAccountCard = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -2.6);\n\n  BoxShadow shadowBottomBar = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, -15),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowSettingsList = BoxShadow(\n      color: black.withOpacity(0.5),\n      offset: Offset(0, 10),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowDangerOne = BoxShadow(\n      color: red.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  BoxShadow shadowDangerTwo = BoxShadow(\n      color: red.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  String illustrationNewWallet = 'assets/illustration_new_wallet_dark.svg';\n  String illustrationBackup = 'assets/illustration_backup_dark.svg';\n  String illustrationTwoOptions = 'assets/illustration_two_options_dark.svg';\n  String illustrationBorrowed = 'assets/illustration_borrowed_dark.svg';\n  String illustrationSecurity = 'assets/illustration_security_dark.svg';\n\n  String animationWelcome = 'assets/animation_welcome_dark.flr';\n  String animationSend = 'assets/animation_send_dark.flr';\n  String animationNameChange = 'assets/animation_name_change_dark.flr';\n  String animationSale = 'assets/animation_sale_dark.flr';\n  String animationTransfer = 'assets/animation_transfer_dark.flr';\n  String animationGetAccount = 'assets/animation_get_account_dark.flr';\n  String animationSearch = 'assets/animation_search.flr';\n\n  Brightness brightness = Brightness.light;\n  SystemUiOverlayStyle statusBar =\n      SystemUiOverlayStyle.dark.copyWith(statusBarColor: Colors.transparent);\n  \n  AppIconEnum appIcon = AppIconEnum.DARK;\n\n  OverlayTheme scannerTheme = OverlayTheme.BLAISEDARK;\n}\n\nclass BlaiseCopperTheme extends BaseTheme {\n  int themeID = 3;\n\n  static const Color orange = Color(0xFFDD8D52);\n  static const Color orange2 = Color(0xFFCB7244);\n  static const Color orangeLight = Color(0xFFFFBF6A);\n  static const Color blue = Color(0xFF5A73F2);\n  static const Color red = Color(0xFFF25A5A);\n  static const Color white = Color(0xFFFFFFFF);\n  static const Color white00 = Color(0x00FFFFFF);\n  static const Color grayLight = Color(0xFFB9BAC4);\n  static const Color grayLightish = Color(0xFF585A6F);\n  static const Color grayDark = Color(0xFF2B2C37);\n  static const Color grayDark00 = Color(0x002B2C37);\n  static const Color black = Color(0xFF000000);\n\n  Color primary = orange;\n  Color primary60 = orange.withOpacity(0.6);\n  Color primary50 = orange.withOpacity(0.5);\n  Color primary30 = orange.withOpacity(0.3);\n  Color primary15 = orange.withOpacity(0.15);\n  Color primary10 = orange.withOpacity(0.10);\n\n  Color secondary = orangeLight;\n\n  Color success = blue;\n  Color success30 = blue.withOpacity(0.3);\n  Color success15 = blue.withOpacity(0.15);\n  Color success10 = blue.withOpacity(0.1);\n\n  Color danger = red;\n  Color danger30 = red.withOpacity(0.3);\n  Color danger15 = red.withOpacity(0.15);\n\n  Color backgroundPrimary = grayDark;\n  Color backgroundPrimary60 = grayDark.withOpacity(0.6);\n  Color backgroundPrimary30 = grayDark.withOpacity(0.3);\n  Color backgroundPrimary15 = grayDark.withOpacity(0.15);\n\n  Color backgroundSecondary = grayDark;\n\n  Color textDark = grayLight;\n  Color textDark60 = grayLight.withOpacity(0.6);\n  Color textDark50 = grayLight.withOpacity(0.5);\n  Color textDark40 = grayLight.withOpacity(0.4);\n  Color textDark30 = grayLight.withOpacity(0.3);\n  Color textDark15 = grayLight.withOpacity(0.15);\n  Color textDark10 = grayLight.withOpacity(0.1);\n\n  Color shadow = black;\n  Color shadow50 = black.withOpacity(0.5);\n  Color shadow10 = black.withOpacity(0.1);\n\n  Color textLight = grayDark;\n  Color textLight30 = grayDark.withOpacity(0.3);\n  Color textLight15 = grayDark.withOpacity(0.15);\n\n  Color overlay30 = black.withOpacity(0.3);\n  Color overlay20 = black.withOpacity(0.2);\n  Color overlay15 = black.withOpacity(0.15);\n  Color overlay10 = black.withOpacity(0.10);\n\n  Color switchKnob = grayLightish;\n  Color switchTrack = black.withOpacity(0.3);\n\n  LinearGradient gradientPrimary = LinearGradient(\n    begin: Alignment.bottomLeft,\n    end: Alignment.topRight,\n    stops: [0.0, 1],\n    colors: [orange2, orangeLight],\n  );\n\n  LinearGradient gradientListTop = LinearGradient(\n    begin: Alignment.topCenter,\n    end: Alignment.bottomCenter,\n    stops: [0.0, 1],\n    colors: [grayDark, grayDark00],\n  );\n\n  BoxShadow shadowPrimaryOne = BoxShadow(\n      color: orange.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowPrimaryTwo = BoxShadow(\n      color: orange.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowSuccessOne = BoxShadow(\n      color: blue.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowSuccessTwo = BoxShadow(\n      color: blue.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowTextDark = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  \n  BoxShadow shadowTextDarkTwo = BoxShadow(\n      color: black.withOpacity(0.35),\n      offset: Offset(0, 12),\n      blurRadius: 24,\n      spreadRadius: -4.0);\n\n  BoxShadow shadowMainCard = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 10),\n      blurRadius: 20,\n      spreadRadius: -3.3);\n\n  BoxShadow shadowAccountCard = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -2.6);\n\n  BoxShadow shadowBottomBar = BoxShadow(\n      color: black.withOpacity(0.25),\n      offset: Offset(0, -15),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowSettingsList = BoxShadow(\n      color: black.withOpacity(0.5),\n      offset: Offset(0, 10),\n      blurRadius: 30,\n      spreadRadius: -5.0);\n\n  BoxShadow shadowDangerOne = BoxShadow(\n      color: red.withOpacity(0.1),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n  BoxShadow shadowDangerTwo = BoxShadow(\n      color: red.withOpacity(0.05),\n      offset: Offset(0, 8),\n      blurRadius: 16,\n      spreadRadius: -4.0);\n\n  String illustrationNewWallet = 'assets/illustration_new_wallet_copper.svg';\n  String illustrationBackup = 'assets/illustration_backup_copper.svg';\n  String illustrationTwoOptions = 'assets/illustration_two_options_copper.svg';\n  String illustrationBorrowed = 'assets/illustration_borrowed_copper.svg';\n  String illustrationSecurity = 'assets/illustration_security_copper.svg';\n\n  String animationWelcome = 'assets/animation_welcome_copper.flr';\n  String animationSend = 'assets/animation_send_copper.flr';\n  String animationNameChange = 'assets/animation_name_change_copper.flr';\n  String animationSale = 'assets/animation_sale_copper.flr';\n  String animationTransfer = 'assets/animation_transfer_copper.flr';\n  String animationGetAccount = 'assets/animation_get_account_copper.flr';\n  String animationSearch = 'assets/animation_search.flr';\n\n  Brightness brightness = Brightness.light;\n  SystemUiOverlayStyle statusBar =\n      SystemUiOverlayStyle.dark.copyWith(statusBarColor: Colors.transparent);\n\n  AppIconEnum appIcon = AppIconEnum.COPPER;\n\n  OverlayTheme scannerTheme = OverlayTheme.COPPER;\n}\n\nenum AppIconEnum { LIGHT, DARK, COPPER }\nclass AppIcon {\n  static const _channel = const MethodChannel('fappchannel');\n\n  static Future<void> setAppIcon(AppIconEnum iconToChange) async {\n    if (!Platform.isIOS) {\n      return null;\n    }\n    String iconStr = \"Light\";\n    switch (iconToChange) {\n      case AppIconEnum.DARK:\n        iconStr = \"Dark\";\n        break;\n      case AppIconEnum.COPPER:\n        iconStr = \"Copper\";\n        break;\n      case AppIconEnum.LIGHT:\n      default:\n        iconStr = \"Light\";\n        break;\n    }\n    final Map<String, dynamic> params = <String, dynamic>{\n     'icon': iconStr,\n    };\n    return await _channel.invokeMethod('changeIcon', params);\n  }\n}"
  },
  {
    "path": "lib/ui/account/account.dart",
    "content": "import 'dart:async';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/change_name/change_name_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/delist_for_sale/delisting_for_sale.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/list_for_sale/list_for_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/private_sale/create_private_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/transfer_account/transfer_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/receive/receive_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/send/send_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/operation_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/settings.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/operation_list_item.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/placeholder_operation_list_item.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/reactive_refresh.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:logger/logger.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass AccountPage extends StatefulWidget {\n  final PascalAccount account;\n\n  AccountPage({@required this.account});\n  @override\n  _AccountPageState createState() => _AccountPageState();\n}\n\nclass _AccountPageState extends State<AccountPage>\n    with SingleTickerProviderStateMixin, WidgetsBindingObserver {\n  final Logger log = sl.get<Logger>();\n\n  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();\n  Account accountState;\n  // Opacity Animation\n  Animation<double> _opacityAnimation;\n  AnimationController _opacityAnimationController;\n\n  // Refresh indicator\n  bool _isRefreshing;\n\n  // Reference to contacts list\n  List<Contact> _contacts;\n\n  // Last refresh\n  DateTime _lastRefresh;\n\n  // Account price\n  String accountPrice = \"0.25\";\n\n  // Borrowed account expiration\n  String untilExpirationDays = \"\";\n  String untilExpirationHours = \"\";\n  String untilExpirationMinutes = \"\";\n\n  void formatExpiryDate(DateTime expiry) {\n    if (expiry != null) {\n      DateTime now = DateTime.now().toUtc();\n      int diffS = expiry.difference(now).inSeconds;\n      if (diffS <= 60) {\n        // Seconds only\n        untilExpirationDays = \"0\";\n        untilExpirationHours = \"0\";\n        untilExpirationMinutes = \"0\";\n      } else if (diffS <= 3600) {\n        // Minutes\n        String minutesStr = \"\";\n        int minutes = diffS ~/ 60;\n        minutesStr = minutes.toString();\n        untilExpirationDays = \"0\";\n        untilExpirationHours = \"0\";\n        untilExpirationMinutes = minutesStr;\n      } else if (diffS <= 86400) {\n        // Hours:Minutes\n        String hoursStr = \"\";\n        int hours = diffS ~/ 3600;\n        hoursStr = hours.toString();\n        diffS = diffS % 3600;\n        String minutesStr = \"\";\n        int minutes = diffS ~/ 60;\n        minutesStr = minutes.toString();\n        untilExpirationDays = \"0\";\n        untilExpirationHours = hoursStr;\n        untilExpirationMinutes = minutesStr;\n      } else {\n        // Days:Hours:Minutes\n        String daysStr = \"\";\n        int days = diffS ~/ 86400;\n        daysStr = days.toString();\n        diffS = diffS % 86400;\n        String hoursStr = \"\";\n        int hours = diffS ~/ 3600;\n        hoursStr = hours.toString();\n        diffS = diffS % 3600;\n        String minutesStr = \"\";\n        int minutes = diffS ~/ 60;\n        minutesStr = minutes.toString();\n        untilExpirationDays = daysStr;\n        untilExpirationHours = hoursStr;\n        untilExpirationMinutes = minutesStr;\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _isRefreshing = false;\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n    this.accountState.updateAccount();\n    if (!this.accountState.account.isBorrowed) {\n      this.accountState.getAccountOperations();\n    }\n    walletState.activeAccount = widget.account.account;\n    // Opacity Animation\n    _opacityAnimationController = new AnimationController(\n      duration: const Duration(milliseconds: 500),\n      vsync: this,\n    );\n    _opacityAnimation = new Tween(begin: 1.0, end: 0.4).animate(\n      CurvedAnimation(\n        parent: _opacityAnimationController,\n        curve: Curves.easeIn,\n        reverseCurve: Curves.easeOut,\n      ),\n    );\n    _startAnimation();\n    // Contacts\n    _updateContacts();\n    // Subscribe for updates\n    walletState.requestUpdate();\n    // Update FCM token\n    if (!this.accountState.account.isBorrowed) {\n      walletState.fcmUpdate(widget.account.account);\n    }\n  }\n\n  void _animationStatusListener(AnimationStatus status) {\n    switch (status) {\n      case AnimationStatus.dismissed:\n        _opacityAnimationController.forward();\n        break;\n      case AnimationStatus.completed:\n        _opacityAnimationController.reverse();\n        break;\n      default:\n        return null;\n    }\n  }\n\n  void _animationControllerListener() {\n    if (accountState.operationsLoading ||\n        accountState.operationsToDisplay == null) {\n      setState(() {});\n    } else {\n      _disposeAnimations();\n    }\n  }\n\n  void _disposeAnimations() {\n    try {\n      _opacityAnimation?.removeStatusListener(_animationStatusListener);\n      _opacityAnimationController?.removeListener(_animationControllerListener);\n      _opacityAnimationController?.dispose();\n    } catch (e) {}\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    _disposeAnimations();\n    _destroyBus();\n    walletState.activeAccount = null;\n    super.dispose();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    switch (state) {\n      case AppLifecycleState.paused:\n        super.didChangeAppLifecycleState(state);\n        break;\n      case AppLifecycleState.resumed:\n        // Do an auto-refresh\n        if (_lastRefresh == null ||\n            DateTime.now().toUtc().difference(_lastRefresh).inSeconds > 300) {\n          _refresh(socketUpdate: false);\n        }\n        walletState.requestUpdate();\n        super.didChangeAppLifecycleState(state);\n        break;\n      default:\n        super.didChangeAppLifecycleState(state);\n        break;\n    }\n  }\n\n  void _startAnimation() {\n    _opacityAnimationController.addListener(_animationControllerListener);\n    _opacityAnimation.addStatusListener(_animationStatusListener);\n    _opacityAnimationController.forward();\n  }\n\n  Future<void> _updateContacts() async {\n    List<Contact> contacts = await sl.get<DBHelper>().getContacts();\n    if (mounted) {\n      setState(() {\n        _contacts = contacts;\n      });\n    }\n  }\n\n  List<DialogListItem> getOperationsList() {\n    return [\n      DialogListItem(\n        option: AppLocalization.of(context).changeAccountNameHeader,\n        action: () {\n          Navigator.of(context).pop();\n          AppSheets.showBottomSheet(\n              context: context,\n              widget: ChangeNameSheet(account: accountState.account));\n        },\n      ),\n      DialogListItem(\n        option: AppLocalization.of(context).transferAccountHeader,\n        action: () {\n          Navigator.of(context).pop();\n          AppSheets.showBottomSheet(\n              context: context,\n              widget: TransferAccountSheet(\n                account: accountState.account,\n              ));\n        },\n      ),\n      DialogListItem(\n          option: AppLocalization.of(context).listAccountForSaleHeader,\n          action: () {\n            Navigator.of(context).pop();\n            AppSheets.showBottomSheet(\n                context: context,\n                widget: ListForSaleSheet(account: accountState.account));\n          },\n          disabled: accountState == null ||\n              accountState.account.state == AccountState.LISTED),\n      DialogListItem(\n          option: AppLocalization.of(context).createPrivateSaleHeader,\n          action: () {\n            Navigator.of(context).pop();\n            AppSheets.showBottomSheet(\n                context: context,\n                widget: CreatePrivateSaleSheet(account: accountState.account));\n          },\n          disabled: accountState == null ||\n              accountState.account.state == AccountState.LISTED),\n      DialogListItem(\n          option: AppLocalization.of(context).delistFromSaleHeader,\n          action: () {\n            Navigator.of(context).pop();\n            AppSheets.showBottomSheet(\n                context: context,\n                widget: DelistingForSaleSheet(\n                  account: accountState.account,\n                  fee: walletState.shouldHaveFee()\n                      ? walletState.MIN_FEE\n                      : walletState.NO_FEE,\n                ));\n          },\n          disabled: accountState == null ||\n              accountState.account.state != AccountState.LISTED),\n    ];\n  }\n\n  StreamSubscription<UpdateHistoryEvent> _historySub;\n  StreamSubscription<ContactModifiedEvent> _contactModifiedSub;\n\n  void _registerBus() {\n    _historySub = EventTaxiImpl.singleton()\n        .registerTo<UpdateHistoryEvent>()\n        .listen((event) {\n      walletState.loadWallet();\n    });\n    _contactModifiedSub = EventTaxiImpl.singleton()\n        .registerTo<ContactModifiedEvent>()\n        .listen((event) {\n      _updateContacts();\n    });\n  }\n\n  void _destroyBus() {\n    if (_historySub != null) {\n      _historySub.cancel();\n    }\n    if (_contactModifiedSub != null) {\n      _contactModifiedSub.cancel();\n    }\n  }\n\n  // Refresh list\n  Future<void> _refresh({bool socketUpdate = true}) async {\n    _lastRefresh = DateTime.now().toUtc();\n    setState(() {\n      _isRefreshing = true;\n    });\n    HapticUtil.success();\n    // Hide refresh indicator after 3 seconds if no server response\n    Future.delayed(Duration(seconds: 3), () {\n      if (mounted) {\n        setState(() {\n          _isRefreshing = false;\n        });\n      }\n    });\n    if (socketUpdate) {\n      walletState.requestUpdate();\n    }\n    if (!widget.account.isBorrowed) {\n      this.accountState?.updateAccount();\n      this.accountState?.getAccountOperations()?.whenComplete(() {\n        if (mounted) {\n          setState(() {\n            _isRefreshing = false;\n          });\n        }\n      });\n    } else {\n      this.accountState?.updateAccount()?.whenComplete(() {\n        if (mounted) {\n          if (this.accountState.account.isBorrowed) {\n            setState(() {\n              _isRefreshing = false;\n            });\n          } else {\n            walletState.updateBorrowed().then((_) {\n              if (mounted) {\n                setState(() {\n                  _isRefreshing = false;\n                });\n                if (walletState.borrowedAccount == null) {\n                  walletState.loadWallet();\n                  Navigator.of(context).pushReplacementNamed('/account',\n                      arguments: this.accountState.account);\n                }\n              }\n            });\n          }\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      drawerEdgeDragWidth: 200,\n      key: _scaffoldKey,\n      resizeToAvoidBottomInset: false,\n      endDrawer: SizedBox(\n          width: double.infinity,\n          child: Drawer(child: SettingsPage(account: accountState))),\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // A stack for the main card and the background gradient\n                  Stack(\n                    children: <Widget>[\n                      // Container for the gradient background\n                      Container(\n                        height: 65 +\n                            (MediaQuery.of(context).padding.top) +\n                            (20 - (MediaQuery.of(context).padding.bottom) / 2),\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                        ),\n                      ),\n                      //Container for the main card\n                      Container(\n                        height: 130,\n                        margin: EdgeInsetsDirectional.fromSTEB(\n                            12,\n                            (MediaQuery.of(context).padding.top) +\n                                (20 -\n                                    (MediaQuery.of(context).padding.bottom) /\n                                        2),\n                            12,\n                            0),\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                            gradient: StateContainer.of(context)\n                                .curTheme\n                                .gradientPrimary,\n                            borderRadius: BorderRadius.circular(12),\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowMainCard,\n                            ]),\n                        child: ClipRRect(\n                          borderRadius: BorderRadius.circular(12),\n                          child: Material(\n                            color: Colors.transparent,\n                            child: InkWell(\n                              onTap: widget.account.isBorrowed\n                                  ? () {\n                                      return null;\n                                    }\n                                  : () {\n                                      showAppDialog(\n                                          context: context,\n                                          builder: (_) => DialogOverlay(\n                                              title: AppLocalization.of(context)\n                                                  .otherOperationsHeader,\n                                              optionsList:\n                                                  getOperationsList()));\n                                    },\n                              highlightColor: StateContainer.of(context)\n                                  .curTheme\n                                  .textLight15,\n                              splashColor: StateContainer.of(context)\n                                  .curTheme\n                                  .textLight30,\n                              child: Row(\n                                mainAxisAlignment:\n                                    MainAxisAlignment.spaceBetween,\n                                crossAxisAlignment: CrossAxisAlignment.center,\n                                children: <Widget>[\n                                  // Back icon and price text\n                                  Container(\n                                    height: 130,\n                                    width: 60,\n                                    alignment: Alignment(-1, 0),\n                                    child: Column(\n                                      mainAxisAlignment:\n                                          MainAxisAlignment.spaceBetween,\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // Back icon\n                                        Container(\n                                          margin: EdgeInsetsDirectional.only(\n                                              top: 2, start: 2),\n                                          height: 50,\n                                          width: 50,\n                                          child: FlatButton(\n                                              highlightColor:\n                                                  StateContainer.of(context)\n                                                      .curTheme\n                                                      .textLight15,\n                                              splashColor:\n                                                  StateContainer.of(context)\n                                                      .curTheme\n                                                      .textLight30,\n                                              onPressed: () {\n                                                Navigator.of(context).pop();\n                                              },\n                                              shape: RoundedRectangleBorder(\n                                                  borderRadius:\n                                                      BorderRadius.circular(\n                                                          50.0)),\n                                              padding:\n                                                  EdgeInsetsDirectional.only(\n                                                      end: 10),\n                                              child: Icon(AppIcons.back,\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textLight,\n                                                  size: 22)),\n                                        ),\n                                        // Price text\n                                        Observer(\n                                            builder: (BuildContext context) {\n                                          if (walletState.localCurrencyPrice ==\n                                              null) {\n                                            return Opacity(\n                                              opacity: _opacityAnimation.value,\n                                              child: Container(\n                                                decoration: BoxDecoration(\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textLight\n                                                          .withOpacity(0.75),\n                                                  borderRadius:\n                                                      BorderRadius.circular(\n                                                          100),\n                                                ),\n                                                child: AutoSizeText(\n                                                  \"            \",\n                                                  style: AppStyles\n                                                      .paragraphTextLightSmallSemiBold(\n                                                          context),\n                                                ),\n                                              ),\n                                            );\n                                          } else {\n                                            return Container(\n                                              margin:\n                                                  EdgeInsetsDirectional.only(\n                                                      start: 16, bottom: 12),\n                                              child: AutoSizeText(\n                                                walletState\n                                                    .getLocalCurrencyDisplay(\n                                                        currency:\n                                                            StateContainer.of(\n                                                                    context)\n                                                                .curCurrency,\n                                                        amount: Currency('1'),\n                                                        decimalDigits: 3),\n                                                maxLines: 1,\n                                                stepGranularity: 0.1,\n                                                minFontSize: 8,\n                                                textAlign: TextAlign.start,\n                                                style: AppStyles\n                                                    .paragraphTextLightSmallSemiBold(\n                                                        context),\n                                              ),\n                                            );\n                                          }\n                                        })\n                                      ],\n                                    ),\n                                  ),\n                                  // Column for balance texts\n                                  Column(\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    crossAxisAlignment:\n                                        CrossAxisAlignment.center,\n                                    children: <Widget>[\n                                      // Container for \"TOTAL BALANCE\" text\n                                      Container(\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            12, 0, 12, 0),\n                                        child: AutoSizeText(\n                                          toUppercase(\n                                              AppLocalization.of(context)\n                                                  .accountBalanceHeader,\n                                              context),\n                                          style:\n                                              AppStyles.paragraphTextLightSmall(\n                                                  context),\n                                        ),\n                                      ),\n                                      // Container for the balance\n                                      Container(\n                                        width:\n                                            MediaQuery.of(context).size.width -\n                                                168,\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            12, 4, 12, 4),\n                                        child: Observer(\n                                          builder: (BuildContext context) {\n                                            Currency bal =\n                                                accountState.accountBalance;\n                                            return AutoSizeText.rich(\n                                              TextSpan(\n                                                children: [\n                                                  TextSpan(\n                                                    text: \"\",\n                                                    style: AppStyles\n                                                        .iconFontTextLightPascal(\n                                                            context),\n                                                  ),\n                                                  TextSpan(\n                                                      text: \" \",\n                                                      style: TextStyle(\n                                                          fontSize: 12)),\n                                                  TextSpan(\n                                                      text: bal.toStringOpt(),\n                                                      style: AppStyles.header(\n                                                          context))\n                                                ],\n                                              ),\n                                              textAlign: TextAlign.center,\n                                              maxLines: 1,\n                                              minFontSize: 8,\n                                              stepGranularity: 1,\n                                              style: TextStyle(\n                                                fontSize: 28,\n                                              ),\n                                            );\n                                          },\n                                        ),\n                                      ),\n                                      // Container for the fiat conversion\n                                      Observer(\n                                        builder: (BuildContext context) {\n                                          if (walletState.localCurrencyPrice ==\n                                              null) {\n                                            return Opacity(\n                                              opacity: _opacityAnimation.value,\n                                              child: Container(\n                                                decoration: BoxDecoration(\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textLight\n                                                          .withOpacity(0.75),\n                                                  borderRadius:\n                                                      BorderRadius.circular(\n                                                          100),\n                                                ),\n                                                child: AutoSizeText(\n                                                  \"            \",\n                                                  style: AppStyles\n                                                      .paragraphTextLightSmallSemiBold(\n                                                          context),\n                                                ),\n                                              ),\n                                            );\n                                          } else {\n                                            return Container(\n                                              margin: EdgeInsetsDirectional\n                                                  .fromSTEB(12, 0, 12, 0),\n                                              child: AutoSizeText(\n                                                \"(${walletState.getLocalCurrencyDisplay(currency: StateContainer.of(context).curCurrency, amount: accountState.accountBalance)})\",\n                                                style: AppStyles\n                                                    .paragraphTextLightSmall(\n                                                        context),\n                                              ),\n                                            );\n                                          }\n                                        },\n                                      )\n                                    ],\n                                  ),\n                                  // Column for settings icon and other operations icon\n                                  Container(\n                                    width: 60,\n                                    child: Column(\n                                      mainAxisAlignment:\n                                          MainAxisAlignment.spaceBetween,\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.end,\n                                      children: <Widget>[\n                                        // Settings Icon\n                                        Container(\n                                          margin: EdgeInsetsDirectional.only(\n                                              top: 2, end: 2),\n                                          height: 50,\n                                          width: 50,\n                                          child: FlatButton(\n                                              highlightColor:\n                                                  StateContainer.of(context)\n                                                      .curTheme\n                                                      .textLight15,\n                                              splashColor:\n                                                  StateContainer.of(context)\n                                                      .curTheme\n                                                      .textLight30,\n                                              onPressed: () {\n                                                _scaffoldKey.currentState\n                                                    .openEndDrawer();\n                                              },\n                                              shape: RoundedRectangleBorder(\n                                                  borderRadius:\n                                                      BorderRadius.circular(\n                                                          50.0)),\n                                              padding: EdgeInsets.all(0.0),\n                                              child: Icon(AppIcons.settings,\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textLight,\n                                                  size: 24)),\n                                        ),\n                                        // Other Operations Icon\n                                        Container(\n                                            margin: EdgeInsetsDirectional.only(\n                                                bottom: 2, end: 2),\n                                            height: 50,\n                                            width: 50,\n                                            child: !widget.account.isBorrowed\n                                                ? FlatButton(\n                                                    highlightColor:\n                                                        StateContainer.of(context)\n                                                            .curTheme\n                                                            .textLight15,\n                                                    splashColor:\n                                                        StateContainer.of(context)\n                                                            .curTheme\n                                                            .textLight30,\n                                                    onPressed: () {\n                                                      showAppDialog(\n                                                          context: context,\n                                                          builder: (_) => DialogOverlay(\n                                                              title: AppLocalization\n                                                                      .of(\n                                                                          context)\n                                                                  .otherOperationsHeader,\n                                                              optionsList:\n                                                                  getOperationsList()));\n                                                    },\n                                                    shape: RoundedRectangleBorder(\n                                                        borderRadius:\n                                                            BorderRadius.circular(\n                                                                50.0)),\n                                                    padding:\n                                                        EdgeInsetsDirectional.only(\n                                                            start: 8, top: 6),\n                                                    child: Icon(AppIcons.edit,\n                                                        color:\n                                                            StateContainer.of(\n                                                                    context)\n                                                                .curTheme\n                                                                .textLight,\n                                                        size: 18))\n                                                : SizedBox()),\n                                      ],\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                  widget.account.isBorrowed\n                      ? // Paragraph and illustration\n                      Expanded(\n                          child: ReactiveRefreshIndicator(\n                              backgroundColor: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary,\n                              onRefresh: _refresh,\n                              isRefreshing: _isRefreshing,\n                              child: SingleChildScrollView(\n                                physics: AlwaysScrollableScrollPhysics(),\n                                padding: EdgeInsets.all(0),\n                                //Container for the paragraph\n                                child: Container(\n                                  height: MediaQuery.of(context).size.height -\n                                      (130 +\n                                          ((MediaQuery.of(context)\n                                                  .padding\n                                                  .top) +\n                                              (20 -\n                                                  (MediaQuery.of(context)\n                                                          .padding\n                                                          .bottom) /\n                                                      2))) -\n                                      ((MediaQuery.of(context).padding.bottom) +\n                                          (24 -\n                                              (MediaQuery.of(context)\n                                                      .padding\n                                                      .bottom) /\n                                                  2)) -\n                                      50 -\n                                      20,\n                                  child: Column(\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    children: <Widget>[\n                                      Container(\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  30, 0, 30, 0),\n                                          child: Observer(\n                                            builder: (context) {\n                                              String msgStr = \"\";\n                                              List<TextSpan> msg;\n                                              if ((walletState.borrowedAccount !=\n                                                          null &&\n                                                      walletState\n                                                          .borrowedAccount\n                                                          .paid) ||\n                                                  accountState.paid) {\n                                                msgStr = AppLocalization.of(\n                                                        context)\n                                                    .borrowedAccountPaidParagraph;\n                                                msg = formatLocalizedColors(\n                                                    context, msgStr);\n                                              } else {\n                                                formatExpiryDate(walletState\n                                                    .borrowedAccount?.expiry);\n                                                msgStr = AppLocalization.of(\n                                                        context)\n                                                    .borrowedAccountParagraph\n                                                    .replaceAll(\n                                                        \"%1\", accountPrice)\n                                                    .replaceAll(\"%2\",\n                                                        untilExpirationDays)\n                                                    .replaceAll(\"%3\",\n                                                        untilExpirationHours)\n                                                    .replaceAll('%4',\n                                                        untilExpirationMinutes);\n                                                msg = formatLocalizedColors(\n                                                    context, msgStr);\n                                              }\n                                              return AutoSizeText.rich(\n                                                TextSpan(children: msg),\n                                                stepGranularity: 0.5,\n                                                maxLines: 10,\n                                                minFontSize: 8,\n                                                textAlign: TextAlign.center,\n                                                style: TextStyle(fontSize: 14),\n                                              );\n                                            },\n                                          )),\n                                      // Container for the illustration\n                                      Container(\n                                        margin: EdgeInsetsDirectional.only(\n                                          top: 24,\n                                          bottom: 24,\n                                        ),\n                                        child: SvgRepaintAsset(\n                                            asset: StateContainer.of(context)\n                                                .curTheme\n                                                .illustrationBorrowed,\n                                            width: MediaQuery.of(context)\n                                                    .size\n                                                    .width *\n                                                0.8,\n                                            height: MediaQuery.of(context)\n                                                    .size\n                                                    .width *\n                                                0.8 *\n                                                132 /\n                                                295),\n                                      ),\n                                    ],\n                                  ),\n                                ),\n                              )))\n                      :\n                      // Wallet Cards\n                      Expanded(\n                          child: widget.account.isBorrowed\n                              ? SizedBox()\n                              : Column(\n                                  children: <Widget>[\n                                    // Accounts text\n                                    Container(\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          24, 18, 24, 4),\n                                      alignment: Alignment(-1, 0),\n                                      child: AutoSizeText(\n                                        toUppercase(\n                                            AppLocalization.of(context)\n                                                .operationsHeader,\n                                            context),\n                                        style: AppStyles.headerSmall(context),\n                                        textAlign: TextAlign.left,\n                                        stepGranularity: 0.5,\n                                        maxLines: 1,\n                                      ),\n                                    ),\n                                    // Expanded list\n                                    Expanded(\n                                      // Container for the list\n                                      child: Container(\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            12, 8, 12, 0),\n                                        width: double.maxFinite,\n                                        decoration: BoxDecoration(\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .backgroundPrimary,\n                                          borderRadius: BorderRadius.only(\n                                            topLeft: Radius.circular(12),\n                                            topRight: Radius.circular(12),\n                                          ),\n                                          boxShadow: [\n                                            StateContainer.of(context)\n                                                .curTheme\n                                                .shadowSettingsList,\n                                          ],\n                                        ),\n                                        // Operations List\n                                        child: Observer(\n                                          builder: (BuildContext context) {\n                                            if (accountState\n                                                    .operationsLoading ||\n                                                accountState.operations ==\n                                                    null) {\n                                              return ReactiveRefreshIndicator(\n                                                  backgroundColor:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .backgroundPrimary,\n                                                  onRefresh: _refresh,\n                                                  isRefreshing: _isRefreshing,\n                                                  child: ClipRRect(\n                                                      borderRadius:\n                                                          BorderRadius.only(\n                                                              topLeft: Radius\n                                                                  .circular(12),\n                                                              topRight: Radius\n                                                                  .circular(\n                                                                      12)),\n                                                      child: Opacity(\n                                                        opacity:\n                                                            _opacityAnimation\n                                                                .value,\n                                                        child: ListView(\n                                                            padding:\n                                                                EdgeInsetsDirectional\n                                                                    .only(\n                                                                        bottom:\n                                                                            24),\n                                                            children: [\n                                                              PlaceholderOperationListItem(\n                                                                  type: PlaceholderOperationType\n                                                                      .Received),\n                                                              PlaceholderOperationListItem(\n                                                                  type:\n                                                                      PlaceholderOperationType\n                                                                          .Sent),\n                                                              PlaceholderOperationListItem(\n                                                                  type: PlaceholderOperationType\n                                                                      .Received),\n                                                              PlaceholderOperationListItem(\n                                                                  type: PlaceholderOperationType\n                                                                      .Received),\n                                                              PlaceholderOperationListItem(\n                                                                  type:\n                                                                      PlaceholderOperationType\n                                                                          .Sent),\n                                                              PlaceholderOperationListItem(\n                                                                  type:\n                                                                      PlaceholderOperationType\n                                                                          .Sent),\n                                                              PlaceholderOperationListItem(\n                                                                  type: PlaceholderOperationType\n                                                                      .Received),\n                                                              PlaceholderOperationListItem(\n                                                                  type:\n                                                                      PlaceholderOperationType\n                                                                          .Sent),\n                                                            ]),\n                                                      )));\n                                            } else {\n                                              return ClipRRect(\n                                                borderRadius: BorderRadius.only(\n                                                    topLeft:\n                                                        Radius.circular(12),\n                                                    topRight:\n                                                        Radius.circular(12)),\n                                                child: ReactiveRefreshIndicator(\n                                                    backgroundColor:\n                                                        StateContainer.of(\n                                                                context)\n                                                            .curTheme\n                                                            .backgroundPrimary,\n                                                    onRefresh: _refresh,\n                                                    isRefreshing: _isRefreshing,\n                                                    child: accountState\n                                                            .hasOperationsToDisplay()\n                                                        ? ListView.builder(\n                                                            physics:\n                                                                AlwaysScrollableScrollPhysics(),\n                                                            padding:\n                                                                EdgeInsetsDirectional\n                                                                    .only(\n                                                                        bottom:\n                                                                            24),\n                                                            itemCount: accountState\n                                                                .operationsToDisplay\n                                                                .length,\n                                                            itemBuilder:\n                                                                (context,\n                                                                    index) {\n                                                              return _buildAccountHistoryItem(\n                                                                  accountState\n                                                                          .operationsToDisplay[\n                                                                      index]);\n                                                            })\n                                                        : ListView(\n                                                            padding:\n                                                                EdgeInsetsDirectional\n                                                                    .only(\n                                                                        bottom:\n                                                                            24),\n                                                            children:\n                                                                getPlaceholderCards(),\n                                                          )),\n                                              );\n                                            }\n                                          },\n                                        ),\n                                      ),\n                                    ),\n                                  ],\n                                ),\n                        ),\n                  // Bottom bar\n                  Align(\n                    alignment: Alignment.bottomCenter,\n                    child: Container(\n                      width: double.maxFinite,\n                      decoration: BoxDecoration(\n                        color: StateContainer.of(context)\n                            .curTheme\n                            .backgroundPrimary,\n                        borderRadius: BorderRadius.only(\n                          topLeft: Radius.circular(12),\n                          topRight: Radius.circular(12),\n                        ),\n                        boxShadow: [\n                          StateContainer.of(context).curTheme.shadowBottomBar,\n                        ],\n                      ),\n                      child: Container(\n                        margin: EdgeInsetsDirectional.only(top: 4),\n                        child: Row(\n                          children: <Widget>[\n                            Observer(\n                              builder: (BuildContext context) {\n                                PascalAccount account = accountState.account;\n                                return AppButton(\n                                  text:\n                                      AppLocalization.of(context).receiveButton,\n                                  type: AppButtonType.PrimaryLeft,\n                                  onPressed: () {\n                                    AppSheets.showBottomSheet(\n                                        context: context,\n                                        widget: ReceiveSheet(\n                                          accountName: account.name.accountName,\n                                          accountNumber: account.account,\n                                        ));\n                                  },\n                                );\n                              },\n                            ),\n                            Observer(\n                              builder: (BuildContext context) {\n                                return AppButton(\n                                  text: AppLocalization.of(context).sendButton,\n                                  type: AppButtonType.PrimaryRight,\n                                  disabled: accountState.accountBalance >\n                                          Currency('0')\n                                      ? false || widget.account.isBorrowed\n                                      : true,\n                                  onPressed: () {\n                                    AppSheets.showBottomSheet(\n                                      context: context,\n                                      widget: SendSheet(\n                                          account: accountState.account,\n                                          localCurrency:\n                                              StateContainer.of(context)\n                                                  .curCurrency),\n                                    );\n                                  },\n                                );\n                              },\n                            )\n                          ],\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildAccountHistoryItem(PascalOperation op) {\n    if (op.optype == OpType.TRANSACTION) {\n      OperationType type;\n      if (op.senders[0].sendingAccount == accountState.account.account) {\n        type = OperationType.Sent;\n      } else {\n        type = OperationType.Received;\n      }\n      AccountNumber accountToCheck = type == OperationType.Received\n          ? op.senders[0].sendingAccount\n          : op.receivers[0].receivingAccount;\n      List<Contact> contacts =\n          _contacts.where((c) => c.account == accountToCheck).toList();\n      Contact c;\n      if (contacts.length > 0) {\n        c = contacts[0];\n      }\n      return OperationListItem(\n        type: type,\n        amount: op.receivers[0].amount.toStringOpt(),\n        address: c == null ? accountToCheck.toString() : c.name,\n        isContact: c != null,\n        date: op.maturation != null\n            ? UIUtil.formatDateStr(op.time)\n            : AppLocalization.of(context).pendingHeader,\n        payload: op.receivers[0].payload,\n        onPressed: () {\n          AppSheets.showBottomSheet(\n              context: context,\n              animationDurationMs: 200,\n              widget: OperationSheet(\n                payload: op.receivers[0].payload,\n                ophash: op.ophash,\n                operation: op,\n                isContact: c != null,\n                account: type == OperationType.Received\n                    ? op.senders[0].sendingAccount\n                    : op.receivers[0].receivingAccount,\n              ));\n        },\n      );\n    } else if (op.optype == OpType.CHANGE_ACCOUNT_INFO) {\n      // Only show change name\n      if (op.changers[0].newName != null) {\n        return OperationListItem(\n          type: OperationType.NameChanged,\n          address: op.changers[0].changingAccount.toString(),\n          date: op.maturation != null\n              ? UIUtil.formatDateStr(op.time)\n              : AppLocalization.of(context).pendingHeader,\n          payload: \"\",\n          name: op.changers[0].newName.toString(),\n          onPressed: () {\n            AppSheets.showBottomSheet(\n                context: context,\n                animationDurationMs: 200,\n                widget: OperationSheet(\n                  payload: \"\",\n                  ophash: op.ophash,\n                  operation: op,\n                  account: op.changers[0].changingAccount,\n                ));\n          },\n        );\n      }\n    } else if (op.optype == OpType.LIST_FORSALE) {\n      return OperationListItem(\n        type: OperationType.ListedForSale,\n        address: op.changers[0].sellerAccount.toString(),\n        date: op.maturation != null\n            ? UIUtil.formatDateStr(op.time)\n            : AppLocalization.of(context).pendingHeader,\n        payload: \"\",\n        price: op.changers[0].accountPrice.toStringOpt(),\n        onPressed: () {\n          AppSheets.showBottomSheet(\n              context: context,\n              animationDurationMs: 200,\n              widget: OperationSheet(\n                payload: \"\",\n                ophash: op.ophash,\n                operation: op,\n                account: op.changers[0].sellerAccount,\n              ));\n        },\n      );\n    } else if (op.optype == OpType.DELIST_FORSALE) {\n      return OperationListItem(\n        type: OperationType.DelistedForSale,\n        address: op.signerAccount.toString(),\n        date: op.maturation != null\n            ? UIUtil.formatDateStr(op.time)\n            : AppLocalization.of(context).pendingHeader,\n        payload: \"\",\n        onPressed: () {\n          AppSheets.showBottomSheet(\n              context: context,\n              animationDurationMs: 200,\n              widget: OperationSheet(\n                payload: \"\",\n                ophash: op.ophash,\n                operation: op,\n                account: op.signerAccount,\n              ));\n        },\n      );\n    }\n    return SizedBox();\n  }\n\n  List<Widget> getPlaceholderCards() {\n    List<Widget> history = [];\n    // Show welcome\n    history.add(OperationListItem(type: OperationType.Welcome));\n    history.add(OperationListItem(\n      type: OperationType.Sent,\n      amount: \"1,111\",\n      address: \"111111-11\",\n      date: \"May 11 • 11:11\",\n    ));\n    history.add(OperationListItem(\n      type: OperationType.Received,\n      amount: \"1,111\",\n      address: \"111111-11\",\n      date: \"May 11 • 11:11\",\n    ));\n    return history;\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/operation_details_sheet.dart",
    "content": "import 'dart:async';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/webview.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass OperationDetailsSheet extends StatefulWidget {\n  final PascalOperation operation;\n\n  OperationDetailsSheet({@required this.operation});\n\n  _OperationDetailsSheetState createState() => _OperationDetailsSheetState();\n}\n\nclass _OperationDetailsSheetState extends State<OperationDetailsSheet> {\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  String getOptypeDisplay(int optype) {\n    switch (optype) {\n      case OpType.BLOCKCHAIN_REWARD:\n        return AppLocalization.of(context)\n            .blockchainRewardOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.TRANSACTION:\n        return AppLocalization.of(context)\n            .transactionOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.CHANGE_KEY:\n        return AppLocalization.of(context)\n            .changeKeyOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.RECOVER_FUNDS:\n        return AppLocalization.of(context)\n            .recoverFundsOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.LIST_FORSALE:\n        return AppLocalization.of(context)\n            .listAccountForSaleHeader\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.DELIST_FORSALE:\n        return AppLocalization.of(context)\n            .delistAccountOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.BUY_ACCOUNT:\n        return AppLocalization.of(context)\n            .buyAccountOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.CHANGE_KEY_SIGNED:\n        return AppLocalization.of(context)\n            .changeKeySignedOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.CHANGE_ACCOUNT_INFO:\n        return AppLocalization.of(context)\n            .changeAccountInfoOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      case OpType.MULTIOPERATION:\n        return AppLocalization.of(context)\n            .multioperationOPDetails\n            .replaceAll(\"%1\", optype.toString());\n      default:\n        return AppLocalization.of(context)\n            .unknownOPDetails\n            .replaceAll(\"%1\", optype.toString());\n    }\n  }\n\n  int getNOperation() {\n    int nOp;\n    try {\n      if (widget.operation.optype == OpType.TRANSACTION) {\n        nOp = widget.operation.senders[0].nOperation;\n      } else {\n        nOp = widget.operation.changers[0].nOperation;\n      }\n    } catch (e) {\n      nOp = -1;\n    }\n    return nOp;\n  }\n\n  Widget getSendingAccount() {\n    if (widget.operation.optype == OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).sendingAccountOPDetails,\n            value: widget.operation.senders[0].sendingAccount.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getReceivingAccount() {\n    if (widget.operation.optype == OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).receivingAccountOPDetails,\n            value: widget.operation.receivers[0].receivingAccount.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getChangingAccount() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).changingAccountOPDetails,\n            value: widget.operation.changers[0].changingAccount.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getSendAmount() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).sendAmountOPDetails,\n            value: widget.operation.senders[0].amount.toStringOpt());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getPayload() {\n    if (widget.operation.optype == OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).payloadOPDetails,\n            value: widget.operation.senders[0].payload);\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getNewPublickey() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).newPublicKeyOPDetails,\n            value: PublicKeyCoder()\n                .encodeToBase58(widget.operation.changers[0].newEncPubkey));\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getNewName() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).newNameOPDetails,\n            value: widget.operation.changers[0].newName.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getSeller() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).sellerAccountOPDetails,\n            value: widget.operation.changers[0].sellerAccount.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getAccountPrice() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).accountPriceOPDetails,\n            value: widget.operation.changers[0].accountPrice.toStringOpt());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  Widget getLockedUntilBlock() {\n    if (widget.operation.optype != OpType.TRANSACTION) {\n      try {\n        return TransactionDetailsListItem(\n            header: AppLocalization.of(context).lockedUntilBlockOPDetails,\n            value: widget.operation.changers[0].lockedUntilBlock.toString());\n      } catch (e) {\n        return SizedBox();\n      }\n    }\n    return SizedBox();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: ClipRRect(\n              borderRadius: BorderRadius.only(\n                  topLeft: Radius.circular(12), topRight: Radius.circular(12)),\n              child: Material(\n                child: Column(\n                  children: <Widget>[\n                    // Transaction Details\n                    Expanded(\n                      child: Stack(\n                        children: <Widget>[\n                          // The List\n                          SingleChildScrollView(\n                            padding:\n                                EdgeInsetsDirectional.fromSTEB(0, 0, 0, 50),\n                            child: Column(\n                              children: <Widget>[\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .blockOPDetails,\n                                    value: widget.operation.block.toString()),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .optxtOPDetails,\n                                    value: widget.operation.optxt),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .timeOPDetails,\n                                    value: widget.operation.maturation == null\n                                        ? AppLocalization.of(context)\n                                            .naOPDetails\n                                        : UIUtil.formatDateStrLong(\n                                            widget.operation.time)),\n                                getSendingAccount(),\n                                getSendAmount(),\n                                getPayload(),\n                                getReceivingAccount(),\n                                getNewName(),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .ophashOPDetails,\n                                    value: widget.operation.ophash,\n                                    withDivider: false),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .optypeOPDetails,\n                                    value: getOptypeDisplay(\n                                        widget.operation.optype)),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .maturationOPDetails,\n                                    value: widget.operation.maturation == null\n                                        ? AppLocalization.of(context)\n                                            .nullOPDetails\n                                        : widget.operation.maturation\n                                            .toString()),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .feeOPDetails,\n                                    value: widget.operation.fee\n                                        .toPositive()\n                                        .toStringOpt()),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .opblockOPDetails,\n                                    value: widget.operation.opblock.toString()),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .noperationOPDetails,\n                                    value: getNOperation().toString()),\n                                getSeller(),\n                                getAccountPrice(),\n                                getLockedUntilBlock(),\n                                getNewPublickey(),\n                                getChangingAccount(),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .accountOPDetails,\n                                    value: widget.operation.account.toString()),\n                                TransactionDetailsListItem(\n                                    header: AppLocalization.of(context)\n                                        .signeraccountOPDetails,\n                                    value: widget.operation.signerAccount\n                                        .toString()),\n                              ],\n                            ),\n                          ),\n                          // Bottom Gradient\n                          Align(\n                            alignment: Alignment.bottomCenter,\n                            child: Container(\n                              height: 40,\n                              width: double.maxFinite,\n                              decoration: BoxDecoration(\n                                gradient: LinearGradient(\n                                    begin: Alignment.topCenter,\n                                    end: Alignment.bottomCenter,\n                                    stops: [\n                                      0.0,\n                                      1.0\n                                    ],\n                                    colors: [\n                                      StateContainer.of(context)\n                                          .curTheme\n                                          .backgroundPrimary\n                                          .withOpacity(0.0),\n                                      StateContainer.of(context)\n                                          .curTheme\n                                          .backgroundPrimary,\n                                    ]),\n                                borderRadius: BorderRadius.only(\n                                  topLeft: Radius.circular(12),\n                                  topRight: Radius.circular(12),\n                                ),\n                              ),\n                            ),\n                          )\n                        ],\n                      ),\n                    ),\n                    //\"Open in Explorer\" button\n                    Row(\n                      children: <Widget>[\n                        AppButton(\n                          type: AppButtonType.Primary,\n                          text:\n                              AppLocalization.of(context).openInExplorerButton,\n                          buttonTop: true,\n                          onPressed: () {\n                            AppWebView.showWebView(context,\n                                'http://explorer.pascalcoin.org/findoperation.php?ophash=${widget.operation.ophash}');\n                          },\n                        ),\n                      ],\n                    ),\n                    // \"Close\" button\n                    Row(\n                      children: <Widget>[\n                        AppButton(\n                          type: AppButtonType.PrimaryOutline,\n                          text: AppLocalization.of(context).closeButton,\n                          onPressed: () {\n                            Navigator.of(context).pop();\n                          },\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nclass TransactionDetailsListItem extends StatefulWidget {\n  final String header;\n  final String value;\n  final bool withDivider;\n\n  TransactionDetailsListItem(\n      {this.header, this.value, this.withDivider = true});\n\n  _TransactionDetailsListItemState createState() =>\n      _TransactionDetailsListItemState();\n}\n\nclass _TransactionDetailsListItemState\n    extends State<TransactionDetailsListItem> {\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  Timer _copiedTimer;\n  bool _copied = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(children: <Widget>[\n      Container(\n        width: double.maxFinite,\n        color: _copied\n            ? StateContainer.of(context).curTheme.success\n            : StateContainer.of(context).curTheme.backgroundPrimary,\n        child: FlatButton(\n          onPressed: () {\n            Clipboard.setData(ClipboardData(text: widget.value.trim()));\n            setState(() {\n              _copied = true;\n            });\n            if (_copiedTimer != null) {\n              _copiedTimer.cancel();\n            }\n            _copiedTimer = Timer(const Duration(milliseconds: 1000), () {\n              if (mounted) {\n                setState(() {\n                  _copied = false;\n                });\n              }\n            });\n          },\n          splashColor: StateContainer.of(context).curTheme.textDark30,\n          highlightColor: StateContainer.of(context).curTheme.textDark15,\n          padding: EdgeInsetsDirectional.fromSTEB(0, 16, 0, 16),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: <Widget>[\n              Container(\n                width: MediaQuery.of(context).size.width - 100,\n                child: AutoSizeText(\n                  widget.header,\n                  style: _copied\n                      ? AppStyles.textLightSmall400(context)\n                      : AppStyles.textDarkSmall400(context),\n                  textAlign: TextAlign.center,\n                ),\n              ),\n              Container(\n                width: MediaQuery.of(context).size.width - 100,\n                margin: EdgeInsetsDirectional.only(top: 6),\n                child: AutoSizeText(\n                  widget.value,\n                  style: _copied\n                      ? AppStyles.textLightLarge700(context)\n                      : AppStyles.textDarkLarge700(context),\n                  textAlign: TextAlign.center,\n                ),\n              ),\n              _copied\n                  ? Container(\n                      alignment: Alignment(1, 0),\n                      margin: EdgeInsetsDirectional.only(end: 16),\n                      child: AutoSizeText(\n                        AppLocalization.of(context).copiedButton,\n                        style: AppStyles.textLightSmall700(context),\n                        textAlign: TextAlign.end,\n                      ),\n                    )\n                  : SizedBox()\n            ],\n          ),\n        ),\n      ),\n      widget.withDivider\n          ? Container(\n              width: double.maxFinite,\n              height: 1,\n              color: StateContainer.of(context).curTheme.textDark10,\n            )\n          : SizedBox()\n    ]);\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/operation_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/account/operation_details_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/contacts/add_contact_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\n\nclass OperationSheet extends StatefulWidget {\n  final String payload;\n  final String ophash;\n  final AccountNumber account;\n  final bool isContact;\n  final PascalOperation operation;\n  OperationSheet(\n      {@required this.ophash,\n      @required this.account,\n      @required this.operation,\n      this.payload,\n      this.isContact = false});\n\n  _OperationSheetState createState() => _OperationSheetState();\n}\n\nclass _OperationSheetState extends State<OperationSheet> {\n  bool _addressCopied;\n  Timer _addressCopiedTimer;\n  String payload;\n  bool payloadCopied;\n  Timer payloadCopiedTimer;\n  @override\n  void initState() {\n    super.initState();\n    _addressCopied = false;\n    payloadCopied = false;\n    if (isNotEmpty(widget.payload)) {\n      try {\n        payload = PDUtil.bytesToUtf8String(PDUtil.hexToBytes(widget.payload));\n      } catch (e) {\n        // Try to decrypt this payload with private key\n        sl.get<Vault>().getPrivateKey().then((pkey) {\n          PrivateKey pk =\n              PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(pkey));\n          try {\n            Uint8List result =\n                EciesCrypt.decrypt(PDUtil.hexToBytes(widget.payload), pk);\n            String asUtf8 = PDUtil.bytesToUtf8String(result);\n            setState(() {\n              payload = asUtf8;\n            });\n          } catch (e) {}\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: <Widget>[\n        Container(\n          decoration: BoxDecoration(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            borderRadius: BorderRadius.only(\n              topLeft: Radius.circular(12),\n              topRight: Radius.circular(12),\n            ),\n          ),\n          child: Column(\n            children: <Widget>[\n              isNotEmpty(payload)\n                  ? GestureDetector(\n                      onTapDown: (details) {\n                        _copyPayloadToClipboard();\n                      },\n                      child: Column(\n                        children: <Widget>[\n                          Container(\n                            margin: EdgeInsetsDirectional.only(top: 20),\n                            child: AutoSizeText(\n                              payloadCopied\n                                  ? AppLocalization.of(context).copiedButton\n                                  : AppLocalization.of(context)\n                                      .payloadTextFieldHeader,\n                              maxLines: 1,\n                              stepGranularity: 1,\n                              minFontSize: 8,\n                              textAlign: TextAlign.start,\n                              style: payloadCopied\n                                  ? AppStyles.headerSmallBoldSuccess(context)\n                                  : AppStyles.headerSmallBold(context),\n                            ),\n                          ),\n                          Container(\n                            margin: EdgeInsetsDirectional.only(\n                                start: 24, end: 24, top: 10, bottom: 4),\n                            padding:\n                                EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                            decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(12),\n                              border: Border.all(\n                                  width: 1,\n                                  color: payloadCopied\n                                      ? StateContainer.of(context)\n                                          .curTheme\n                                          .success15\n                                      : StateContainer.of(context)\n                                          .curTheme\n                                          .textDark15),\n                              color: payloadCopied\n                                  ? StateContainer.of(context)\n                                      .curTheme\n                                      .success10\n                                  : StateContainer.of(context)\n                                      .curTheme\n                                      .textDark10,\n                            ),\n                            child: AutoSizeText(\n                              payload,\n                              maxLines: 6,\n                              stepGranularity: 0.1,\n                              minFontSize: 8,\n                              textAlign: TextAlign.center,\n                              style: payloadCopied\n                                  ? AppStyles.paragraphMediumSuccess(context)\n                                  : AppStyles.paragraphMedium(context),\n                            ),\n                          )\n                        ],\n                      ),\n                    )\n                  : SizedBox(),\n              //\"Copy Address\", \"Add to Contacts\" and \"Operation Details\" buttons\n              Row(\n                children: <Widget>[\n                  widget.operation.optype == OpType.TRANSACTION\n                      ? AppButton(\n                          type: _addressCopied\n                              ? AppButtonType.Success\n                              : AppButtonType.Primary,\n                          text: _addressCopied\n                              ? AppLocalization.of(context).copiedAddressButton\n                              : AppLocalization.of(context).copyAddressButton,\n                          buttonTop: true,\n                          onPressed: () {\n                            Clipboard.setData(\n                                ClipboardData(text: widget.account.toString()));\n                            setState(() {\n                              _addressCopied = true;\n                            });\n                            if (_addressCopiedTimer != null) {\n                              _addressCopiedTimer.cancel();\n                            }\n                            _addressCopiedTimer =\n                                Timer(const Duration(milliseconds: 1500), () {\n                              if (mounted) {\n                                setState(() {\n                                  _addressCopied = false;\n                                });\n                              }\n                            });\n                          },\n                        )\n                      : SizedBox(),\n                ],\n              ),\n              widget.isContact || widget.operation.optype != OpType.TRANSACTION\n                  ? SizedBox()\n                  : Row(\n                      children: <Widget>[\n                        AppButton(\n                          type: AppButtonType.PrimaryOutline,\n                          text: AppLocalization.of(context).addToContactsButton,\n                          buttonMiddle: true,\n                          onPressed: () {\n                            Navigator.pop(context);\n                            AppSheets.showBottomSheet(\n                                context: context,\n                                widget: AddContactSheet(\n                                  account: widget.account,\n                                ));\n                          },\n                        ),\n                      ],\n                    ),\n              widget.operation.optype != OpType.TRANSACTION\n                  ? SizedBox(height: 4)\n                  : SizedBox(),\n              // \"Operation Details\" button\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.PrimaryOutline,\n                    text: AppLocalization.of(context).operationDetailsButton,\n                    onPressed: () {\n                      Navigator.of(context).pop();\n                      AppSheets.showBottomSheet(\n                          context: context,\n                          widget: OperationDetailsSheet(\n                              operation: widget.operation));\n                    },\n                  ),\n                ],\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n\n  void _copyPayloadToClipboard() {\n    Clipboard.setData(ClipboardData(text: this.payload));\n    setState(() {\n      payloadCopied = true;\n    });\n    if (payloadCopiedTimer != null) {\n      payloadCopiedTimer.cancel();\n    }\n    payloadCopiedTimer = Timer(const Duration(milliseconds: 1500), () {\n      if (mounted) {\n        setState(() {\n          payloadCopied = false;\n        });\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/change_name/change_name_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/change_name/changing_name_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/fee_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ChangeNameSheet extends StatefulWidget {\n  final PascalAccount account;\n\n  ChangeNameSheet({@required this.account});\n\n  _ChangeNameSheetState createState() => _ChangeNameSheetState();\n}\n\nclass _ChangeNameSheetState extends State<ChangeNameSheet> {\n  FocusNode _nameFocus;\n  TextEditingController _nameController;\n  String _nameError;\n\n  // Fee\n  bool _hasFee;\n\n  @override\n  void initState() {\n    super.initState();\n    this._nameFocus = FocusNode();\n    this._nameController = TextEditingController();\n    this._hasFee = walletState.shouldHaveFee();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(\n                              AppLocalization.of(context).changeNameSheetHeader,\n                              context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).changeNameParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for the name text field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .newAccountNameTextFieldHeader,\n                                  style: AppStyles.paragraphMedium(context),\n                                  maxLines: 1,\n                                  controller: _nameController,\n                                  focusNode: _nameFocus,\n                                  inputFormatters: [\n                                    FilteringTextInputFormatter.allow(RegExp(\n                                        r'[0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()\\-+{}[\\]_:\"|<>,\\.\\?\\/~]')),\n                                    PascalNameFormatter()\n                                  ],\n                                  onChanged: (nt) {\n                                    if (_nameError != null) {\n                                      setState(() {\n                                        _nameError = null;\n                                      });\n                                    }\n                                  },\n                                ),\n                              ),\n                              // Fee container\n                              _hasFee\n                                  ? FeeContainer(\n                                      feeText:\n                                          walletState.MIN_FEE.toStringOpt())\n                                  : SizedBox(),\n                              // Error Text\n                              ErrorContainer(\n                                errorText: _nameError == null ? \"\" : _nameError,\n                              ),\n                              // Bottom Margin\n                              SizedBox(height: 24),\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"Change Name\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).changeNameButton,\n                      onPressed: () {\n                        validateAndChangeName();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  void validateAndChangeName() {\n    try {\n      if (_nameController.text.isNotEmpty && _nameController.text.length < 3) {\n        setState(() {\n          _nameError = AppLocalization.of(context).threeCharacterNameError;\n        });\n        return;\n      }\n      AccountName accountName = AccountName(_nameController.text);\n      AppSheets.showBottomSheet(\n          context: context,\n          widget: ChangingNameSheet(\n              account: widget.account,\n              newName: accountName,\n              fee: _hasFee ? walletState.MIN_FEE : walletState.NO_FEE),\n          noBlur: true);\n    } catch (e) {\n      setState(() {\n        _nameError = AppLocalization.of(context).invalidAccountNameError;\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/change_name/changed_name_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ChangedNameSheet extends StatefulWidget {\n  final AccountName newName;\n  final Currency fee;\n\n  ChangedNameSheet({@required this.newName, @required this.fee});\n\n  _ChangedNameSheetState createState() => _ChangedNameSheetState();\n}\n\nclass _ChangedNameSheetState extends State<ChangedNameSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .changedNameSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).changedNameParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // New Account Name Header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .newAccountNameTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the name\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.newName.toString(),\n                            maxLines: 6,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.paragraphMedium(context),\n                          ),\n                        ),\n                        // \"Fee\" header\n                        widget.fee != Currency(\"0\")\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  AppLocalization.of(context)\n                                      .feeTextFieldHeader,\n                                  style:\n                                      AppStyles.textFieldLabelSuccess(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            : SizedBox(),\n                        // Container for the fee\n                        widget.fee != Currency(\"0\")\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success15),\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .success10,\n                                ),\n                                child: AutoSizeText.rich(\n                                  TextSpan(\n                                    children: [\n                                      TextSpan(\n                                        text: \"\",\n                                        style: AppStyles\n                                            .iconFontSuccessBalanceSmallPascal(\n                                                context),\n                                      ),\n                                      TextSpan(\n                                          text: \" \",\n                                          style: TextStyle(fontSize: 8)),\n                                      TextSpan(\n                                          text: widget.fee.toStringOpt(),\n                                          style: AppStyles.balanceSmallSuccess(\n                                              context)),\n                                    ],\n                                  ),\n                                  textAlign: TextAlign.center,\n                                  maxLines: 1,\n                                  minFontSize: 8,\n                                  stepGranularity: 1,\n                                  style: TextStyle(\n                                    fontSize: 14,\n                                  ),\n                                ),\n                              )\n                            : SizedBox(),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/change_name/changing_name_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/authenticated_event.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/change_name/changed_name_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ChangingNameSheet extends StatefulWidget {\n  final PascalAccount account;\n  final AccountName newName;\n  final Currency fee;\n\n  ChangingNameSheet(\n      {@required this.account, @required this.newName, @required this.fee});\n\n  _ChangingNameSheetState createState() => _ChangingNameSheetState();\n}\n\nclass _ChangingNameSheetState extends State<ChangingNameSheet> {\n  OverlayEntry _overlay;\n  Account accountState;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.CHANGE) {\n        doChange();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationNameChange,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .changingNameSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).changingNameParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      // \"Address\" header\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context)\n                              .newAccountNameTextFieldHeader,\n                          style: AppStyles.textFieldLabel(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.start,\n                        ),\n                      ),\n                      // Container for the name\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                        padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(12),\n                          border: Border.all(\n                              width: 1,\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark15),\n                          color: StateContainer.of(context).curTheme.textDark10,\n                        ),\n                        child: AutoSizeText(\n                          widget.newName.toString(),\n                          maxLines: 2,\n                          stepGranularity: 0.1,\n                          minFontSize: 8,\n                          textAlign: TextAlign.center,\n                          style: AppStyles.paragraphMedium(context),\n                        ),\n                      ),\n                      // \"Fee\" header\n                      widget.fee != Currency(\"0\")\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                              child: AutoSizeText(\n                                AppLocalization.of(context).feeTextFieldHeader,\n                                style: AppStyles.textFieldLabel(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.start,\n                              ),\n                            )\n                          : SizedBox(),\n                      // Container for the fee\n                      widget.fee != Currency(\"0\")\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                              padding:\n                                  EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                              decoration: BoxDecoration(\n                                borderRadius: BorderRadius.circular(12),\n                                border: Border.all(\n                                    width: 1,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary15),\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .primary10,\n                              ),\n                              child: AutoSizeText.rich(\n                                TextSpan(\n                                  children: [\n                                    TextSpan(\n                                      text: \"\",\n                                      style: AppStyles\n                                          .iconFontPrimaryBalanceSmallPascal(\n                                              context),\n                                    ),\n                                    TextSpan(\n                                        text: \" \",\n                                        style: TextStyle(fontSize: 8)),\n                                    TextSpan(\n                                        text: widget.fee.toStringOpt(),\n                                        style: AppStyles.balanceSmall(context)),\n                                  ],\n                                ),\n                                textAlign: TextAlign.center,\n                                maxLines: 1,\n                                minFontSize: 8,\n                                stepGranularity: 1,\n                                style: TextStyle(\n                                  fontSize: 14,\n                                ),\n                              ),\n                            )\n                          : SizedBox(),\n                      // Bottom Margin\n                      SizedBox(height: 24),\n                    ],\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          ,context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton()\n                              .fire(AuthenticatedEvent(AUTH_EVENT_TYPE.CHANGE));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doChange({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      RPCResponse result =\n          await accountState.changeAccountName(widget.newName, fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        try {\n          OperationsResponse resp = result;\n          PascalOperation op = resp.operations[0];\n          if (op.valid == null || op.valid) {\n            // Update name\n            walletState.updateAccountName(widget.account, widget.newName);\n            Navigator.of(context).popUntil(RouteUtils.withNameLike(\"/account\"));\n            AppSheets.showBottomSheet(\n                context: context,\n                closeOnTap: true,\n                widget: ChangedNameSheet(\n                  newName: widget.newName,\n                  fee: fee,\n                ));\n          } else {\n            if (op.errors.contains(\"zero fee\") &&\n                widget.fee == walletState.NO_FEE) {\n              UIUtil.showFeeDialog(\n                  context: context,\n                  onConfirm: () async {\n                    Navigator.of(context).pop();\n                    doChange(fee: walletState.MIN_FEE);\n                  });\n            } else {\n              UIUtil.showSnackbar(\"${op.errors}\", context);\n            }\n          }\n        } catch (e) {\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).somethingWentWrongError, context);\n        }\n      }\n    } catch (e) {\n      _overlay?.remove();\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message = AppLocalization.of(context)\n        .authenticateToChangeNameParagraph\n        .replaceAll(\"%1\", widget.newName.toString());\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/delist_for_sale/delisted_for_sale.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass DelistedForSaleSheet extends StatefulWidget {\n  final AccountNumber account;\n  final Currency fee;\n\n  DelistedForSaleSheet({@required this.account, @required this.fee}) : super();\n\n  _DelistedForSaleSheetState createState() => _DelistedForSaleSheetState();\n}\n\nclass _DelistedForSaleSheetState extends State<DelistedForSaleSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .delistedSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .delistedFromSaleParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // \"Account\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).accountTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.account.toString(),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // \"Fee\" header\n                        widget.fee != Currency(\"0\")\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  AppLocalization.of(context)\n                                      .feeTextFieldHeader,\n                                  style:\n                                      AppStyles.textFieldLabelSuccess(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            : SizedBox(),\n                        // Container for the fee\n                        widget.fee != Currency(\"0\")\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success15),\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .success10,\n                                ),\n                                child: AutoSizeText.rich(\n                                  TextSpan(\n                                    children: [\n                                      TextSpan(\n                                        text: \"\",\n                                        style: AppStyles\n                                            .iconFontSuccessBalanceSmallPascal(\n                                                context),\n                                      ),\n                                      TextSpan(\n                                          text: \" \",\n                                          style: TextStyle(fontSize: 8)),\n                                      TextSpan(\n                                          text: widget.fee.toStringOpt(),\n                                          style: AppStyles.balanceSmallSuccess(\n                                              context)),\n                                    ],\n                                  ),\n                                  textAlign: TextAlign.center,\n                                  maxLines: 1,\n                                  minFontSize: 8,\n                                  stepGranularity: 1,\n                                  style: TextStyle(\n                                    fontSize: 14,\n                                  ),\n                                ),\n                              )\n                            : SizedBox(),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/delist_for_sale/delisting_for_sale.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/delist_for_sale/delisted_for_sale.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass DelistingForSaleSheet extends StatefulWidget {\n  final PascalAccount account;\n  final Currency fee;\n\n  DelistingForSaleSheet({@required this.account, @required this.fee}) : super();\n\n  _DelistingForSaleSheetState createState() => _DelistingForSaleSheetState();\n}\n\nclass _DelistingForSaleSheetState extends State<DelistingForSaleSheet> {\n  OverlayEntry _overlay;\n  Account accountState;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.DELIST_FORSALE) {\n        doDelist();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationSale,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .delistingSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).delistFromSaleParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      // \"Account\" header\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).accountTextFieldHeader,\n                          style: AppStyles.textFieldLabel(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.start,\n                        ),\n                      ),\n                      // Container for the account number\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                        padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(12),\n                          border: Border.all(\n                              width: 1,\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark15),\n                          color: StateContainer.of(context).curTheme.textDark10,\n                        ),\n                        child: AutoSizeText(\n                          widget.account.account.toString(),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          minFontSize: 8,\n                          textAlign: TextAlign.center,\n                          style: AppStyles.privateKeyTextDark(context),\n                        ),\n                      ),\n                      // \"Fee\" header\n                      widget.fee != Currency(\"0\")\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                              child: AutoSizeText(\n                                AppLocalization.of(context).feeTextFieldHeader,\n                                style: AppStyles.textFieldLabel(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.start,\n                              ),\n                            )\n                          : SizedBox(),\n                      // Container for the fee\n                      widget.fee != Currency(\"0\")\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                              padding:\n                                  EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                              decoration: BoxDecoration(\n                                borderRadius: BorderRadius.circular(12),\n                                border: Border.all(\n                                    width: 1,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary15),\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .primary10,\n                              ),\n                              child: AutoSizeText.rich(\n                                TextSpan(\n                                  children: [\n                                    TextSpan(\n                                      text: \"\",\n                                      style: AppStyles\n                                          .iconFontPrimaryBalanceSmallPascal(\n                                              context),\n                                    ),\n                                    TextSpan(\n                                        text: \" \",\n                                        style: TextStyle(fontSize: 8)),\n                                    TextSpan(\n                                        text: widget.fee.toStringOpt(),\n                                        style: AppStyles.balanceSmall(context)),\n                                  ],\n                                ),\n                                textAlign: TextAlign.center,\n                                maxLines: 1,\n                                minFontSize: 8,\n                                stepGranularity: 1,\n                                style: TextStyle(\n                                  fontSize: 14,\n                                ),\n                              ),\n                            )\n                          : SizedBox(),\n                      // Bottom Margin\n                      SizedBox(height: 24),\n                    ],\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          ,context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton().fire(AuthenticatedEvent(\n                              AUTH_EVENT_TYPE.DELIST_FORSALE));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doDelist({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      RPCResponse result = await accountState.delistAccountForSale(fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        try {\n          OperationsResponse resp = result;\n          PascalOperation op = resp.operations[0];\n          if (op.valid == null || op.valid) {\n            // Update state\n            accountState.changeAccountState(AccountState.NORMAL);\n            Navigator.of(context).popUntil(RouteUtils.withNameLike(\"/account\"));\n            ;\n            AppSheets.showBottomSheet(\n                context: context,\n                closeOnTap: true,\n                widget: DelistedForSaleSheet(\n                  account: widget.account.account,\n                  fee: fee,\n                ));\n          } else {\n            if (op.errors.contains(\"zero fee\") &&\n                widget.fee == walletState.NO_FEE) {\n              UIUtil.showFeeDialog(\n                  context: context,\n                  onConfirm: () async {\n                    Navigator.of(context).pop();\n                    doDelist(fee: walletState.MIN_FEE);\n                  });\n            } else {\n              UIUtil.showSnackbar(\"${op.errors}\", context);\n            }\n          }\n        } catch (e) {\n          UIUtil.showSnackbar(\n              \"Something went wrong, try again later.\", context);\n        }\n      }\n    } catch (e) {\n      _overlay?.remove();\n      UIUtil.showSnackbar(\"Something went wrong, try again later.\", context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message = AppLocalization.of(context).authenticateToDelistParagraph;\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/list_for_sale/list_for_sale_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/list_for_sale/listing_for_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/fee_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/number_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ListForSaleSheet extends StatefulWidget {\n  final PascalAccount account;\n\n  ListForSaleSheet({@required this.account}) : super();\n\n  _ListForSaleSheetState createState() => _ListForSaleSheetState();\n}\n\nclass _ListForSaleSheetState extends State<ListForSaleSheet> {\n  FocusNode priceFocusNode;\n  FocusNode receiverFocusNode;\n  TextEditingController priceController;\n  TextEditingController receiverController;\n\n  String _priceErr;\n  String _receiverErr;\n\n  // Fee\n  bool _hasFee;\n\n  @override\n  void initState() {\n    super.initState();\n    this.priceFocusNode = FocusNode();\n    this.receiverFocusNode = FocusNode();\n    this.priceController = TextEditingController();\n    this.receiverController = TextEditingController();\n    this._hasFee = walletState.shouldHaveFee();\n    this.receiverFocusNode.addListener(() {\n      if (!this.receiverFocusNode.hasFocus) {\n        try {\n          AccountNumber numberFormatted =\n              AccountNumber(this.receiverController.text);\n          this.receiverController.text = numberFormatted.toString();\n        } catch (e) {}\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(\n                              AppLocalization.of(context)\n                                  .listForSaleSheetHeader,\n                              context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).listForSaleParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for price field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .priceTextFieldHeader,\n                                  style: AppStyles.paragraphPrimary(context),\n                                  maxLines: 1,\n                                  inputType: TextInputType.numberWithOptions(\n                                      decimal: true),\n                                  prefix: Icon(\n                                    AppIcons.pascalsymbol,\n                                    size: 15,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary,\n                                  ),\n                                  focusNode: priceFocusNode,\n                                  controller: priceController,\n                                  onChanged: (text) {\n                                    if (_priceErr != null) {\n                                      setState(() {\n                                        _priceErr = null;\n                                      });\n                                    }\n                                  },\n                                  inputFormatters: [\n                                    LengthLimitingTextInputFormatter(13),\n                                    CurrencyFormatter(\n                                        maxDecimalDigits:\n                                            NumberUtil.maxDecimalDigits)\n                                  ],\n                                  textInputAction: TextInputAction.next,\n                                  onSubmitted: (text) {\n                                    receiverFocusNode.requestFocus();\n                                  },\n                                ),\n                              ),\n                              _hasFee\n                                  ? FeeContainer(\n                                      feeText:\n                                          walletState.MIN_FEE.toStringOpt())\n                                  : SizedBox(),\n                              ErrorContainer(errorText: _priceErr ?? \"\"),\n                              // Container for receving account field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .receivingAccountTextFieldHeader,\n                                  style: AppStyles.privateKeyTextDark(context),\n                                  maxLines: 1,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.ACCOUNT);\n                                      if (text != null) {\n                                        receiverFocusNode.unfocus();\n                                        receiverController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  secondButton: TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getQRData(\n                                              DataType.ACCOUNT,\n                                              StateContainer.of(context)\n                                                  .curTheme\n                                                  .scannerTheme);\n                                      if (text != null) {\n                                        receiverFocusNode.unfocus();\n                                        receiverController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  inputFormatters: [\n                                    FilteringTextInputFormatter.allow(\n                                        RegExp(\"[0-9-]\")),\n                                    PascalAccountFormatter()\n                                  ],\n                                  onChanged: (text) {\n                                    if (_receiverErr != null) {\n                                      setState(() {\n                                        _receiverErr = null;\n                                      });\n                                    }\n                                  },\n                                  focusNode: receiverFocusNode,\n                                  controller: receiverController,\n                                ),\n                              ),\n                              Container(\n                                margin: EdgeInsetsDirectional.only(bottom: 40),\n                                child: ErrorContainer(\n                                    errorText: _receiverErr ?? \"\"),\n                              ),\n                              // Bottom Margin\n                              SizedBox(height: 24),\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"List for Sale\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).listForSaleButton,\n                      onPressed: () {\n                        if (validateFormData()) {\n                          AppSheets.showBottomSheet(\n                              context: context,\n                              widget: ListingForSaleSheet(\n                                  account: widget.account,\n                                  price: Currency(priceController.text),\n                                  receiver:\n                                      AccountNumber(receiverController.text),\n                                  fee: _hasFee\n                                      ? walletState.MIN_FEE\n                                      : walletState.NO_FEE),\n                              noBlur: true);\n                        }\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  bool validateFormData() {\n    bool isValid = true;\n    // Validate receiver\n    if (receiverController.text.trim().length == 0) {\n      isValid = false;\n      setState(() {\n        _receiverErr = AppLocalization.of(context).invalidReceivingAccountError;\n      });\n    } else {\n      try {\n        AccountNumber(receiverController.text);\n      } catch (e) {\n        isValid = false;\n        setState(() {\n          _receiverErr =\n              AppLocalization.of(context).invalidReceivingAccountError;\n        });\n      }\n    }\n    // Validate price\n    if (priceController.text.trim().length == 0) {\n      isValid = false;\n      setState(() {\n        _priceErr = AppLocalization.of(context).priceRequiredError;\n      });\n    } else {\n      Currency price = Currency(priceController.text);\n      if (price == Currency('0')) {\n        isValid = false;\n        setState(() {\n          _priceErr = AppLocalization.of(context).zeroPriceError;\n        });\n      }\n    }\n    return isValid;\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/list_for_sale/listed_for_sale_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ListedForSaleSheet extends StatefulWidget {\n  final Currency price;\n  final AccountNumber receiver;\n  final Currency fee;\n\n  ListedForSaleSheet(\n      {@required this.price, @required this.receiver, @required this.fee})\n      : super();\n\n  _ListedForSaleSheetState createState() => _ListedForSaleSheetState();\n}\n\nclass _ListedForSaleSheetState extends State<ListedForSaleSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .listedForSaleSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).listedForSaleParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // Price and fee\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                          child: Row(\n                            children: <Widget>[\n                              // Price\n                              Column(\n                                crossAxisAlignment: CrossAxisAlignment.start,\n                                children: <Widget>[\n                                  // \"Price\" header\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 30, 0, 0),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context)\n                                          .priceTextFieldHeader,\n                                      style: AppStyles.textFieldLabelSuccess(\n                                          context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.start,\n                                    ),\n                                  ),\n                                  // Container for the Price\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 12, 0, 0),\n                                    padding: EdgeInsetsDirectional.fromSTEB(\n                                        12, 8, 12, 8),\n                                    decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(12),\n                                      border: Border.all(\n                                          width: 1,\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .success15),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success10,\n                                    ),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(\n                                        children: [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontSuccessBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.price.toStringOpt(),\n                                              style:\n                                                  AppStyles.balanceSmallSuccess(\n                                                      context)),\n                                        ],\n                                      ),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 1,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                              widget.fee != Currency(\"0\")\n                                  ? Column(\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // \"Fee\" header\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 30, 0, 0),\n                                          child: AutoSizeText(\n                                            AppLocalization.of(context)\n                                                .feeTextFieldHeader,\n                                            style:\n                                                AppStyles.textFieldLabelSuccess(\n                                                    context),\n                                            maxLines: 1,\n                                            stepGranularity: 0.1,\n                                            textAlign: TextAlign.start,\n                                          ),\n                                        ),\n                                        // Container for the fee\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 12, 0, 0),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  12, 8, 12, 8),\n                                          decoration: BoxDecoration(\n                                            borderRadius:\n                                                BorderRadius.circular(12),\n                                            border: Border.all(\n                                                width: 1,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .success15),\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .success10,\n                                          ),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                              children: [\n                                                TextSpan(\n                                                  text: \"\",\n                                                  style: AppStyles\n                                                      .iconFontSuccessBalanceSmallPascal(\n                                                          context),\n                                                ),\n                                                TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 8)),\n                                                TextSpan(\n                                                    text: widget.fee\n                                                        .toStringOpt(),\n                                                    style: AppStyles\n                                                        .balanceSmallSuccess(\n                                                            context)),\n                                              ],\n                                            ),\n                                            textAlign: TextAlign.center,\n                                            maxLines: 1,\n                                            minFontSize: 8,\n                                            stepGranularity: 1,\n                                            style: TextStyle(\n                                              fontSize: 14,\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    )\n                                  : SizedBox(),\n                            ],\n                          ),\n                        ),\n                        // \"Receving Account\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .receivingAccountTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.receiver.toString(),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/list_for_sale/listing_for_sale_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/list_for_sale/listed_for_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ListingForSaleSheet extends StatefulWidget {\n  final PascalAccount account;\n  final Currency price;\n  final AccountNumber receiver;\n  final Currency fee;\n\n  ListingForSaleSheet(\n      {@required this.account,\n      @required this.price,\n      @required this.receiver,\n      @required this.fee})\n      : super();\n\n  _ListingForSaleSheetState createState() => _ListingForSaleSheetState();\n}\n\nclass _ListingForSaleSheetState extends State<ListingForSaleSheet> {\n  OverlayEntry _overlay;\n  Account accountState;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.LIST_FORSALE) {\n        doList();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationSale,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .listingForSaleSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).listingForSaleParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      // Price and fee\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                        child: Row(\n                          children: <Widget>[\n                            // Price\n                            Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: <Widget>[\n                                // \"Price\" header\n                                Container(\n                                  constraints: BoxConstraints(\n                                      maxWidth:\n                                          MediaQuery.of(context).size.width -\n                                              76 / 2),\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      0, 30, 0, 0),\n                                  child: AutoSizeText(\n                                    AppLocalization.of(context)\n                                        .priceTextFieldHeader,\n                                    style: AppStyles.textFieldLabel(context),\n                                    maxLines: 1,\n                                    stepGranularity: 0.1,\n                                    textAlign: TextAlign.start,\n                                  ),\n                                ),\n                                // Container for the Price\n                                Container(\n                                  constraints: BoxConstraints(\n                                      maxWidth:\n                                          MediaQuery.of(context).size.width -\n                                              76 / 2),\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      0, 12, 0, 0),\n                                  padding: EdgeInsetsDirectional.fromSTEB(\n                                      12, 8, 12, 8),\n                                  decoration: BoxDecoration(\n                                    borderRadius: BorderRadius.circular(12),\n                                    border: Border.all(\n                                        width: 1,\n                                        color: StateContainer.of(context)\n                                            .curTheme\n                                            .primary15),\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary10,\n                                  ),\n                                  child: AutoSizeText.rich(\n                                    TextSpan(\n                                      children: [\n                                        TextSpan(\n                                          text: \"\",\n                                          style: AppStyles\n                                              .iconFontPrimaryBalanceSmallPascal(\n                                                  context),\n                                        ),\n                                        TextSpan(\n                                            text: \" \",\n                                            style: TextStyle(fontSize: 8)),\n                                        TextSpan(\n                                            text: widget.price.toStringOpt(),\n                                            style: AppStyles.balanceSmall(\n                                                context)),\n                                      ],\n                                    ),\n                                    textAlign: TextAlign.center,\n                                    maxLines: 1,\n                                    minFontSize: 8,\n                                    stepGranularity: 1,\n                                    style: TextStyle(\n                                      fontSize: 14,\n                                    ),\n                                  ),\n                                ),\n                              ],\n                            ),\n                            widget.fee != Currency(\"0\")\n                                ? Column(\n                                    crossAxisAlignment:\n                                        CrossAxisAlignment.start,\n                                    children: <Widget>[\n                                      // \"Fee\" header\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                76 / 2),\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            16, 30, 0, 0),\n                                        child: AutoSizeText(\n                                          AppLocalization.of(context)\n                                              .feeTextFieldHeader,\n                                          style:\n                                              AppStyles.textFieldLabel(context),\n                                          maxLines: 1,\n                                          stepGranularity: 0.1,\n                                          textAlign: TextAlign.start,\n                                        ),\n                                      ),\n                                      // Container for the fee\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                76 / 2),\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            16, 12, 0, 0),\n                                        padding: EdgeInsetsDirectional.fromSTEB(\n                                            12, 8, 12, 8),\n                                        decoration: BoxDecoration(\n                                          borderRadius:\n                                              BorderRadius.circular(12),\n                                          border: Border.all(\n                                              width: 1,\n                                              color: StateContainer.of(context)\n                                                  .curTheme\n                                                  .primary15),\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .primary10,\n                                        ),\n                                        child: AutoSizeText.rich(\n                                          TextSpan(\n                                            children: [\n                                              TextSpan(\n                                                text: \"\",\n                                                style: AppStyles\n                                                    .iconFontPrimaryBalanceSmallPascal(\n                                                        context),\n                                              ),\n                                              TextSpan(\n                                                  text: \" \",\n                                                  style:\n                                                      TextStyle(fontSize: 8)),\n                                              TextSpan(\n                                                  text:\n                                                      widget.fee.toStringOpt(),\n                                                  style: AppStyles.balanceSmall(\n                                                      context)),\n                                            ],\n                                          ),\n                                          textAlign: TextAlign.center,\n                                          maxLines: 1,\n                                          minFontSize: 8,\n                                          stepGranularity: 1,\n                                          style: TextStyle(\n                                            fontSize: 14,\n                                          ),\n                                        ),\n                                      ),\n                                    ],\n                                  )\n                                : SizedBox(),\n                            // Bottom Margin\n                            SizedBox(height: 24),\n                          ],\n                        ),\n                      ),\n                      // \"Receving Account\" header\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context)\n                              .receivingAccountTextFieldHeader,\n                          style: AppStyles.textFieldLabel(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.start,\n                        ),\n                      ),\n                      // Container for the account number\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                        padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(12),\n                          border: Border.all(\n                              width: 1,\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark15),\n                          color: StateContainer.of(context).curTheme.textDark10,\n                        ),\n                        child: AutoSizeText(\n                          widget.receiver.toString(),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          minFontSize: 8,\n                          textAlign: TextAlign.center,\n                          style: AppStyles.privateKeyTextDark(context),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          ,context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton().fire(\n                              AuthenticatedEvent(AUTH_EVENT_TYPE.LIST_FORSALE));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doList({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      RPCResponse result = await accountState\n          .listAccountForSale(widget.price, widget.receiver, fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        try {\n          OperationsResponse resp = result;\n          PascalOperation op = resp.operations[0];\n          if (op.valid == null || op.valid) {\n            // Update state\n            accountState.changeAccountState(AccountState.LISTED);\n            Navigator.of(context).popUntil(RouteUtils.withNameLike(\"/account\"));\n            AppSheets.showBottomSheet(\n                context: context,\n                closeOnTap: true,\n                widget: ListedForSaleSheet(\n                  receiver: widget.receiver,\n                  price: widget.price,\n                  fee: fee,\n                ));\n          } else {\n            if (op.errors.contains(\"zero fee\") &&\n                widget.fee == walletState.NO_FEE) {\n              UIUtil.showFeeDialog(\n                  context: context,\n                  onConfirm: () async {\n                    Navigator.of(context).pop();\n                    doList(fee: walletState.MIN_FEE);\n                  });\n            } else {\n              UIUtil.showSnackbar(\"${op.errors}\", context);\n            }\n          }\n        } catch (e) {\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).somethingWentWrongError, context);\n        }\n      }\n    } catch (e) {\n      _overlay?.remove();\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message = AppLocalization.of(context).authenticateToListForSaleParagraph;\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/private_sale/create_private_sale_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/private_sale/creating_private_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/fee_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/number_util.dart';\nimport 'package:blaise_wallet_flutter/util/pascal_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass CreatePrivateSaleSheet extends StatefulWidget {\n  final PascalAccount account;\n\n  CreatePrivateSaleSheet({@required this.account}) : super();\n\n  _CreatePrivateSaleSheetState createState() => _CreatePrivateSaleSheetState();\n}\n\nclass _CreatePrivateSaleSheetState extends State<CreatePrivateSaleSheet> {\n  FocusNode priceFocusNode;\n  FocusNode receiverFocusNode;\n  FocusNode publicKeyFocusNode;\n  TextEditingController priceController;\n  TextEditingController receiverController;\n  TextEditingController publicKeyController;\n\n  String _priceErr;\n  String _receiverErr;\n  String _publicKeyErr;\n\n  // Fee\n  bool _hasFee;\n\n  @override\n  void initState() {\n    super.initState();\n    this.priceFocusNode = FocusNode();\n    this.receiverFocusNode = FocusNode();\n    this.publicKeyFocusNode = FocusNode();\n    this.priceController = TextEditingController();\n    this.receiverController = TextEditingController();\n    this.publicKeyController = TextEditingController();\n    this._hasFee = walletState.shouldHaveFee();\n    this.receiverController.addListener(() {\n      if (!this.receiverFocusNode.hasFocus) {\n        try {\n          AccountNumber numberFormatted =\n              AccountNumber(this.receiverController.text);\n          this.receiverController.text = numberFormatted.toString();\n        } catch (e) {}\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(\n                              AppLocalization.of(context)\n                                  .creatingPrivateSaleSheetHeader,\n                              context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context)\n                              .creatingPrivateSaleParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for price field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .priceTextFieldHeader,\n                                  style: AppStyles.paragraphPrimary(context),\n                                  maxLines: 1,\n                                  inputType: TextInputType.numberWithOptions(\n                                      decimal: true),\n                                  prefix: Icon(\n                                    AppIcons.pascalsymbol,\n                                    size: 15,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary,\n                                  ),\n                                  focusNode: priceFocusNode,\n                                  controller: priceController,\n                                  onChanged: (text) {\n                                    if (_priceErr != null) {\n                                      setState(() {\n                                        _priceErr = null;\n                                      });\n                                    }\n                                  },\n                                  inputFormatters: [\n                                    LengthLimitingTextInputFormatter(13),\n                                    CurrencyFormatter(\n                                        maxDecimalDigits:\n                                            NumberUtil.maxDecimalDigits)\n                                  ],\n                                  textInputAction: TextInputAction.next,\n                                  onSubmitted: (text) {\n                                    receiverFocusNode.requestFocus();\n                                  },\n                                ),\n                              ),\n                              _hasFee\n                                  ? FeeContainer(\n                                      feeText:\n                                          walletState.MIN_FEE.toStringOpt())\n                                  : SizedBox(),\n                              ErrorContainer(errorText: _priceErr ?? \"\"),\n                              // Container for receving account field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .receivingAccountTextFieldHeader,\n                                  style: AppStyles.privateKeyTextDark(context),\n                                  maxLines: 1,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.ACCOUNT);\n                                      if (text != null) {\n                                        receiverFocusNode.unfocus();\n                                        receiverController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  secondButton: TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getQRData(\n                                              DataType.ACCOUNT,\n                                              StateContainer.of(context)\n                                                  .curTheme\n                                                  .scannerTheme);\n                                      if (text != null) {\n                                        receiverFocusNode.unfocus();\n                                        receiverController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  inputFormatters: [\n                                    FilteringTextInputFormatter.allow(\n                                        RegExp(\"[0-9-]\")),\n                                    PascalAccountFormatter()\n                                  ],\n                                  onChanged: (text) {\n                                    if (_receiverErr != null) {\n                                      setState(() {\n                                        _receiverErr = null;\n                                      });\n                                    }\n                                  },\n                                  focusNode: receiverFocusNode,\n                                  controller: receiverController,\n                                  textInputAction: TextInputAction.next,\n                                  onSubmitted: (text) {\n                                    publicKeyFocusNode.requestFocus();\n                                  },\n                                ),\n                              ),\n                              ErrorContainer(errorText: _receiverErr ?? \"\"),\n                              // Container for public key field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .publicKeyTextFieldHeader,\n                                  style: AppStyles.privateKeyTextDark(context),\n                                  maxLines: 4,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.PUBLIC_KEY);\n                                      if (text != null) {\n                                        publicKeyController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  secondButton: TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.PUBLIC_KEY);\n                                      if (text != null) {\n                                        publicKeyController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  focusNode: publicKeyFocusNode,\n                                  controller: publicKeyController,\n                                  onChanged: (text) {\n                                    if (_publicKeyErr != null) {\n                                      setState(() {\n                                        _publicKeyErr = null;\n                                      });\n                                    }\n                                  },\n                                ),\n                              ),\n                              ErrorContainer(errorText: _publicKeyErr ?? \"\"),\n                              // Bottom Margin\n                              SizedBox(height: 24),\n                              // TODO Implement duration\n                              /*\n                                Row(\n                                  children: <Widget>[\n                                    Container(\n                                      height: 40.0,\n                                      decoration: BoxDecoration(\n                                        borderRadius:\n                                            BorderRadius.circular(100.0),\n                                        color: StateContainer.of(context)\n                                            .curTheme\n                                            .backgroundPrimary,\n                                        boxShadow: [\n                                          StateContainer.of(context)\n                                              .curTheme\n                                              .shadowTextDark,\n                                        ],\n                                      ),\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          30, 30, 30, 40),\n                                      child: FlatButton(\n                                        shape: RoundedRectangleBorder(\n                                            borderRadius:\n                                                BorderRadius.circular(100.0)),\n                                        child: AutoSizeText(\n                                          AppLocalization.of(context).addADurationButton,\n                                          textAlign: TextAlign.center,\n                                          maxLines: 1,\n                                          stepGranularity: 0.1,\n                                          style: AppStyles.buttonMiniBg(context),\n                                        ),\n                                        onPressed: () async {\n                                          return null;\n                                        },\n                                      ),\n                                    ),\n                                  ],\n                                )*/\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"Create Private Sale\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).createPrivateSaleButton,\n                      onPressed: () {\n                        if (validateFormData()) {\n                          AppSheets.showBottomSheet(\n                              context: context,\n                              widget: CreatingPrivateSaleSheet(\n                                  account: widget.account,\n                                  price: Currency(priceController.text),\n                                  receiver:\n                                      AccountNumber(receiverController.text),\n                                  publicKey: publicKeyController.text,\n                                  fee: _hasFee\n                                      ? walletState.MIN_FEE\n                                      : walletState.NO_FEE),\n                              noBlur: true);\n                        }\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  bool validateFormData() {\n    bool isValid = true;\n    // Validate receiver\n    if (receiverController.text.trim().length == 0) {\n      isValid = false;\n      setState(() {\n        _receiverErr = AppLocalization.of(context).invalidReceivingAccountError;\n      });\n    } else {\n      try {\n        AccountNumber(receiverController.text);\n      } catch (e) {\n        isValid = false;\n        setState(() {\n          _receiverErr =\n              AppLocalization.of(context).invalidReceivingAccountError;\n        });\n      }\n    }\n    // Validate price\n    if (priceController.text.trim().length == 0) {\n      isValid = false;\n      setState(() {\n        _priceErr = AppLocalization.of(context).priceRequiredError;\n      });\n    } else {\n      Currency price = Currency(priceController.text);\n      if (price == Currency('0')) {\n        isValid = false;\n        setState(() {\n          _priceErr = AppLocalization.of(context).zeroPriceError;\n        });\n      }\n    }\n    // Validate public key\n    if (PascalUtil().decipherPublicKey(publicKeyController.text) == null) {\n      isValid = false;\n      setState(() {\n        _publicKeyErr = AppLocalization.of(context).invalidPublicKeyError;\n      });\n    }\n    return isValid;\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/private_sale/created_private_sale_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass CreatedPrivateSaleSheet extends StatefulWidget {\n  final Currency price;\n  final AccountNumber receiver;\n  final Currency fee;\n  final String publicKey;\n\n  CreatedPrivateSaleSheet(\n      {@required this.price,\n      @required this.receiver,\n      @required this.publicKey,\n      @required this.fee})\n      : super();\n\n  _CreatedPrivateSaleSheetState createState() =>\n      _CreatedPrivateSaleSheetState();\n}\n\nclass _CreatedPrivateSaleSheetState extends State<CreatedPrivateSaleSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .createdPrivateSaleSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .createdPrivateSaleParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // Container for price header and price\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                          child: Row(\n                            children: <Widget>[\n                              // Price\n                              Column(\n                                crossAxisAlignment: CrossAxisAlignment.start,\n                                children: <Widget>[\n                                  // \"Price\" header\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 30, 0, 0),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context)\n                                          .priceTextFieldHeader,\n                                      style: AppStyles.textFieldLabelSuccess(\n                                          context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.start,\n                                    ),\n                                  ),\n                                  // Container for the Price\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 12, 0, 0),\n                                    padding: EdgeInsetsDirectional.fromSTEB(\n                                        12, 8, 12, 8),\n                                    decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(12),\n                                      border: Border.all(\n                                          width: 1,\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .success15),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success10,\n                                    ),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(\n                                        children: [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontSuccessBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.price.toStringOpt(),\n                                              style:\n                                                  AppStyles.balanceSmallSuccess(\n                                                      context)),\n                                        ],\n                                      ),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 1,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                              widget.fee != Currency(\"0\")\n                                  ? Column(\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // \"Fee\" header\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 30, 0, 0),\n                                          child: AutoSizeText(\n                                            AppLocalization.of(context)\n                                                .feeTextFieldHeader,\n                                            style:\n                                                AppStyles.textFieldLabelSuccess(\n                                                    context),\n                                            maxLines: 1,\n                                            stepGranularity: 0.1,\n                                            textAlign: TextAlign.start,\n                                          ),\n                                        ),\n                                        // Container for the fee\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 12, 0, 0),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  12, 8, 12, 8),\n                                          decoration: BoxDecoration(\n                                            borderRadius:\n                                                BorderRadius.circular(12),\n                                            border: Border.all(\n                                                width: 1,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .success15),\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .success10,\n                                          ),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                              children: [\n                                                TextSpan(\n                                                  text: \"\",\n                                                  style: AppStyles\n                                                      .iconFontSuccessBalanceSmallPascal(\n                                                          context),\n                                                ),\n                                                TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 8)),\n                                                TextSpan(\n                                                    text: widget.fee\n                                                        .toStringOpt(),\n                                                    style: AppStyles\n                                                        .balanceSmallSuccess(\n                                                            context)),\n                                              ],\n                                            ),\n                                            textAlign: TextAlign.center,\n                                            maxLines: 1,\n                                            minFontSize: 8,\n                                            stepGranularity: 1,\n                                            style: TextStyle(\n                                              fontSize: 14,\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    )\n                                  : SizedBox(),\n                            ],\n                          ),\n                        ),\n                        // \"Receving Account\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .receivingAccountTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                          constraints: BoxConstraints(\n                              maxWidth:\n                                  MediaQuery.of(context).size.width / 2 - 36),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.receiver.toString(),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // \"Public Key\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .publicKeyTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the name\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding:\n                              EdgeInsetsDirectional.fromSTEB(24, 12, 24, 12),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.publicKey,\n                            maxLines: 4,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/private_sale/creating_private_sale_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/private_sale/created_private_sale_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/pascal_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass CreatingPrivateSaleSheet extends StatefulWidget {\n  final PascalAccount account;\n  final Currency price;\n  final AccountNumber receiver;\n  final String publicKey;\n  final Currency fee;\n\n  CreatingPrivateSaleSheet(\n      {@required this.account,\n      @required this.price,\n      @required this.receiver,\n      @required this.publicKey,\n      @required this.fee})\n      : super();\n\n  _CreatingPrivateSaleSheetState createState() =>\n      _CreatingPrivateSaleSheetState();\n}\n\nclass _CreatingPrivateSaleSheetState extends State<CreatingPrivateSaleSheet> {\n  OverlayEntry _overlay;\n  Account accountState;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.LIST_FORSALE) {\n        doList();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationSale,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .creatingPrivateSaleSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .creatingPrivateSaleParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 2,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // Container for price header and price\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                          child: Row(\n                            children: <Widget>[\n                              // Price\n                              Column(\n                                crossAxisAlignment: CrossAxisAlignment.start,\n                                children: <Widget>[\n                                  // \"Price\" header\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 30, 0, 0),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context)\n                                          .priceTextFieldHeader,\n                                      style: AppStyles.textFieldLabel(context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.start,\n                                    ),\n                                  ),\n                                  // Container for the Price\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 12, 0, 0),\n                                    padding: EdgeInsetsDirectional.fromSTEB(\n                                        12, 8, 12, 8),\n                                    decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(12),\n                                      border: Border.all(\n                                          width: 1,\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .primary15),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .primary10,\n                                    ),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(\n                                        children: [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontPrimaryBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.price.toStringOpt(),\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                        ],\n                                      ),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 1,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                              widget.fee != Currency(\"0\")\n                                  ? Column(\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // \"Fee\" header\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 30, 0, 0),\n                                          child: AutoSizeText(\n                                            AppLocalization.of(context)\n                                                .feeTextFieldHeader,\n                                            style: AppStyles.textFieldLabel(\n                                                context),\n                                            maxLines: 1,\n                                            stepGranularity: 0.1,\n                                            textAlign: TextAlign.start,\n                                          ),\n                                        ),\n                                        // Container for the fee\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 12, 0, 0),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  12, 8, 12, 8),\n                                          decoration: BoxDecoration(\n                                            borderRadius:\n                                                BorderRadius.circular(12),\n                                            border: Border.all(\n                                                width: 1,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .primary15),\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .primary10,\n                                          ),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                              children: [\n                                                TextSpan(\n                                                  text: \"\",\n                                                  style: AppStyles\n                                                      .iconFontPrimaryBalanceSmallPascal(\n                                                          context),\n                                                ),\n                                                TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 8)),\n                                                TextSpan(\n                                                    text: widget.fee\n                                                        .toStringOpt(),\n                                                    style:\n                                                        AppStyles.balanceSmall(\n                                                            context)),\n                                              ],\n                                            ),\n                                            textAlign: TextAlign.center,\n                                            maxLines: 1,\n                                            minFontSize: 8,\n                                            stepGranularity: 1,\n                                            style: TextStyle(\n                                              fontSize: 14,\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    )\n                                  : SizedBox(),\n                            ],\n                          ),\n                        ),\n                        // \"Receving Account\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .receivingAccountTextFieldHeader,\n                            style: AppStyles.textFieldLabel(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                          constraints: BoxConstraints(\n                              maxWidth:\n                                  MediaQuery.of(context).size.width / 2 - 36),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.receiver.toString(),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // \"Public Key\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .publicKeyTextFieldHeader,\n                            style: AppStyles.textFieldLabel(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the name\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding:\n                              EdgeInsetsDirectional.fromSTEB(24, 12, 24, 12),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.publicKey,\n                            maxLines: 4,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          ,context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton().fire(\n                              AuthenticatedEvent(AUTH_EVENT_TYPE.LIST_FORSALE));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doList({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      RPCResponse result = await accountState.listAccountForSale(\n          widget.price, widget.receiver,\n          newPubKey: PascalUtil().decipherPublicKey(widget.publicKey),\n          fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        try {\n          OperationsResponse resp = result;\n          PascalOperation op = resp.operations[0];\n          if (op.valid == null || op.valid) {\n            // Update state\n            accountState.changeAccountState(AccountState.LISTED);\n            Navigator.of(context).popUntil(RouteUtils.withNameLike(\"/account\"));\n            AppSheets.showBottomSheet(\n                context: context,\n                closeOnTap: true,\n                widget: CreatedPrivateSaleSheet(\n                  receiver: widget.receiver,\n                  price: widget.price,\n                  publicKey: widget.publicKey,\n                  fee: fee,\n                ));\n          } else {\n            if (op.errors.contains(\"zero fee\") &&\n                widget.fee == walletState.NO_FEE) {\n              UIUtil.showFeeDialog(\n                  context: context,\n                  onConfirm: () async {\n                    Navigator.of(context).pop();\n                    doList(fee: walletState.MIN_FEE);\n                  });\n            } else {\n              UIUtil.showSnackbar(\"${op.errors}\", context);\n            }\n          }\n        } catch (e) {\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).somethingWentWrongError, context);\n        }\n      }\n    } catch (e) {\n      _overlay?.remove();\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message =\n        AppLocalization.of(context).authenticateToCreatePrivateSaleParagraph;\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/transfer_account/transfer_account_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/transfer_account/transferring_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/fee_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass TransferAccountSheet extends StatefulWidget {\n  final PascalAccount account;\n\n  TransferAccountSheet({@required this.account});\n\n  _TransferAccountSheetState createState() => _TransferAccountSheetState();\n}\n\nclass _TransferAccountSheetState extends State<TransferAccountSheet> {\n  FocusNode publicKeyFocusNode;\n  TextEditingController publicKeyController;\n  Account accountState;\n  String pubkeyError;\n\n  // Fee\n  bool _hasFee;\n\n  @override\n  void initState() {\n    super.initState();\n    publicKeyFocusNode = FocusNode();\n    publicKeyController = TextEditingController();\n    this.accountState = walletState.getAccountState(widget.account);\n    _hasFee = walletState.shouldHaveFee();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .transferSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).transferParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for the public key text field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .publicKeyTextFieldHeader,\n                                  style: AppStyles.privateKeyTextDark(context),\n                                  maxLines: 4,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.PUBLIC_KEY);\n                                      if (text != null) {\n                                        publicKeyController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  secondButton: TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getQRData(\n                                              DataType.PUBLIC_KEY,\n                                              StateContainer.of(context).curTheme.scannerTheme);\n                                      if (text != null) {\n                                        publicKeyController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  focusNode: publicKeyFocusNode,\n                                  controller: publicKeyController,\n                                  onChanged: (nt) {\n                                    if (pubkeyError != null) {\n                                      setState(() {\n                                        pubkeyError = null;\n                                      });\n                                    }\n                                  },\n                                ),\n                              ),\n                              // Fee container\n                              _hasFee\n                                  ? FeeContainer(\n                                      feeText:\n                                          walletState.MIN_FEE.toStringOpt())\n                                  : SizedBox(),\n                              // Error Text\n                              ErrorContainer(\n                                errorText:\n                                    pubkeyError == null ? \"\" : pubkeyError,\n                              ),\n                              // Bottom Margin\n                              SizedBox(height: 24),\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"Transfer\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).transferButton,\n                      onPressed: () {\n                        validateAndTransfer();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  void validateAndTransfer() {\n    // Validate pubkey\n    // First try base58, then hex\n    try {\n      PublicKeyCoder().decodeFromBase58(publicKeyController.text);\n    } catch (e) {\n      try {\n        PublicKeyCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(publicKeyController.text));\n      } catch (e) {\n        setState(() {\n          pubkeyError = AppLocalization.of(context).invalidPublicKeyError;\n        });\n        return;\n      }\n    }\n    AppSheets.showBottomSheet(\n        context: context,\n        widget: TransferringAccountSheet(\n            account: widget.account,\n            publicKeyDisplay: publicKeyController.text,\n            fee: _hasFee ? walletState.MIN_FEE : walletState.NO_FEE),\n        noBlur: true);\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/transfer_account/transferred_account_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass TransferredAccountSheet extends StatefulWidget {\n  final String newAccountPubkey;\n  final Currency fee;\n\n  TransferredAccountSheet(\n      {@required this.newAccountPubkey, @required this.fee});\n\n  _TransferredAccountSheetState createState() =>\n      _TransferredAccountSheetState();\n}\n\nclass _TransferredAccountSheetState extends State<TransferredAccountSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .transferredSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).transferredParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // \"Address\" header\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .publicKeyTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the public key\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding:\n                              EdgeInsetsDirectional.fromSTEB(24, 12, 24, 12),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: AutoSizeText(\n                            widget.newAccountPubkey,\n                            maxLines: 4,\n                            stepGranularity: 0.1,\n                            minFontSize: 8,\n                            textAlign: TextAlign.center,\n                            style: AppStyles.privateKeyTextDark(context),\n                          ),\n                        ),\n                        // \"Fee\" header\n                        widget.fee != Currency('0')\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  AppLocalization.of(context)\n                                      .feeTextFieldHeader,\n                                  style:\n                                      AppStyles.textFieldLabelSuccess(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            : SizedBox(),\n                        // Container for the fee\n                        widget.fee != Currency(\"0\")\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success15),\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .success10,\n                                ),\n                                child: AutoSizeText.rich(\n                                  TextSpan(\n                                    children: [\n                                      TextSpan(\n                                        text: \"\",\n                                        style: AppStyles\n                                            .iconFontSuccessBalanceSmallPascal(\n                                                context),\n                                      ),\n                                      TextSpan(\n                                          text: \" \",\n                                          style: TextStyle(fontSize: 8)),\n                                      TextSpan(\n                                          text: widget.fee.toStringOpt(),\n                                          style: AppStyles.balanceSmallSuccess(\n                                              context)),\n                                    ],\n                                  ),\n                                  textAlign: TextAlign.center,\n                                  maxLines: 1,\n                                  minFontSize: 8,\n                                  stepGranularity: 1,\n                                  style: TextStyle(\n                                    fontSize: 14,\n                                  ),\n                                ),\n                              )\n                            : SizedBox(),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/other_operations/transfer_account/transferring_account_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/authenticated_event.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/other_operations/transfer_account/transferred_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass TransferringAccountSheet extends StatefulWidget {\n  final String publicKeyDisplay;\n  final PascalAccount account;\n  final Currency fee;\n\n  TransferringAccountSheet(\n      {@required this.publicKeyDisplay,\n      @required this.account,\n      @required this.fee});\n\n  _TransferringAccountSheetState createState() =>\n      _TransferringAccountSheetState();\n}\n\nclass _TransferringAccountSheetState extends State<TransferringAccountSheet> {\n  Account accountState;\n  OverlayEntry _overlay;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.TRANSFER) {\n        doTransfer();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this.accountState = walletState.getAccountState(widget.account);\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationTransfer,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .transferringSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).transferringParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      // \"Public Key\" header\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).publicKeyTextFieldHeader,\n                          style: AppStyles.textFieldLabel(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.start,\n                        ),\n                      ),\n                      // Container for the public key\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                        padding: EdgeInsetsDirectional.fromSTEB(24, 12, 24, 12),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(12),\n                          border: Border.all(\n                              width: 1,\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark15),\n                          color: StateContainer.of(context).curTheme.textDark10,\n                        ),\n                        child: AutoSizeText(\n                          widget.publicKeyDisplay,\n                          maxLines: 4,\n                          stepGranularity: 0.1,\n                          minFontSize: 8,\n                          textAlign: TextAlign.center,\n                          style: AppStyles.privateKeyTextDark(context),\n                        ),\n                      ),\n                      // \"Fee\" header\n                      widget.fee != Currency('0')\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                              child: AutoSizeText(\n                                AppLocalization.of(context).feeTextFieldHeader,\n                                style: AppStyles.textFieldLabel(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.start,\n                              ),\n                            )\n                          : SizedBox(),\n                      // Container for the fee\n                      widget.fee != Currency(\"0\")\n                          ? Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                              padding:\n                                  EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                              decoration: BoxDecoration(\n                                borderRadius: BorderRadius.circular(12),\n                                border: Border.all(\n                                    width: 1,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .primary15),\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .primary10,\n                              ),\n                              child: AutoSizeText.rich(\n                                TextSpan(\n                                  children: [\n                                    TextSpan(\n                                      text: \"\",\n                                      style: AppStyles\n                                          .iconFontPrimaryBalanceSmallPascal(\n                                              context),\n                                    ),\n                                    TextSpan(\n                                        text: \" \",\n                                        style: TextStyle(fontSize: 8)),\n                                    TextSpan(\n                                        text: widget.fee.toStringOpt(),\n                                        style: AppStyles.balanceSmall(context)),\n                                  ],\n                                ),\n                                textAlign: TextAlign.center,\n                                maxLines: 1,\n                                minFontSize: 8,\n                                stepGranularity: 1,\n                                style: TextStyle(\n                                  fontSize: 14,\n                                ),\n                              ),\n                            )\n                          : SizedBox(),\n                      // Bottom Margin\n                      SizedBox(height: 24),\n                    ],\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          , context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton().fire(\n                              AuthenticatedEvent(AUTH_EVENT_TYPE.TRANSFER));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doTransfer({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      RPCResponse result =\n          await accountState.transferAccount(widget.publicKeyDisplay, fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        try {\n          OperationsResponse resp = result;\n          PascalOperation op = resp.operations[0];\n          if (op.valid == null || op.valid) {\n            // Remove all traces of this account\n            walletState.removeAccount(widget.account);\n            Navigator.of(context)\n                .popUntil(RouteUtils.withNameLike(\"/overview\"));\n            AppSheets.showBottomSheet(\n                context: context,\n                closeOnTap: true,\n                widget: TransferredAccountSheet(\n                  newAccountPubkey: widget.publicKeyDisplay,\n                  fee: fee,\n                ));\n          } else {\n            if (op.errors.contains(\"zero fee\") &&\n                widget.fee == walletState.NO_FEE) {\n              UIUtil.showFeeDialog(\n                  context: context,\n                  onConfirm: () async {\n                    Navigator.of(context).pop();\n                    doTransfer(fee: walletState.MIN_FEE);\n                  });\n            } else {\n              UIUtil.showSnackbar(\"${op.errors}\", context);\n            }\n          }\n        } catch (e) {\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).somethingWentWrongError, context);\n        }\n      }\n    } catch (e) {\n      _overlay?.remove();\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message =\n        AppLocalization.of(context).authenticateToTransferParagraph;\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/receive/receive_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/account/receive/request_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:qr/qr.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:quiver/strings.dart';\n\nclass ReceiveSheet extends StatefulWidget {\n  final String accountName;\n  final AccountNumber accountNumber;\n  ReceiveSheet({this.accountName, this.accountNumber});\n\n  _ReceiveSheetState createState() => _ReceiveSheetState();\n}\n\nclass _ReceiveSheetState extends State<ReceiveSheet> {\n  bool _addressCopied;\n  Timer _addressCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    _addressCopied = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: <Widget>[\n        Container(\n          decoration: BoxDecoration(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            borderRadius: BorderRadius.only(\n              topLeft: Radius.circular(12),\n              topRight: Radius.circular(12),\n            ),\n          ),\n          child: Column(\n            children: <Widget>[\n              // Sheet header\n              Container(\n                height: 60,\n                width: double.maxFinite,\n                decoration: BoxDecoration(\n                  gradient: StateContainer.of(context).curTheme.gradientPrimary,\n                  borderRadius: BorderRadius.only(\n                    topLeft: Radius.circular(12),\n                    topRight: Radius.circular(12),\n                  ),\n                ),\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                  children: <Widget>[\n                    SizedBox(width: 65, height: 50),\n                    // Header\n                    Container(\n                      width: MediaQuery.of(context).size.width - 130,\n                      alignment: Alignment(0, 0),\n                      child: Column(\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: <Widget>[\n                          Container(\n                            child: isEmpty(widget.accountName)\n                                ? SizedBox()\n                                : Container(\n                                    margin: EdgeInsets.only(bottom: 2),\n                                    width:\n                                        MediaQuery.of(context).size.width - 130,\n                                    child: AutoSizeText(\n                                      widget.accountName,\n                                      style: AppStyles.accountCardName(context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      minFontSize: 8,\n                                      textAlign: TextAlign.center,\n                                    ),\n                                  ),\n                          ),\n                          Container(\n                            width: MediaQuery.of(context).size.width - 130,\n                            child: AutoSizeText(\n                              widget.accountNumber.toString(),\n                              style: AppStyles.accountCardAddress(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                              minFontSize: 8,\n                              textAlign: TextAlign.center,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                    // Share Button is removed for beta\n                    /*Container(\n                      margin: EdgeInsetsDirectional.only(start: 10, end: 5),\n                      height: 50,\n                      width: 50,\n                      child: FlatButton(\n                          highlightColor:\n                              StateContainer.of(context).curTheme.textLight15,\n                          splashColor:\n                              StateContainer.of(context).curTheme.textLight30,\n                          onPressed: () {\n                            return null;\n                          },\n                          shape: RoundedRectangleBorder(\n                              borderRadius: BorderRadius.circular(50.0)),\n                          padding: EdgeInsets.all(0.0),\n                          child: Icon(AppIcons.shareaddress,\n                              color:\n                                  StateContainer.of(context).curTheme.textLight,\n                              size: 22)),\n                    ),*/\n                    SizedBox(width: 65, height: 50),\n                  ],\n                ),\n              ),\n              // QR Code\n              Container(\n                margin: EdgeInsetsDirectional.only(top: 30, bottom: 10),\n                child: Stack(\n                  alignment: Alignment(0, 0),\n                  children: <Widget>[\n                    // Gradient\n                    Container(\n                      width: 180,\n                      height: 180,\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(12),\n                        gradient:\n                            StateContainer.of(context).curTheme.gradientPrimary,\n                      ),\n                    ),\n                    // White overlay\n                    Container(\n                      width: 172,\n                      height: 172,\n                      decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(8),\n                          color: Colors.white),\n                    ),\n                    // QR Code\n                    QrImage(\n                      data: widget.accountNumber.toString(),\n                      size: 180.0,\n                      errorCorrectionLevel: QrErrorCorrectLevel.Q,\n                      version: 4,\n                      gapless: false,\n                    ),\n                    // Logo background\n                    Container(\n                      width: 58,\n                      height: 58,\n                      decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(16),\n                          color: Colors.white),\n                    ),\n                    // Logo\n                    Container(\n                      width: 48,\n                      height: 48,\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(12),\n                        gradient:\n                            StateContainer.of(context).curTheme.gradientPrimary,\n                      ),\n                      child: Icon(AppIcons.pascalsymbol,\n                          color: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary,\n                          size: 30),\n                    ),\n                  ],\n                ),\n              ),\n              //\"Copy Address\" and \"Request Amount\" buttons\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: _addressCopied\n                        ? AppButtonType.Success\n                        : AppButtonType.Primary,\n                    text: _addressCopied\n                        ? AppLocalization.of(context).copiedAddressButton\n                        : AppLocalization.of(context).copyAddressButton,\n                    onPressed: () {\n                      Clipboard.setData(\n                          ClipboardData(text: widget.accountNumber.toString()));\n                      setState(() {\n                        _addressCopied = true;\n                      });\n                      if (_addressCopiedTimer != null) {\n                        _addressCopiedTimer.cancel();\n                      }\n                      _addressCopiedTimer =\n                          Timer(const Duration(milliseconds: 1500), () {\n                        if (mounted) {\n                          setState(() {\n                            _addressCopied = false;\n                          });\n                        }\n                      });\n                    },\n                  ),\n                ],\n              ),\n              // \"Request\" button\n              /*Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.PrimaryOutline,\n                    text: AppLocalization.of(context).requestButton,\n                    onPressed: () {\n                        Navigator.of(context).pop();\n                        AppSheets.showBottomSheet(\n                            context: context,\n                            widget: RequestSheet(address: widget.accountNumber.toString()));\n                      },\n                  ),\n                ],\n              ),*/\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/receive/request_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:qr/qr.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\n\nclass RequestSheet extends StatefulWidget {\n  final String address;\n  RequestSheet({this.address});\n  _RequestSheetState createState() => _RequestSheetState();\n}\n\nclass _RequestSheetState extends State<RequestSheet> {\n  FocusNode amountFocusNode;\n  TextEditingController amountController;\n  FocusNode payloadFocusNode;\n  TextEditingController payloadController;\n  String amount = '';\n  String payload = '';\n\n  @override\n  void initState() {\n    super.initState();\n    this.amountFocusNode = FocusNode();\n    this.payloadFocusNode = FocusNode();\n    this.amountController = TextEditingController();\n    this.payloadController = TextEditingController();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: <Widget>[\n          Expanded(\n            child: Container(\n              decoration: BoxDecoration(\n                color: StateContainer.of(context).curTheme.backgroundPrimary,\n                borderRadius: BorderRadius.only(\n                  topLeft: Radius.circular(12),\n                  topRight: Radius.circular(12),\n                ),\n              ),\n              child: Column(\n                children: <Widget>[\n                  // Sheet header\n                  Container(\n                    height: 60,\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                    ),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: <Widget>[\n                        // SizedBox\n                        SizedBox(width: 65, height: 50),\n                        // Header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 130,\n                          alignment: Alignment(0, 0),\n                          child: AutoSizeText(\n                            toUppercase(AppLocalization.of(context)\n                                .requestSheetHeader\n                                ,context),\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                        // SizedBox\n                        SizedBox(width: 65, height: 50),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: KeyboardAvoider(\n                      duration: Duration(milliseconds: 0),\n                      autoScroll: true,\n                      focusPadding: 40,\n                      child: Column(\n                        children: <Widget>[\n                          // QR Code\n                          Container(\n                            margin: EdgeInsetsDirectional.only(top: 30),\n                            child: Stack(\n                              alignment: Alignment(0, 0),\n                              children: <Widget>[\n                                // Gradient\n                                Container(\n                                  width: 180,\n                                  height: 180,\n                                  decoration: BoxDecoration(\n                                    borderRadius: BorderRadius.circular(12),\n                                    gradient: StateContainer.of(context)\n                                        .curTheme\n                                        .gradientPrimary,\n                                  ),\n                                ),\n                                // White overlay\n                                Container(\n                                  width: 172,\n                                  height: 172,\n                                  decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(8),\n                                      color: Colors.white),\n                                ),\n                                // QR Code\n                                QrImage(\n                                  data: \"Address=\" +\n                                      widget.address +\n                                      \" / Amount=\" +\n                                      amount.toString() +\n                                      \" / Payload=\" +\n                                      payload,\n                                  size: 180.0,\n                                  version: 6,\n                                  errorCorrectionLevel: QrErrorCorrectLevel.Q,\n                                  gapless: false,\n                                ),\n                                // Logo background\n                                Container(\n                                  width: 58,\n                                  height: 58,\n                                  decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(16),\n                                      color: Colors.white),\n                                ),\n                                // Logo\n                                Container(\n                                  width: 48,\n                                  height: 48,\n                                  decoration: BoxDecoration(\n                                    borderRadius: BorderRadius.circular(12),\n                                    gradient: StateContainer.of(context)\n                                        .curTheme\n                                        .gradientPrimary,\n                                  ),\n                                  child: Icon(AppIcons.pascalsymbol,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .backgroundPrimary,\n                                      size: 30),\n                                ),\n                              ],\n                            ),\n                          ),\n                          // Container for the amount text field\n                          Container(\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                            child: AppTextField(\n                              onChanged: (String newText) {\n                                setState(() {\n                                  amount = newText;\n                                });\n                              },\n                              focusNode: amountFocusNode,\n                              controller: amountController,\n                              label: AppLocalization.of(context)\n                                  .amountTextFieldHeader,\n                              style: AppStyles.paragraphPrimary(context),\n                              maxLines: 1,\n                              inputType: TextInputType.numberWithOptions(\n                                  decimal: true),\n                              prefix: Icon(\n                                AppIcons.pascalsymbol,\n                                size: 15,\n                                color:\n                                    StateContainer.of(context).curTheme.primary,\n                              ),\n                              firstButton: TextFieldButton(icon: AppIcons.max),\n                              secondButton: TextFieldButton(\n                                  icon: AppIcons.currencyswitch),\n                              textInputAction: TextInputAction.next,\n                              onSubmitted: (text) {\n                                payloadFocusNode.requestFocus();\n                              },\n                            ),\n                          ),\n                          // Container for the payload text field\n                          Container(\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 30, 30, 40),\n                            child: AppTextField(\n                              onChanged: (String newText) {\n                                setState(() {\n                                  payload = newText;\n                                });\n                              },\n                              focusNode: payloadFocusNode,\n                              controller: payloadController,\n                              label: AppLocalization.of(context)\n                                  .payloadTextFieldHeader,\n                              style: AppStyles.paragraphMedium(context),\n                              maxLines: 1,\n                              firstButton:\n                                  TextFieldButton(icon: AppIcons.paste),\n                              secondButton:\n                                  TextFieldButton(icon: AppIcons.scan),\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                  // \"Close\" button\n                  Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.PrimaryOutline,\n                        text: AppLocalization.of(context).closeButton,\n                        onPressed: () {\n                          Navigator.of(context).pop();\n                        },\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/send/send_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/send/sending_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/fee_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/payload.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/number_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:intl/intl.dart';\nimport 'package:decimal/decimal.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass SendSheet extends StatefulWidget {\n  final PascalAccount account;\n  final Contact contact;\n  final bool fromOverview;\n  final AvailableCurrency localCurrency;\n\n  SendSheet({@required this.account, @required this.localCurrency, this.contact, this.fromOverview = false});\n\n  _SendSheetState createState() => _SendSheetState();\n}\n\nclass _SendSheetState extends State<SendSheet> {\n  String addressControllerText = \"\";\n  TextEditingController addressController;\n  TextEditingController amountController;\n  FocusNode addressFocusNode;\n  FocusNode amountFocusNode;\n\n  // Local currency mode/fiat conversion\n  bool _localCurrencyMode = false;\n  String _lastLocalCurrencyAmount = \"\";\n  String _lastCryptoAmount = \"\";\n  NumberFormat _localCurrencyFormat;\n\n  // Errors\n  String destinationError;\n  String amountError;\n\n  // Payload\n  String _payload;\n  bool _encryptedPayload;\n\n  // Fee\n  bool _hasFee;\n\n  // Contacts list\n  List<Contact> _contacts;\n  bool _isValidContactAndUnfocused;\n\n  // Account name list\n  PascalAccount _selectedAccountName;\n  List<PascalAccount> _accountNames;\n  List<PascalAccount> _accountNamesUnfocused;\n  bool _accountNamesLoading;\n\n  // Account State\n  Account accountState;\n\n  // Switch to Contacts field\n  bool _isDestinationFieldTypeContact;\n  String _lastContactFieldValue = \"\";\n  String _lastNameFieldValue = \"\";\n\n  bool isDigit(String s, int idx) => (s.codeUnitAt(idx) ^ 0x30) <= 9;\n\n  @override\n  void initState() {\n    super.initState();\n    this.addressController = TextEditingController();\n    this.addressController.addListener(() {\n      if (mounted) {\n        setState(() {\n          addressControllerText = addressController.text;\n        });\n      }\n    });\n    this.amountController = TextEditingController();\n    this.addressFocusNode = FocusNode();\n    this.amountFocusNode = FocusNode();\n    this._payload = \"\";\n    this._hasFee = walletState.shouldHaveFee();\n    this._isValidContactAndUnfocused = false;\n    this._isDestinationFieldTypeContact = false;\n    this._contacts = [];\n    this._accountNames = [];\n    this._accountNamesUnfocused = [];\n    this._accountNamesLoading = false;\n    this._encryptedPayload = false;\n    this.accountState = walletState.getAccountState(widget.account);\n    _localCurrencyFormat =\n        NumberFormat.currency(locale: widget.localCurrency.getLocale().toString(), symbol: widget.localCurrency.getCurrencySymbol());\n    this.addressFocusNode.addListener(() {\n      if (!this.addressFocusNode.hasFocus) {\n        // When unfocused, add checksum to account if applicable\n        if (this.addressController.text.length > 0 && isDigit(this.addressController.text, 0)) {\n          try {\n            AccountNumber numberFormatted =\n                AccountNumber(this.addressController.text);\n            this.addressController.text = numberFormatted.toString();\n          } catch (e) {}\n        }\n        // Reset contacts list and check if contact is valid\n        if (_isDestinationFieldTypeContact) {\n          if (mounted) {\n            setState(() {\n              _contacts = [];\n            });\n          }\n          sl\n              .get<DBHelper>()\n              .getContactWithName(this.addressController.text)\n              .then((contact) {\n            if (contact != null && mounted) {\n              this.addressController.text =\n                  this.addressController.text;\n              setState(() {\n                _isValidContactAndUnfocused = true;\n                _payload = contact.payload;\n                _encryptedPayload = false;\n              });\n              EventTaxiImpl.singleton()\n                  .fire(PayloadChangedEvent(payload: contact.payload));\n            }\n          });\n        } else {\n          // Hide the account name list\n          if (_accountNames.isNotEmpty) {\n            setState(() {\n              _accountNames = [];\n            });\n          }\n          // Change text for selected account name\n          if (_selectedAccountName != null) {\n            addressController.text = \"${_selectedAccountName.name.toString()} (${_selectedAccountName.account.toString()})\";\n          }\n        }\n      } else {\n        // When focused\n        if (this._isValidContactAndUnfocused) {\n          setState(() {\n            _isValidContactAndUnfocused = false;\n          });\n        }\n        if (this.addressController.text.length == 0 && _isDestinationFieldTypeContact) {\n          // Show contacts list\n          sl.get<DBHelper>().getContacts().then((contacts) {\n            if (mounted) {\n              setState(() {\n                _contacts = contacts;\n              });\n            }\n          });\n        } else if (_isDestinationFieldTypeContact) {\n          sl\n              .get<DBHelper>()\n              .getContactsWithNameLike(this.addressController.text)\n              .then((contacts) {\n            if (mounted) {\n              setState(() {\n                _contacts = contacts;\n              });\n            }\n          });\n        } else {\n          // Show account names list\n          if (_accountNamesUnfocused.isNotEmpty) {\n            setState(() {\n              _accountNames = _accountNamesUnfocused;\n            });\n          }\n          // Change text for selected account name\n          if (_selectedAccountName != null) {\n            addressController.text =_selectedAccountName.name.toString();\n            addressController.selection = TextSelection.fromPosition(\n                                            TextPosition(offset: addressController.text.length));\n          }\n        }\n      }\n    });\n    // Initial contact information\n    if (widget.contact != null) {\n      this.addressController.text = widget.contact.name.toString();\n      this._payload = widget.contact.payload;\n      this._isValidContactAndUnfocused = true;\n      this._isDestinationFieldTypeContact = true;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n      child: Column(\n        children: <Widget>[\n          Expanded(\n            // Stack for everything else & account search button\n            child: Stack(\n              alignment: Alignment.bottomCenter,\n              children: <Widget>[\n                Container(\n                  decoration: BoxDecoration(\n                    color:\n                        StateContainer.of(context).curTheme.backgroundPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Column(\n                    children: <Widget>[\n                      // Sheet header\n                      Container(\n                        height: 60,\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                          borderRadius: BorderRadius.only(\n                            topLeft: Radius.circular(12),\n                            topRight: Radius.circular(12),\n                          ),\n                        ),\n                        child: Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Close Button\n                            Container(\n                              margin:\n                                  EdgeInsetsDirectional.only(start: 5, end: 10),\n                              height: 50,\n                              width: 50,\n                              child: FlatButton(\n                                  highlightColor: StateContainer.of(context)\n                                      .curTheme\n                                      .textLight15,\n                                  splashColor: StateContainer.of(context)\n                                      .curTheme\n                                      .textLight30,\n                                  onPressed: () {\n                                    Navigator.of(context).pop();\n                                  },\n                                  shape: RoundedRectangleBorder(\n                                      borderRadius:\n                                          BorderRadius.circular(50.0)),\n                                  padding: EdgeInsets.all(0.0),\n                                  child: Icon(AppIcons.close,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .textLight,\n                                      size: 20)),\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .sendSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                      ),\n                      Expanded(\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: <Widget>[\n                            Container(\n                              margin: EdgeInsetsDirectional.fromSTEB(\n                                  30, 16, 30, 20),\n                              child: Row(\n                                mainAxisAlignment:\n                                    MainAxisAlignment.spaceBetween,\n                                crossAxisAlignment: CrossAxisAlignment.center,\n                                children: <Widget>[\n                                  Column(\n                                    crossAxisAlignment:\n                                        CrossAxisAlignment.start,\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    children: <Widget>[\n                                      // Account name\n                                      isEmpty(widget.account.name.toString())\n                                          ? SizedBox()\n                                          : Container(\n                                              constraints: BoxConstraints(\n                                                  maxWidth:\n                                                      MediaQuery.of(context)\n                                                                  .size\n                                                                  .width /\n                                                              2 -\n                                                          45),\n                                              child: AutoSizeText(\n                                                widget.account.name.toString(),\n                                                style: AppStyles\n                                                    .settingsItemHeader(\n                                                        context),\n                                                maxLines: 1,\n                                                minFontSize: 8,\n                                                stepGranularity: 0.1,\n                                              ),\n                                            ),\n                                      // Acccount address\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                        .size\n                                                        .width /\n                                                    2 -\n                                                45),\n                                        margin:\n                                            EdgeInsetsDirectional.only(top: 2),\n                                        child: AutoSizeText(\n                                          widget.account.account.toString(),\n                                          style: AppStyles.monoTextDarkSmall400(\n                                              context),\n                                          maxLines: 1,\n                                          minFontSize: 8,\n                                          stepGranularity: 0.1,\n                                        ),\n                                      ),\n                                    ],\n                                  ),\n                                  Column(\n                                    crossAxisAlignment: CrossAxisAlignment.end,\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    children: <Widget>[\n                                      // Account balance\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                        .size\n                                                        .width /\n                                                    2 -\n                                                45),\n                                        child: AutoSizeText.rich(\n                                          TextSpan(\n                                            children: [\n                                              TextSpan(\n                                                text: \"\",\n                                                style: AppStyles\n                                                    .iconFontPrimaryBalanceSmallPascal(\n                                                        context),\n                                              ),\n                                              TextSpan(\n                                                  text: \" \",\n                                                  style:\n                                                      TextStyle(fontSize: 7)),\n                                              TextSpan(\n                                                  text: widget.account.balance\n                                                      .toStringOpt(),\n                                                  style: AppStyles.balanceSmall(\n                                                      context)),\n                                            ],\n                                          ),\n                                          textAlign: TextAlign.end,\n                                          maxLines: 1,\n                                          minFontSize: 8,\n                                          stepGranularity: 0.1,\n                                          style: TextStyle(\n                                            fontSize: 14,\n                                          ),\n                                        ),\n                                      ),\n                                      // Balance in fiat\n                                      Observer(\n                                        builder: (BuildContext context) {\n                                          if (walletState.localCurrencyPrice !=\n                                              null) {\n                                            return Container(\n                                              constraints: BoxConstraints(\n                                                  maxWidth:\n                                                      MediaQuery.of(context)\n                                                                  .size\n                                                                  .width /\n                                                              2 -\n                                                          45),\n                                              margin:\n                                                  EdgeInsetsDirectional.only(\n                                                      top: 2),\n                                              child: AutoSizeText(\n                                                \"(${walletState.getLocalCurrencyDisplay(currency: StateContainer.of(context).curCurrency, amount: accountState.accountBalance)})\",\n                                                style: AppStyles\n                                                    .primarySmallest400(\n                                                        context),\n                                                maxLines: 1,\n                                                minFontSize: 8,\n                                                stepGranularity: 0.1,\n                                                textAlign: TextAlign.end,\n                                              ),\n                                            );\n                                          }\n                                          return SizedBox();\n                                        },\n                                      )\n                                    ],\n                                  ),\n                                ],\n                              ),\n                            ),\n                            Expanded(\n                              child: KeyboardAvoider(\n                                duration: Duration(milliseconds: 0),\n                                autoScroll: true,\n                                focusPadding: 40,\n                                child: Column(\n                                  crossAxisAlignment: CrossAxisAlignment.start,\n                                  children: <Widget>[\n                                    // Container for the address text field\n                                    Container(\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          30, 10, 30, 0),\n                                      child: _isDestinationFieldTypeContact\n                                          ? AppTextField(\n                                              label: AppLocalization.of(context)\n                                                  .contactNameTextFieldHeader,\n                                              style: AppStyles.contactsItemName(\n                                                  context),\n                                              prefix:\n                                                  _isValidContactAndUnfocused\n                                                      ? Text(\n                                                          \" \",\n                                                          style: AppStyles\n                                                              .iconFontPrimarySmall(\n                                                                  context),\n                                                        )\n                                                      : null,\n                                              maxLines: 1,\n                                              onChanged: (text) async {\n                                                if (destinationError != null &&\n                                                    mounted) {\n                                                  setState(() {\n                                                    destinationError = null;\n                                                  });\n                                                }\n                                                // Handle contacts\n                                                await _checkAndUpdateContacts();\n                                              },\n                                              focusNode: addressFocusNode,\n                                              controller: addressController,\n                                              firstButton: TextFieldButton(\n                                                icon: Icons\n                                                    .account_balance_wallet,\n                                                onPressed: () {\n                                                  setState(() {\n                                                    destinationError = null;\n                                                    _isDestinationFieldTypeContact = false;\n                                                    _lastContactFieldValue = addressController.text;\n                                                    addressController.text = _lastNameFieldValue;\n                                                  });\n                                                  if (_selectedAccountName == null) {\n                                                    addressFocusNode\n                                                        .requestFocus();\n                                                    addressController.selection = TextSelection.fromPosition(\n                                                        TextPosition(offset: addressController.text.length));\n                                                  } else {\n                                                    addressFocusNode.unfocus();\n                                                  }\n                                                },\n                                              ),\n                                              textInputAction: TextInputAction.next,\n                                              onSubmitted: (text) {\n                                                amountFocusNode.requestFocus();\n                                              },\n                                            )\n                                          : AppTextField(\n                                              label: AppLocalization.of(context)\n                                                  .addressTextFieldHeader,\n                                              style: _isValidContactAndUnfocused\n                                                  ? AppStyles.contactsItemName(\n                                                      context)\n                                                  : AppStyles.paragraphMedium(\n                                                      context),\n                                              prefix:\n                                                  _isValidContactAndUnfocused\n                                                      ? Text(\n                                                          \" \",\n                                                          style: AppStyles\n                                                              .iconFontPrimarySmall(\n                                                                  context),\n                                                        )\n                                                      : null,\n                                              maxLines: 1,\n                                              onChanged: (text) async {\n                                                if (destinationError != null &&\n                                                    mounted) {\n                                                  setState(() {\n                                                    destinationError = null;\n                                                  });\n                                                }\n                                                // Reset selected name\n                                                if (mounted && _selectedAccountName != null) {\n                                                  setState(() {\n                                                    _selectedAccountName = null;\n                                                  });\n                                                }\n                                              },\n                                              focusNode: addressFocusNode,\n                                              controller: addressController,\n                                              secondButton: TextFieldButton(\n                                                icon: AppIcons.paste,\n                                                onPressed: () {\n                                                  Clipboard.getData(\n                                                          \"text/plain\")\n                                                      .then((data) {\n                                                    try {\n                                                      AccountNumber num =\n                                                          AccountNumber(\n                                                              data.text);\n                                                      addressController.text =\n                                                          num.toString();\n                                                    } catch (e) {\n                                                      checkAndValidateContact(\n                                                          name: data.text);\n                                                    }\n                                                  });\n                                                },\n                                              ),\n                                              firstButton: TextFieldButton(\n                                                icon: AppIcons.contacts,\n                                                onPressed: () {\n                                                  setState(() {\n                                                    destinationError = null;\n                                                    _isDestinationFieldTypeContact = true;\n                                                    _lastNameFieldValue = addressController.text;\n                                                    addressController.text = _lastContactFieldValue;                                                    \n                                                  });\n                                                  addressFocusNode\n                                                      .requestFocus();\n                                                  addressController.selection = TextSelection.fromPosition(\n                                                      TextPosition(offset: addressController.text.length));\n                                                },\n                                              ),\n                                              textInputAction: TextInputAction.next,\n                                              onSubmitted: (text) {\n                                                amountFocusNode.requestFocus();\n                                              },\n                                            ),\n                                    ),\n                                    // A stack to display contacts pop up\n                                    Stack(\n                                      children: <Widget>[\n                                        // Column for everything else except contacts pop up\n                                        Column(\n                                          children: <Widget>[\n                                            // Error Text\n                                            ErrorContainer(\n                                              errorText:\n                                                  destinationError == null\n                                                      ? \"\"\n                                                      : destinationError,\n                                            ),\n                                            // Container for the amount text field\n                                            Container(\n                                              margin: EdgeInsetsDirectional\n                                                  .fromSTEB(30, 30, 30, 0),\n                                              child: Observer(\n                                                builder: (context) {\n                                                  bool showCurrencySwitch = walletState.localCurrencyPrice != null;\n                                                  return AppTextField(\n                                                    label: AppLocalization.of(\n                                                            context)\n                                                        .amountTextFieldHeader,\n                                                    style: AppStyles\n                                                        .paragraphPrimary(\n                                                            context),\n                                                    maxLines: 1,\n                                                    inputType: TextInputType\n                                                        .numberWithOptions(\n                                                            decimal: true),\n                                                    prefix: _localCurrencyMode\n                                                        ? Text(\n                                                          widget.localCurrency.getCurrencySymbol(),\n                                                          style: AppStyles.iconFontPrimarySmall(\n                                                                    context),\n                                                        )\n                                                        : Icon(\n                                                            AppIcons.pascalsymbol,\n                                                            size: 15,\n                                                            color:\n                                                                StateContainer.of(\n                                                                        context)\n                                                                    .curTheme\n                                                                    .primary,\n                                                          ),\n                                                    onChanged: (text) {\n                                                      if (amountError != null) {\n                                                        setState(() {\n                                                          amountError = null;\n                                                        });\n                                                      }\n                                                    },\n                                                    inputFormatters: [\n                                                      LengthLimitingTextInputFormatter(\n                                                          13),\n                                                      _localCurrencyMode\n                                                          ? CurrencyFormatter(\n                                                              decimalSeparator:\n                                                                  _localCurrencyFormat\n                                                                      .symbols\n                                                                      .DECIMAL_SEP,\n                                                              commaSeparator:\n                                                                  _localCurrencyFormat\n                                                                      .symbols\n                                                                      .GROUP_SEP,\n                                                              maxDecimalDigits: 2)\n                                                          : CurrencyFormatter(\n                                                              maxDecimalDigits:\n                                                                  NumberUtil\n                                                                      .maxDecimalDigits),\n                                                      LocalCurrencyFormatter(\n                                                          active:\n                                                              _localCurrencyMode,\n                                                          currencyFormat:\n                                                              _localCurrencyFormat),\n                                                    ],\n                                                    focusNode: amountFocusNode,\n                                                    controller: amountController,\n                                                    firstButton: TextFieldButton(\n                                                      icon: AppIcons.max,\n                                                      onPressed: () {\n                                                        amountController.text =\n                                                            widget.account.balance\n                                                                .toStringOpt();\n                                                        amountFocusNode.unfocus();\n                                                      },\n                                                    ),\n                                                    secondButton: showCurrencySwitch ? TextFieldButton(\n                                                        icon: AppIcons\n                                                            .currencyswitch,\n                                                        onPressed: () {\n                                                          toggleLocalCurrency();\n                                                        }\n                                                      ) : null\n                                                  );\n                                                }\n                                              )\n                                            ),\n                                            // Fee container\n                                            _hasFee\n                                                ? FeeContainer(\n                                                    feeText: walletState.MIN_FEE\n                                                        .toStringOpt())\n                                                : SizedBox(),\n                                            // Error Text\n                                            ErrorContainer(\n                                              errorText: amountError == null\n                                                  ? \"\"\n                                                  : amountError,\n                                            ),\n                                            Payload(\n                                              initialPayload: _payload,\n                                              onPayloadChanged:\n                                                  (newPayload, encrypted) {\n                                                setState(() {\n                                                  _payload = newPayload;\n                                                  _encryptedPayload = encrypted;\n                                                });\n                                              },\n                                            ),\n                                            // Bottom Margin\n                                            SizedBox(height: 24),\n                                          ],\n                                        ),\n                                        // Contacts pop up\n                                        _getContactsPopup(),\n                                        // Account name pop up\n                                        _getAccountNameList(),\n                                      ],\n                                    ),\n                                  ],\n                                ),\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                      // \"Send\" button\n                      Row(\n                        children: <Widget>[\n                          AppButton(\n                            type: AppButtonType.Primary,\n                            text: AppLocalization.of(context).sendButton,\n                            buttonTop: true,\n                            onPressed: () async {\n                              await validateAndSend();\n                            },\n                          ),\n                        ],\n                      ),\n                      // \"Scan QR Code\" button\n                      Row(\n                        children: <Widget>[\n                          AppButton(\n                            type: AppButtonType.PrimaryOutline,\n                            text: AppLocalization.of(context).scanQRCodeButton,\n                            onPressed: () async {\n                              String text = await UserDataUtil.getQRData(\n                                  DataType.ACCOUNT,\n                                  StateContainer.of(context).curTheme.scannerTheme);\n                              if (text != null) {\n                                addressController.text = text;\n                              }\n                            },\n                          ),\n                        ],\n                      ),\n                    ],\n                  ),\n                ),\n                // Account search button\n                this.addressFocusNode.hasFocus &&\n                        !_isDestinationFieldTypeContact &&\n                        (this.addressControllerText.length > 2 && !isDigit(this.addressControllerText, 0))\n                        && !_accountNamesLoading && _selectedAccountName == null\n                    ? Container(\n                        width: double.maxFinite,\n                        height: 50,\n                        margin: EdgeInsetsDirectional.only(\n                          bottom: MediaQuery.of(context).viewInsets.bottom,\n                        ),\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                        ),\n                        child: FlatButton(\n                          onPressed: () async {\n                            if (mounted) {\n                              setState(() {\n                                _accountNamesLoading = true;\n                              });\n                            }\n                            List<PascalAccount> accounts = await walletState.findAccountsWithNameLike(this.addressController.text);\n                            if (accounts == null) {\n                              UIUtil.showSnackbar(AppLocalization.of(context).somethingWentWrongError, context);\n                              setState(() {\n                                _accountNamesLoading = false;\n                              });\n                            } else {\n                              if (mounted) {\n                                if (accounts.isEmpty) {\n                                  UIUtil.showSnackbar(AppLocalization.of(context).noResultsFound, context);\n                                }\n                                setState(() {\n                                  _accountNames = accounts;\n                                  _accountNamesUnfocused = accounts;\n                                  _accountNamesLoading = false;\n                                });\n                              }\n                            }\n                          },\n                          highlightColor: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary15,\n                          splashColor: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary30,\n                          padding: EdgeInsets.all(0),\n                          child: Text(AppLocalization.of(context).searchAccountNameButton,\n                              style: AppStyles.buttonPrimary(context)),\n                        ),\n                      )\n                    : SizedBox()\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Future<void> validateAndSend() async {\n    bool hasError = false;\n    Contact contact;\n    Currency sendAmount = _localCurrencyMode ? Currency(_convertLocalCurrencyToCrypto()) :Currency(amountController.text);\n    if (amountController.text.length == 0) {\n      hasError = true;\n      setState(() {\n        amountError = AppLocalization.of(context).amountRequiredError;\n      });\n    } else if (accountState.accountBalance < sendAmount) {\n      hasError = true;\n      setState(() {\n        amountError = AppLocalization.of(context).insufficientBalanceError;\n      });\n    } else if (sendAmount <= Currency(\"0\")) {\n      hasError = true;\n      setState(() {\n        amountError = AppLocalization.of(context).zeroAmountError;\n      });\n    }\n    String contactNameToCheck = addressController.text;\n    if (contactNameToCheck != null && _isDestinationFieldTypeContact) {\n      contact = await sl.get<DBHelper>().getContactWithName(contactNameToCheck);\n      if (contact == null) {\n        hasError = true;\n        setState(() {\n          destinationError =\n              AppLocalization.of(context).contactDoesntExistError;\n        });\n      }\n    } else if (!_isDestinationFieldTypeContact && _selectedAccountName == null) {\n      try {\n        AccountNumber destination = AccountNumber(addressController.text);\n        if (destination == accountState.account.account) {\n          hasError = true;\n          setState(() {\n            destinationError =\n                AppLocalization.of(context).cantSendToYourselfError;\n          });\n        }\n      } catch (e) {\n        hasError = true;\n        setState(() {\n          destinationError =\n              AppLocalization.of(context).invalidDestinationError;\n        });\n      }\n    }\n    if (!hasError) {\n      AppSheets.showBottomSheet(\n          context: context,\n          widget: SendingSheet(\n              destination: _selectedAccountName != null && !_isDestinationFieldTypeContact ? _selectedAccountName.account.toString() : addressController.text,\n              amount: sendAmount.toStringOpt(),\n              localCurrencyAmount: _localCurrencyMode ? amountController.text : null,\n              localCurrency: widget.localCurrency, \n              source: widget.account,\n              fee: _hasFee ? walletState.MIN_FEE : walletState.NO_FEE,\n              payload: _payload,\n              fromOverview: widget.fromOverview,\n              contact: contact,\n              encryptPayload: _encryptedPayload,\n              accountName: _selectedAccountName != null && !_isDestinationFieldTypeContact ? _selectedAccountName.name : null),\n          noBlur: true);\n    }\n  }\n\n  void toggleLocalCurrency() {\n    // Keep a cache of previous amounts because, it's kinda nice to see approx what nano is worth\n    // this way you can tap button and tap back and not end up with X.9993451 NANO\n    if (_localCurrencyMode) {\n      // Switching to crypto-mode\n      String cryptoAmountStr;\n      // Check out previous state\n      if (amountController.text == _lastLocalCurrencyAmount) {\n        cryptoAmountStr = _lastCryptoAmount;\n      } else {\n        _lastLocalCurrencyAmount = amountController.text;\n        _lastCryptoAmount = _convertLocalCurrencyToCrypto();\n        cryptoAmountStr = _lastCryptoAmount;\n      }\n      setState(() {\n        _localCurrencyMode = false;\n      });\n      Future.delayed(Duration(milliseconds: 50), () {\n        amountController.text = cryptoAmountStr;\n        amountController.selection = TextSelection.fromPosition(\n            TextPosition(offset: cryptoAmountStr.length));\n      });\n    } else {\n      // Switching to local-currency mode\n      String localAmountStr;\n      // Check our previous state\n      if (amountController.text == _lastCryptoAmount) {\n        localAmountStr = _lastLocalCurrencyAmount;\n      } else {\n        _lastCryptoAmount = amountController.text;\n        _lastLocalCurrencyAmount = _convertCryptoToLocalCurrency();\n        localAmountStr = _lastLocalCurrencyAmount;\n      }\n      setState(() {\n        _localCurrencyMode = true;\n      });\n      Future.delayed(Duration(milliseconds: 50), () {\n        amountController.text = localAmountStr;\n        amountController.selection = TextSelection.fromPosition(\n            TextPosition(offset: localAmountStr.length));\n      });\n    }\n  }\n\n  String _convertLocalCurrencyToCrypto() {\n    String convertedAmt = amountController.text.replaceAll(\",\", \".\");\n    convertedAmt = NumberUtil.sanitizeNumber(convertedAmt);\n    if (convertedAmt.isEmpty) {\n      return \"\";\n    }\n    Decimal valueLocal = Decimal.parse(convertedAmt);\n    Decimal conversion = Decimal.parse(walletState.localCurrencyPrice.toString());\n    return NumberUtil.truncateDecimal(valueLocal / conversion).toString();\n  }\n\n  String _convertCryptoToLocalCurrency() {\n    String convertedAmt =\n        NumberUtil.sanitizeNumber(amountController.text, maxDecimalDigits: 2);\n    if (convertedAmt.isEmpty) {\n      return \"\";\n    }\n    Decimal valueCrypto = Decimal.parse(convertedAmt);\n    Decimal conversion = Decimal.parse(walletState.localCurrencyPrice.toString());\n    convertedAmt =\n        NumberUtil.truncateDecimal(valueCrypto * conversion, digits: 2)\n            .toString();\n    convertedAmt =\n        convertedAmt.replaceAll(\".\", _localCurrencyFormat.symbols.DECIMAL_SEP);\n    convertedAmt = convertedAmt;\n    return convertedAmt;\n  }\n\n  Widget _getContactsPopup() {\n    return _contacts.length > 0 && _isDestinationFieldTypeContact\n        ? Material(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            child: Container(\n              constraints: BoxConstraints(maxHeight: 138),\n              width: MediaQuery.of(context).size.width - 60,\n              margin: EdgeInsetsDirectional.only(start: 30, end: 30, top: 4),\n              decoration: BoxDecoration(\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  boxShadow: [\n                    StateContainer.of(context).curTheme.shadowAccountCard\n                  ]),\n              child: ListView.builder(\n                physics: AlwaysScrollableScrollPhysics(),\n                padding: EdgeInsets.zero,\n                shrinkWrap: true,\n                itemCount: _contacts.length,\n                itemBuilder: (context, index) {\n                  return _buildContactItem(_contacts[index]);\n                },\n              ),\n            ))\n        : SizedBox();\n  }\n\n  Widget _buildContactItem(Contact contact) {\n    return Container(\n      width: double.maxFinite,\n      height: 46,\n      child: FlatButton(\n        padding: EdgeInsets.all(0),\n        onPressed: () {\n          checkAndValidateContact(contact: contact);\n        },\n        child: Container(\n          alignment: Alignment(-1, 0),\n          margin: EdgeInsetsDirectional.only(start: 16, end: 16),\n          child: AutoSizeText.rich(\n            TextSpan(children: [\n              TextSpan(\n                text: \" \",\n                style: AppStyles.iconFontPrimarySmall(context),\n              ),\n              TextSpan(\n                text: contact.name,\n                style: AppStyles.contactsItemName(context),\n              ),\n            ]),\n            maxLines: 1,\n            stepGranularity: 0.1,\n            textAlign: TextAlign.start,\n            style: TextStyle(fontSize: 14),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _getAccountNameList() {\n    return !_isDestinationFieldTypeContact && !_accountNamesLoading && _accountNames.isNotEmpty\n        ? Material(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            child: Container(\n              constraints: BoxConstraints(maxHeight: 138),\n              width: MediaQuery.of(context).size.width - 60,\n              margin: EdgeInsetsDirectional.only(start: 30, end: 30, top: 4),\n              decoration: BoxDecoration(\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  boxShadow: [\n                    StateContainer.of(context).curTheme.shadowAccountCard\n                  ]),\n              child: ListView.builder(\n                physics: AlwaysScrollableScrollPhysics(),\n                padding: EdgeInsets.zero,\n                shrinkWrap: true,\n                itemCount: _accountNames.length,\n                itemBuilder: (context, index) {\n                  return _buildAccountNameItem(_accountNames[index]);\n                },\n              ),\n            ))\n        : _accountNamesLoading ?\n        Material(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            child: Container(\n              height: 46,\n              width: MediaQuery.of(context).size.width - 60,\n              margin: EdgeInsetsDirectional.only(start: 30, end: 30, top: 4),\n              decoration: BoxDecoration(\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  boxShadow: [\n                    StateContainer.of(context).curTheme.shadowAccountCard\n                  ]),\n              child: Center(\n                child: Padding(\n                  padding: EdgeInsets.all(10.0),\n                  child: FlareActor(\n                    StateContainer.of(context).curTheme.animationSearch,\n                    animation: \"main\",\n                    fit: BoxFit.contain,\n                    color: StateContainer.of(context).curTheme.primary,\n                  ),\n                ),\n              )\n            )          \n        )\n        : SizedBox();\n  }\n\n  Widget _buildAccountNameItem(PascalAccount account) {\n    return Container(\n      width: double.maxFinite,\n      height: 46,\n      child: FlatButton(\n        padding: EdgeInsets.all(0),\n        onPressed: () {\n          setState(() {\n            _selectedAccountName = account;\n            _accountNames = [];\n            _accountNamesUnfocused = [];\n          });\n          addressFocusNode.unfocus();\n        },\n        child: Container(\n          alignment: Alignment(-1, 0),\n          margin: EdgeInsetsDirectional.only(start: 16, end: 16),\n          child: AutoSizeText.rich(\n            TextSpan(children: [\n              TextSpan(\n                text: account.name.toString(),\n                style: AppStyles.contactsItemName(context),\n              ),\n              TextSpan(\n                text: ' (${account.account.toString()})',\n                style: AppStyles.privateKeyTextDarkFaded(context)\n              )\n            ]),\n            maxLines: 1,\n            stepGranularity: 0.1,\n            textAlign: TextAlign.start,\n            style: TextStyle(fontSize: 14),\n          ),\n        ),\n      ),\n    );\n  }\n\n  /// When address text field is changed\n  Future<void> _checkAndUpdateContacts() async {\n    if (_isDestinationFieldTypeContact) {\n      List<Contact> matches = await sl\n          .get<DBHelper>()\n          .getContactsWithNameLike(addressController.text);\n      if (mounted) {\n        setState(() {\n          _contacts = matches;\n        });\n      }\n    } else if (addressController.text.isEmpty) {\n      List<Contact> allContacts = await sl.get<DBHelper>().getContacts();\n      if (mounted) {\n        setState(() {\n          _contacts = allContacts;\n        });\n      }\n    } else {\n      if (mounted) {\n        setState(() {\n          _contacts = [];\n        });\n      }\n    }\n  }\n\n  /// When checking and validating a contact string (e.g. from paste button)\n  Future<void> checkAndValidateContact({String name, Contact contact}) async {\n    Contact c = name != null\n        ? await sl.get<DBHelper>().getContactWithName(name)\n        : contact;\n    if (c != null && mounted) {\n      addressFocusNode.unfocus();\n      addressController.text = c.name;\n      setState(() {\n        _isDestinationFieldTypeContact = true;\n        _isValidContactAndUnfocused = true;\n        _payload = c.payload;\n        _encryptedPayload = false;\n      });\n      EventTaxiImpl.singleton().fire(PayloadChangedEvent(payload: c.payload));\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/send/sending_sheet.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/authenticated_event.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/account/send/sent_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:logger/logger.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nclass SendingSheet extends StatefulWidget {\n  final String destination;\n  final String amount;\n  final String localCurrencyAmount;\n  final AvailableCurrency localCurrency;\n  final String payload;\n  final PascalAccount source;\n  final Currency fee;\n  final bool fromOverview;\n  final Contact contact;\n  final bool encryptPayload;\n  final AccountName accountName;\n\n  SendingSheet(\n      {@required this.destination,\n      @required this.amount,\n      @required this.source,\n      @required this.fee,\n      this.localCurrencyAmount,\n      this.localCurrency,\n      this.contact,\n      this.payload = \"\",\n      this.fromOverview = false,\n      this.encryptPayload = false,\n      this.accountName});\n\n  _SendingSheetState createState() => _SendingSheetState();\n}\n\nclass _SendingSheetState extends State<SendingSheet> {\n  final Logger log = sl.get<Logger>();\n\n  OverlayEntry _overlay;\n\n  StreamSubscription<AuthenticatedEvent> _authSub;\n\n  Uint8List encryptedPayload;\n\n  void _registerBus() {\n    _authSub = EventTaxiImpl.singleton()\n        .registerTo<AuthenticatedEvent>()\n        .listen((event) {\n      if (event.authType == AUTH_EVENT_TYPE.SEND) {\n        doSend();\n      }\n    });\n  }\n\n  void _destroyBus() {\n    if (_authSub != null) {\n      _authSub.cancel();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationSend,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      SizedBox(width: 65, height: 50),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .sendingSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).sendingConfirmParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // \"Address\" header\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).addressTextFieldHeader,\n                            style: AppStyles.textFieldLabel(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                          padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark15),\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          child: widget.contact == null && widget.accountName == null\n                              ? AutoSizeText(\n                                  widget.destination,\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  minFontSize: 8,\n                                  textAlign: TextAlign.center,\n                                  style: AppStyles.privateKeyTextDark(context),\n                                )\n                              : widget.contact != null ? AutoSizeText.rich(\n                                  TextSpan(children: [\n                                    TextSpan(\n                                      text: \" \",\n                                      style: AppStyles.iconFontPrimarySmall(\n                                          context),\n                                    ),\n                                    TextSpan(\n                                        text: widget.contact.name,\n                                        style: AppStyles.contactsItemName(\n                                            context)),\n                                    TextSpan(\n                                      text: \" (\" +\n                                          widget.contact.account.toString() +\n                                          \")\",\n                                      style: AppStyles.privateKeyTextDarkFaded(\n                                          context),\n                                    ),\n                                  ]),\n                                  style: TextStyle(\n                                    fontSize: 14,\n                                  ),\n                                  minFontSize: 8,\n                                  stepGranularity: 0.1,\n                                ) :\n                                   AutoSizeText.rich(\n                                    TextSpan(children: [\n                                      TextSpan(\n                                          text: widget.accountName.toString(),\n                                          style: AppStyles.contactsItemName(\n                                              context)),\n                                      TextSpan(\n                                        text: \" (\" +\n                                            widget.destination.toString() +\n                                            \")\",\n                                        style: AppStyles.privateKeyTextDarkFaded(\n                                            context),\n                                      ),\n                                    ]),\n                                    style: TextStyle(\n                                      fontSize: 14,\n                                    ),\n                                    minFontSize: 8,\n                                    stepGranularity: 0.1,\n                                  ) \n                                ,\n                        ),\n                        // Amount and Fee\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                          child: Row(\n                            children: <Widget>[\n                              // Amount\n                              Column(\n                                crossAxisAlignment: CrossAxisAlignment.start,\n                                children: <Widget>[\n                                  // \"Amount\" header\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 30, 0, 0),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context)\n                                          .amountTextFieldHeader,\n                                      style: AppStyles.textFieldLabel(context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.start,\n                                    ),\n                                  ),\n                                  // Container for the Amount\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 12, 0, 0),\n                                    padding: EdgeInsetsDirectional.fromSTEB(\n                                        12, 8, 12, 8),\n                                    decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(12),\n                                      border: Border.all(\n                                          width: 1,\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .primary15),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .primary10,\n                                    ),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(\n                                        children: widget.localCurrencyAmount == null ? [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontPrimaryBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.amount,\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                        ] :\n                                        [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontPrimaryBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.amount,\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                          TextSpan(\n                                              text: \" (\",\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                          TextSpan(\n                                            text: widget.localCurrency.getCurrencySymbol(),\n                                            style: AppStyles.balanceSmall(context)\n                                          ),\n                                          TextSpan(\n                                              text: widget.localCurrencyAmount,\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                          TextSpan(\n                                              text: \")\",\n                                              style: AppStyles.balanceSmall(\n                                                  context)),\n                                        ],\n                                      ),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 1,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                              widget.fee != Currency(\"0\")\n                                  ? Column(\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // \"Fee\" header\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 30, 0, 0),\n                                          child: AutoSizeText(\n                                            AppLocalization.of(context)\n                                                .feeTextFieldHeader,\n                                            style: AppStyles.textFieldLabel(\n                                                context),\n                                            maxLines: 1,\n                                            stepGranularity: 0.1,\n                                            textAlign: TextAlign.start,\n                                          ),\n                                        ),\n                                        // Container for the fee\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 12, 0, 0),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  12, 8, 12, 8),\n                                          decoration: BoxDecoration(\n                                            borderRadius:\n                                                BorderRadius.circular(12),\n                                            border: Border.all(\n                                                width: 1,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .primary15),\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .primary10,\n                                          ),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                              children: [\n                                                TextSpan(\n                                                  text: \"\",\n                                                  style: AppStyles\n                                                      .iconFontPrimaryBalanceSmallPascal(\n                                                          context),\n                                                ),\n                                                TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 8)),\n                                                TextSpan(\n                                                    text: widget.fee\n                                                        .toStringOpt(),\n                                                    style:\n                                                        AppStyles.balanceSmall(\n                                                            context)),\n                                              ],\n                                            ),\n                                            textAlign: TextAlign.center,\n                                            maxLines: 1,\n                                            minFontSize: 8,\n                                            stepGranularity: 1,\n                                            style: TextStyle(\n                                              fontSize: 14,\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    )\n                                  : SizedBox(),\n                            ],\n                          ),\n                        ),\n                        // \"Payload\" header\n                        isNotEmpty(widget.payload)\n                            ? Container(\n                                width: double.maxFinite,\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  AppLocalization.of(context)\n                                      .payloadTextFieldHeader,\n                                  style: AppStyles.textFieldLabel(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            : SizedBox(),\n                        // Container for the payload text\n                        isNotEmpty(widget.payload)\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .textDark15),\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .textDark10,\n                                ),\n                                child: Row(\n                                    mainAxisSize: MainAxisSize.min,\n                                    children: <Widget>[\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                (widget.encryptPayload\n                                                    ? 101\n                                                    : 86)),\n                                        child: AutoSizeText(\n                                          widget.payload,\n                                          maxLines: 3,\n                                          stepGranularity: 0.1,\n                                          minFontSize: 8,\n                                          textAlign: TextAlign.left,\n                                          style: AppStyles.paragraph(context),\n                                        ),\n                                      ),\n                                      widget.encryptPayload\n                                          ? Container(\n                                              alignment: Alignment.center,\n                                              margin:\n                                                  EdgeInsetsDirectional.only(\n                                                      start: 3.0),\n                                              child: Icon(FontAwesomeIcons.lock,\n                                                  size: 12,\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textDark))\n                                          : SizedBox()\n                                    ]))\n                            : SizedBox(),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CONFIRM\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .confirmButton\n                          ,context),\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await authenticate()) {\n                          EventTaxiImpl.singleton()\n                              .fire(AuthenticatedEvent(AUTH_EVENT_TYPE.SEND));\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> doSend({Currency fee}) async {\n    fee = fee == null ? widget.fee : fee;\n    try {\n      showOverlay(context);\n      if (widget.encryptPayload && encryptedPayload == null) {\n        // Try to encrypt the payload with the receivers public key\n        encryptedPayload = await walletState\n            .getAccountState(widget.source)\n            .encryptPayloadEcies(\n                widget.payload,\n                widget.contact == null\n                    ? AccountNumber(widget.destination)\n                    : widget.contact.account);\n        if (encryptedPayload == null) {\n          _overlay?.remove();\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).failedToEncryptPayloadError, context);\n          return;\n        }\n      }\n      // Do send\n      RPCResponse result = await walletState\n          .getAccountState(widget.source)\n          .doSend(\n              amount: widget.amount,\n              destination: widget.contact == null\n                  ? widget.destination\n                  : widget.contact.account.toString(),\n              payload: widget.payload,\n              encryptedPayload: encryptedPayload,\n              fee: fee);\n      if (result.isError) {\n        ErrorResponse errResp = result;\n        UIUtil.showSnackbar(errResp.errorMessage.replaceAll(\"founds\", \"funds\"), context);\n        _overlay?.remove();\n        Navigator.of(context).pop();\n      } else {\n        _overlay?.remove();\n        OperationsResponse resp = result;\n        PascalOperation op = resp.operations[0];\n        if (op.valid == null || op.valid) {\n          Navigator.of(context).popUntil(RouteUtils.withNameLike(\n              widget.fromOverview ? \"/overview\" : \"/account\"));\n          AppSheets.showBottomSheet(\n              context: context,\n              closeOnTap: true,\n              widget: SentSheet(\n                  destination: widget.contact == null\n                      ? widget.destination\n                      : widget.contact.account.toString(),\n                  amount: widget.amount,\n                  localCurrencyAmount: widget.localCurrencyAmount,\n                  localCurrency: widget.localCurrency,\n                  fee: fee,\n                  payload: widget.payload,\n                  contact: widget.contact,\n                  encryptedPayload: widget.encryptPayload,\n                  accountName: widget.accountName));\n        } else {\n          if (op.errors.contains(\"zero fee\") &&\n              widget.fee == walletState.NO_FEE) {\n            UIUtil.showFeeDialog(\n                context: context,\n                onConfirm: () async {\n                  Navigator.of(context).pop();\n                  doSend(fee: walletState.MIN_FEE);\n                });\n          } else {\n            UIUtil.showSnackbar(\"${op.errors}\", context);\n          }\n        }\n      }\n    } catch (e) {\n      log.e(e.toString());\n      _overlay?.remove();\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n    }\n  }\n\n  Future<bool> _authenticateBiometrics(AuthUtil authUtil, String message) async {\n    // Biometric auth\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n    }\n    return authenticated;\n  }\n\n  Future<bool> _authenticatePin(String message) async {\n      String expectedPin = await sl.get<Vault>().getPin();\n      bool result = await Navigator.of(context)\n          .push(MaterialPageRoute<bool>(builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop(true);\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      }));\n      await Future.delayed(Duration(milliseconds: 200));\n      return result != null && result;    \n  }\n\n  Future<bool> authenticate() async {\n    String message = AppLocalization.of(context)\n        .authenticateToSendParagraph\n        .replaceAll(\"%1\", widget.amount);\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        return await _authenticateBiometrics(authUtil, message);\n      } catch (e) {\n        return await _authenticatePin(message);\n      }\n    } else {\n      return await _authenticatePin(message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/account/send/sent_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nclass SentSheet extends StatefulWidget {\n  final String destination;\n  final String amount;\n  final String localCurrencyAmount;\n  final AvailableCurrency localCurrency;\n  final String payload;\n  final Currency fee;\n  final Contact contact;\n  final bool encryptedPayload;\n  final AccountName accountName;\n\n  SentSheet(\n      {@required this.destination,\n      @required this.amount,\n      @required this.fee,\n      this.localCurrencyAmount,\n      this.localCurrency,\n      this.contact,\n      this.payload = \"\",\n      this.encryptedPayload = false,\n      this.accountName});\n\n  _SentSheetState createState() => _SentSheetState();\n}\n\nclass _SentSheetState extends State<SentSheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient: LinearGradient(\n                        begin: Alignment.topCenter,\n                        end: Alignment.bottomCenter,\n                        stops: [\n                          0.0,\n                          0.7,\n                          0.7,\n                          1.0\n                        ],\n                        colors: [\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.success,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                        ]),\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Container(\n                    margin: EdgeInsetsDirectional.only(top: 8),\n                    child: Column(\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                          children: <Widget>[\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                            // Header\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              alignment: Alignment(0, 0),\n                              child: AutoSizeText(\n                                toUppercase(AppLocalization.of(context)\n                                    .sentSheetHeader\n                                    ,context),\n                                style: AppStyles.header(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                textAlign: TextAlign.center,\n                              ),\n                            ),\n                            // Sized Box\n                            SizedBox(\n                              height: 50,\n                              width: 65,\n                            ),\n                          ],\n                        ),\n                        // Tick\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 8),\n                          height: 110,\n                          width: 110,\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(100),\n                            color: StateContainer.of(context).curTheme.success,\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowTextDarkTwo\n                            ],\n                          ),\n                          child: Icon(\n                            AppIcons.tick,\n                            size: 40,\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Paragraph\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).sentParagraph,\n                            style: AppStyles.paragraph(context),\n                            stepGranularity: 0.1,\n                            maxLines: 3,\n                            minFontSize: 8,\n                          ),\n                        ),\n                        // \"Address\" header\n                        Container(\n                          width: double.maxFinite,\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).addressTextFieldHeader,\n                            style: AppStyles.textFieldLabelSuccess(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.start,\n                          ),\n                        ),\n                        // Container for the account number\n                        Container(\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                            padding:\n                                EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                            decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(12),\n                              border: Border.all(\n                                  width: 1,\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .textDark15),\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark10,\n                            ),\n                            child: widget.contact == null && widget.accountName == null\n                                ? AutoSizeText(\n                                    widget.destination,\n                                    maxLines: 1,\n                                    stepGranularity: 0.1,\n                                    minFontSize: 8,\n                                    textAlign: TextAlign.center,\n                                    style:\n                                        AppStyles.privateKeyTextDark(context),\n                                  )\n                                : widget.contact != null ? AutoSizeText.rich(\n                                    TextSpan(children: [\n                                      TextSpan(\n                                        text: \" \",\n                                        style: AppStyles.iconFontSuccessSmall(\n                                            context),\n                                      ),\n                                      TextSpan(\n                                          text:\n                                              widget.contact.name,\n                                          style: AppStyles.contactsItemName(\n                                              context)),\n                                      TextSpan(\n                                          text: \" (\" +\n                                              widget.contact.account\n                                                  .toString() +\n                                              \")\",\n                                          style:\n                                              AppStyles.privateKeyTextDarkFaded(\n                                                  context)),\n                                    ]),\n                                    style: TextStyle(\n                                      fontSize: 14,\n                                    ),\n                                    minFontSize: 8,\n                                    stepGranularity: 0.1)\n                                  : \n                                  AutoSizeText.rich(\n                                    TextSpan(children: [\n                                      TextSpan(\n                                          text:\n                                              widget.accountName.toString(),\n                                          style: AppStyles.contactsItemName(\n                                              context)),\n                                      TextSpan(\n                                          text: \" (\" +\n                                              widget.destination\n                                                  .toString() +\n                                              \")\",\n                                          style:\n                                              AppStyles.privateKeyTextDarkFaded(\n                                                  context)),\n                                    ]),\n                                    style: TextStyle(\n                                      fontSize: 14,\n                                    ),\n                                    minFontSize: 8,\n                                    stepGranularity: 0.1\n                                  )\n                        ),\n                        // Amount and Fee\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                          child: Row(\n                            children: <Widget>[\n                              // Amount\n                              Column(\n                                crossAxisAlignment: CrossAxisAlignment.start,\n                                children: <Widget>[\n                                  // \"Amount\" header\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 30, 0, 0),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context)\n                                          .amountTextFieldHeader,\n                                      style: AppStyles.textFieldLabelSuccess(\n                                          context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.start,\n                                    ),\n                                  ),\n                                  // Container for the Amount\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            MediaQuery.of(context).size.width -\n                                                76 / 2),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        0, 12, 0, 0),\n                                    padding: EdgeInsetsDirectional.fromSTEB(\n                                        12, 8, 12, 8),\n                                    decoration: BoxDecoration(\n                                      borderRadius: BorderRadius.circular(12),\n                                      border: Border.all(\n                                          width: 1,\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .success15),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .success10,\n                                    ),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(\n                                        children: widget.localCurrencyAmount == null ? [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontSuccessBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.amount,\n                                              style:\n                                                  AppStyles.balanceSmallSuccess(\n                                                      context)),\n                                        ] :\n                                        [\n                                          TextSpan(\n                                            text: \"\",\n                                            style: AppStyles\n                                                .iconFontSuccessBalanceSmallPascal(\n                                                    context),\n                                          ),\n                                          TextSpan(\n                                              text: \" \",\n                                              style: TextStyle(fontSize: 8)),\n                                          TextSpan(\n                                              text: widget.amount,\n                                              style: AppStyles.balanceSmallSuccess(\n                                                  context)),\n                                          TextSpan(\n                                              text: \" (\",\n                                              style: AppStyles.balanceSmallSuccess(\n                                                  context)),\n                                          TextSpan(\n                                            text: widget.localCurrency.getCurrencySymbol(),\n                                            style: AppStyles.balanceSmallSuccess(context)\n                                          ),\n                                          TextSpan(\n                                              text: widget.localCurrencyAmount,\n                                              style: AppStyles.balanceSmallSuccess(\n                                                  context)),\n                                          TextSpan(\n                                              text: \")\",\n                                              style: AppStyles.balanceSmallSuccess(\n                                                  context)),\n                                        ],\n                                      ),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 1,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  ),\n                                ],\n                              ),\n                              widget.fee != Currency(\"0\")\n                                  ? Column(\n                                      crossAxisAlignment:\n                                          CrossAxisAlignment.start,\n                                      children: <Widget>[\n                                        // \"Fee\" header\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 30, 0, 0),\n                                          child: AutoSizeText(\n                                            AppLocalization.of(context)\n                                                .feeTextFieldHeader,\n                                            style:\n                                                AppStyles.textFieldLabelSuccess(\n                                                    context),\n                                            maxLines: 1,\n                                            stepGranularity: 0.1,\n                                            textAlign: TextAlign.start,\n                                          ),\n                                        ),\n                                        // Container for the fee\n                                        Container(\n                                          constraints: BoxConstraints(\n                                              maxWidth: MediaQuery.of(context)\n                                                      .size\n                                                      .width -\n                                                  76 / 2),\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  16, 12, 0, 0),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  12, 8, 12, 8),\n                                          decoration: BoxDecoration(\n                                            borderRadius:\n                                                BorderRadius.circular(12),\n                                            border: Border.all(\n                                                width: 1,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .success15),\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .success10,\n                                          ),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                              children: [\n                                                TextSpan(\n                                                  text: \"\",\n                                                  style: AppStyles\n                                                      .iconFontSuccessBalanceSmallPascal(\n                                                          context),\n                                                ),\n                                                TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 8)),\n                                                TextSpan(\n                                                    text: widget.fee\n                                                        .toStringOpt(),\n                                                    style: AppStyles\n                                                        .balanceSmallSuccess(\n                                                            context)),\n                                              ],\n                                            ),\n                                            textAlign: TextAlign.center,\n                                            maxLines: 1,\n                                            minFontSize: 8,\n                                            stepGranularity: 1,\n                                            style: TextStyle(\n                                              fontSize: 14,\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    )\n                                  : SizedBox(),\n                            ],\n                          ),\n                        ),\n                        // \"Payload\" header\n                        isNotEmpty(widget.payload)\n                            ? Container(\n                                width: double.maxFinite,\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  AppLocalization.of(context)\n                                      .payloadTextFieldHeader,\n                                  style:\n                                      AppStyles.textFieldLabelSuccess(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            : SizedBox(),\n                        // Container for the payload text\n                        isNotEmpty(widget.payload)\n                            ? Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .textDark15),\n                                  color: StateContainer.of(context)\n                                      .curTheme\n                                      .textDark10,\n                                ),\n                                child: Row(\n                                    mainAxisSize: MainAxisSize.min,\n                                    children: <Widget>[\n                                      Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                (widget.encryptedPayload\n                                                    ? 101\n                                                    : 86)),\n                                        child: AutoSizeText(\n                                          widget.payload,\n                                          maxLines: 3,\n                                          stepGranularity: 0.1,\n                                          minFontSize: 8,\n                                          textAlign: TextAlign.start,\n                                          style: AppStyles.paragraph(context),\n                                        ),\n                                      ),\n                                      widget.encryptedPayload\n                                          ? Container(\n                                              alignment: Alignment.center,\n                                              margin:\n                                                  EdgeInsetsDirectional.only(\n                                                      start: 3.0),\n                                              child: Icon(FontAwesomeIcons.lock,\n                                                  size: 12,\n                                                  color:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .textDark))\n                                          : SizedBox()\n                                    ]))\n                            : SizedBox(),\n                        // Bottom Margin\n                        SizedBox(height: 24),\n                      ],\n                    ),\n                  ),\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.SuccessOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_backup_confirm.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\n\nclass IntroBackupConfirmPage extends StatefulWidget {\n  @override\n  _IntroBackupConfirmPageState createState() => _IntroBackupConfirmPageState();\n}\n\nclass _IntroBackupConfirmPageState extends State<IntroBackupConfirmPage> {\n  var _scaffoldKey = GlobalKey<ScaffoldState>();\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      key: _scaffoldKey,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            //A widget that holds welcome animation + paragraph\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // Container for the header\n                  Container(\n                    padding: EdgeInsetsDirectional.only(\n                      top: (MediaQuery.of(context).padding.top) +\n                          (24 - (MediaQuery.of(context).padding.top) / 2),\n                    ),\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                    ),\n                    // Row for back button and the header\n                    child: Row(\n                      children: <Widget>[\n                        // The header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 60,\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(30, 24, 30, 24),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).backUpKeyHeader,\n                            style: AppStyles.header(context),\n                            maxLines: 3,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: <Widget>[\n                        // Container for the illustration\n                        Container(\n                          child: SvgRepaintAsset(\n                            asset: StateContainer.of(context)\n                                .curTheme\n                                .illustrationBackup,\n                            width: MediaQuery.of(context).size.width * 0.6,\n                            height: MediaQuery.of(context).size.width *\n                                0.6 *\n                                (183 / 230),\n                          ),\n                        ),\n                        //Container for the paragraph\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(30, 30, 30, 12),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .newKeyBackUpConfirmParagraph,\n                            maxLines: 5,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraph(context),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n\n            //\"YES, I'M SURE\" and \"NO, GO BACK\" buttons\n            // \"YES, I'M SURE\" button\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.Primary,\n                  text: toUppercase(\n                      AppLocalization.of(context).yesImSureButton, context),\n                  buttonTop: true,\n                  onPressed: () {\n                    sl\n                        .get<SharedPrefsUtil>()\n                        .setPrivateKeyBackedUp(true)\n                        .then((_) {\n                      Navigator.of(context).push(\n                          MaterialPageRoute(builder: (BuildContext context) {\n                        return PinScreen(\n                            type: PinOverlayType.NEW_PIN,\n                            onSuccess: (pin) {\n                              sl.get<Vault>().setPin(pin).then((_) {\n                                walletState.requestUpdate();\n                                Navigator.of(context).pushNamedAndRemoveUntil(\n                                    '/overview',\n                                    (Route<dynamic> route) => false);\n                              });\n                            });\n                      }));\n                    });\n                  },\n                ),\n              ],\n            ),\n            // \"No, Go Back\" button\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.PrimaryOutline,\n                  text: toUppercase(\n                      AppLocalization.of(context).noGoBackButton, context),\n                  onPressed: () {\n                    Navigator.of(context).pop();\n                  },\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_decrypt_and_import_private_key.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass IntroDecryptAndImportPrivateKeyPage extends StatefulWidget {\n  final String encryptedKey;\n\n  IntroDecryptAndImportPrivateKeyPage({@required this.encryptedKey});\n\n  @override\n  _IntroDecryptAndImportPrivateKeyPageState createState() =>\n      _IntroDecryptAndImportPrivateKeyPageState();\n}\n\nclass _IntroDecryptAndImportPrivateKeyPageState\n    extends State<IntroDecryptAndImportPrivateKeyPage> {\n  FocusNode _passwordFocusNode;\n  TextEditingController _passwordController;\n  String _passwordError;\n\n  @override\n  void initState() {\n    super.initState();\n    _passwordFocusNode = FocusNode();\n    _passwordController = TextEditingController();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n        resizeToAvoidBottomInset: false,\n        backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n        body: TapOutsideUnfocus(\n            child: LayoutBuilder(\n          builder: (context, constraints) => Column(\n            children: <Widget>[\n              //A widget that holds welcome animation + paragraph\n              Expanded(\n                  child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // Container for the header\n                  Container(\n                    padding: EdgeInsetsDirectional.only(\n                      top: (MediaQuery.of(context).padding.top) +\n                          (24 - (MediaQuery.of(context).padding.top) / 2),\n                    ),\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                    ),\n                    // Row for back button and the header\n                    child: Row(\n                      children: <Widget>[\n                        // The header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 60,\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(30, 24, 30, 24),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .decryptAndImportKeyHeader,\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  //Container for the paragraph\n                  Container(\n                    margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 20),\n                    alignment: Alignment(-1, 0),\n                    child: AutoSizeText(\n                      AppLocalization.of(context)\n                          .looksLikeEncryptedKeyParagraph,\n                      maxLines: 3,\n                      stepGranularity: 0.1,\n                      style: AppStyles.paragraph(context),\n                    ),\n                  ),\n                  Expanded(\n                    child: KeyboardAvoider(\n                      duration: Duration(milliseconds: 0),\n                      autoScroll: true,\n                      focusPadding: 40,\n                      child: Column(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: <Widget>[\n                          // Container for the text field\n                          Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 10, 30, 0),\n                              child: AppTextField(\n                                label: AppLocalization.of(context)\n                                    .passwordTextFieldHeader,\n                                style: AppStyles.privateKeyPrimary(context),\n                                passwordField: true,\n                                focusNode: _passwordFocusNode,\n                                controller: _passwordController,\n                                onChanged: onPasswordChanged,\n                                maxLines: 1,\n                              )),\n                          // Error Text\n                          Container(\n                            margin: EdgeInsetsDirectional.only(\n                                start: 30, end: 30, top: 4, bottom: 40),\n                            child: Text(\n                              _passwordError == null ? \"\" : _passwordError,\n                              style: AppStyles.paragraphPrimary(context),\n                              textAlign: TextAlign.start,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ],\n              )),\n              //\"Import\" and \"Go Back\" buttons\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.Primary,\n                    text: AppLocalization.of(context).importButton,\n                    buttonTop: true,\n                    onPressed: () {\n                      decryptAndSubmit();\n                    },\n                  ),\n                ],\n              ),\n              // \"Go Back\" button\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.PrimaryOutline,\n                    text: AppLocalization.of(context).goBackButton,\n                    onPressed: () {\n                      Navigator.of(context).pop();\n                    },\n                  ),\n                ],\n              ),\n            ],\n          ),\n        )));\n  }\n\n  void onPasswordChanged(String newText) {\n    setState(() {\n      _passwordError = null;\n    });\n  }\n\n  void decryptAndSubmit() {\n    if (_passwordController.text.length < 1) {\n      setState(() {\n        _passwordError = AppLocalization.of(context).emptyPasswordError;\n      });\n      return;\n    }\n    PrivateKey privKey;\n    try {\n      privKey = PrivateKeyCrypt.decrypt(\n          PDUtil.hexToBytes(widget.encryptedKey), _passwordController.text);\n    } catch (e) {\n      setState(() {\n        _passwordError = AppLocalization.of(context).invalidPasswordError;\n      });\n      return;\n    }\n    if (!privKey.curve.supported) {\n      showAppDialog(\n          context: context,\n          builder: (_) => DialogOverlay(\n                title: AppLocalization.of(context).keyTypeNotSupportedHeader,\n                confirmButtonText: toUppercase(\n                    AppLocalization.of(context).okayGoBackButton, context),\n                feeDialog: true,\n                body: TextSpan(\n                  children: [\n                    TextSpan(\n                      text: AppLocalization.of(context)\n                          .keyTypeNotSupportedParagraph,\n                      style: AppStyles.paragraph(context),\n                    )\n                  ],\n                ),\n                onConfirm: () {\n                  Navigator.of(context)\n                      .popUntil(RouteUtils.withNameLike('/intro_welcome'));\n                },\n              ));\n      return;\n    }\n    sl.get<Vault>().setPrivateKey(privKey).then((_) {\n      sl.get<SharedPrefsUtil>().setPrivateKeyBackedUp(true).then((_) {\n        Navigator.of(context)\n            .push(MaterialPageRoute(builder: (BuildContext context) {\n          return PinScreen(\n              type: PinOverlayType.NEW_PIN,\n              onSuccess: (pin) {\n                sl.get<Vault>().setPin(pin).then((_) {\n                  walletState.requestUpdate();\n                  Navigator.of(context).pushNamedAndRemoveUntil(\n                      '/overview', (Route<dynamic> route) => false);\n                });\n              });\n        }));\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_import_private_key.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass IntroImportPrivateKeyPage extends StatefulWidget {\n  @override\n  _IntroImportPrivateKeyPageState createState() =>\n      _IntroImportPrivateKeyPageState();\n}\n\nclass _IntroImportPrivateKeyPageState extends State<IntroImportPrivateKeyPage> {\n  FocusNode privateKeyFocusNode;\n  TextEditingController privateKeyController;\n  bool _showPrivateKeyError;\n  bool _privateKeyValid;\n\n  @override\n  void initState() {\n    super.initState();\n    privateKeyFocusNode = FocusNode();\n    privateKeyController = TextEditingController();\n    _showPrivateKeyError = false;\n    _privateKeyValid = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n        resizeToAvoidBottomInset: false,\n        backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n        body: TapOutsideUnfocus(\n            child: LayoutBuilder(\n          builder: (context, constraints) => Column(\n            children: <Widget>[\n              //A widget that holds welcome animation + paragraph\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: <Widget>[\n                    // Container for the header\n                    Container(\n                      padding: EdgeInsetsDirectional.only(\n                        top: (MediaQuery.of(context).padding.top) +\n                            (24 - (MediaQuery.of(context).padding.top) / 2),\n                      ),\n                      decoration: BoxDecoration(\n                        gradient:\n                            StateContainer.of(context).curTheme.gradientPrimary,\n                      ),\n                      // Row for back button and the header\n                      child: Row(\n                        children: <Widget>[\n                          // The header\n                          Container(\n                            width: MediaQuery.of(context).size.width - 60,\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 24, 30, 24),\n                            child: AutoSizeText(\n                              AppLocalization.of(context)\n                                  .importPrivateKeyHeader,\n                              style: AppStyles.header(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                    //Container for the paragraph\n                    Container(\n                      margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 20),\n                      alignment: Alignment(-1, 0),\n                      child: AutoSizeText(\n                        AppLocalization.of(context).importPrivateKeyParagraph,\n                        maxLines: 2,\n                        stepGranularity: 0.1,\n                        style: AppStyles.paragraph(context),\n                      ),\n                    ),\n                    Expanded(\n                      child: KeyboardAvoider(\n                        duration: Duration(milliseconds: 0),\n                        autoScroll: true,\n                        focusPadding: 40,\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: <Widget>[\n                            // Container for the text field\n                            Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .privateKeyTextFieldHeader,\n                                  style: _privateKeyValid\n                                      ? AppStyles.privateKeyPrimary(context)\n                                      : AppStyles.privateKeyTextDark(context),\n                                  focusNode: privateKeyFocusNode,\n                                  controller: privateKeyController,\n                                  maxLines: 1,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () {\n                                      Clipboard.getData(\"text/plain\")\n                                          .then((cdata) {\n                                        if (privateKeyIsValid(cdata.text) ||\n                                            privateKeyIsEncrypted(cdata.text)) {\n                                          privateKeyController.text =\n                                              cdata.text;\n                                          onKeyTextChanged(\n                                              privateKeyController.text);\n                                        }\n                                      });\n                                    },\n                                  ),\n                                  secondButton: TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getQRData(\n                                              DataType.RAW,\n                                              StateContainer.of(context)\n                                                  .curTheme\n                                                  .scannerTheme);\n                                      if (text != null) {\n                                        if (privateKeyIsValid(text) ||\n                                            privateKeyIsEncrypted(text)) {\n                                          privateKeyController.text = text;\n                                          onKeyTextChanged(\n                                              privateKeyController.text);\n                                        }\n                                      }\n                                    },\n                                  ),\n                                  inputFormatters: [\n                                    FilteringTextInputFormatter.allow(RegExp(\n                                        \"[a-fA-F0-9]\")), // Hex characters\n                                    UpperCaseTextFormatter()\n                                  ],\n                                  textCapitalization:\n                                      TextCapitalization.characters,\n                                  onChanged: onKeyTextChanged,\n                                )),\n                            // Error text\n                            Container(\n                              margin: EdgeInsetsDirectional.only(\n                                  start: 30, end: 30, top: 4, bottom: 40),\n                              child: AutoSizeText(\n                                _showPrivateKeyError\n                                    ? AppLocalization.of(context)\n                                        .invalidPrivateKeyError\n                                    : \"\",\n                                style: AppStyles.paragraphPrimary(context),\n                                textAlign: TextAlign.start,\n                              ),\n                            )\n                          ],\n                        ),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n\n              // \"Import\" button\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.Primary,\n                    text: AppLocalization.of(context).importButton,\n                    buttonTop: true,\n                    onPressed: () {\n                      validateAndSubmit();\n                    },\n                  ),\n                ],\n              ),\n              // \"Go Back\" button\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.PrimaryOutline,\n                    text: AppLocalization.of(context).goBackButton,\n                    onPressed: () {\n                      Navigator.of(context).pop();\n                    },\n                  ),\n                ],\n              ),\n            ],\n          ),\n        )));\n  }\n\n  bool privateKeyIsValid(String pkText) {\n    try {\n      PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(pkText));\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  bool privateKeyIsEncrypted(String pkText, {bool lengthCheck = true}) {\n    int minLength = lengthCheck ? 100 : 8;\n    if (pkText == null || pkText.length < minLength) {\n      return false;\n    }\n    try {\n      String salted =\n          PDUtil.bytesToUtf8String(PDUtil.hexToBytes(pkText.substring(0, 16)));\n      if (salted == \"Salted__\") {\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  void onKeyTextChanged(String newText) {\n    if (privateKeyIsValid(newText)) {\n      setState(() {\n        _privateKeyValid = true;\n        _showPrivateKeyError = false;\n      });\n    } else {\n      setState(() {\n        _privateKeyValid = false;\n        _showPrivateKeyError = false;\n      });\n    }\n  }\n\n  void validateAndSubmit() {\n    if (privateKeyIsValid(privateKeyController.text)) {\n      if (!PrivateKeyCoder()\n          .decodeFromBytes(PDUtil.hexToBytes(privateKeyController.text))\n          .curve\n          .supported) {\n        showAppDialog(\n            context: context,\n            builder: (_) => DialogOverlay(\n                  title: AppLocalization.of(context).keyTypeNotSupportedHeader,\n                  warningStyle: true,\n                  confirmButtonText:\n                      AppLocalization.of(context).okayGoBackButton,\n                  body: TextSpan(\n                    children: [\n                      TextSpan(\n                        text: AppLocalization.of(context)\n                            .keyTypeNotSupportedParagraph,\n                        style: AppStyles.paragraph(context),\n                      )\n                    ],\n                  ),\n                  onConfirm: () {\n                    Navigator.of(context)\n                        .popUntil(RouteUtils.withNameLike('/intro_welcome'));\n                  },\n                ));\n        return;\n      }\n      sl\n          .get<Vault>()\n          .setPrivateKey(PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(privateKeyController.text)))\n          .then((_) {\n        sl.get<SharedPrefsUtil>().setPrivateKeyBackedUp(true).then((_) {\n          Navigator.of(context)\n              .push(MaterialPageRoute(builder: (BuildContext context) {\n            return PinScreen(\n                type: PinOverlayType.NEW_PIN,\n                onSuccess: (pin) {\n                  sl.get<Vault>().setPin(pin).then((_) {\n                    walletState.requestUpdate();\n                    Navigator.of(context).pushNamedAndRemoveUntil(\n                        '/overview', (Route<dynamic> route) => false);\n                  });\n                });\n          }));\n        });\n      });\n    } else if (privateKeyIsEncrypted(privateKeyController.text)) {\n      Navigator.of(context).pushNamed('/intro_decrypt_and_import_private_key',\n          arguments: privateKeyController.text);\n    } else {\n      setState(() {\n        _showPrivateKeyError = true;\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_new_private_key.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass IntroNewPrivateKeyPage extends StatefulWidget {\n  @override\n  _IntroNewPrivateKeyPageState createState() => _IntroNewPrivateKeyPageState();\n}\n\nclass _IntroNewPrivateKeyPageState extends State<IntroNewPrivateKeyPage> {\n  bool _keyCopied;\n  Timer _keyCopiedTimer;\n  var _scaffoldKey = GlobalKey<ScaffoldState>();\n\n  @override\n  void initState() {\n    super.initState();\n    _keyCopied = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      key: _scaffoldKey,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            //A widget that holds welcome animation + paragraph\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // Container for the header\n                  Container(\n                    padding: EdgeInsetsDirectional.only(\n                      top: (MediaQuery.of(context).padding.top) +\n                          (24 - (MediaQuery.of(context).padding.top) / 2),\n                    ),\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                    ),\n                    // Row for back button and the header\n                    child: Row(\n                      children: <Widget>[\n                        // The header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 60,\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(30, 24, 30, 24),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).newPrivateKeyHeader,\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  //Container for the paragraph\n                  Container(\n                    alignment: Alignment(-1, 0),\n                    margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                    child: AutoSizeText(\n                      AppLocalization.of(context).newPrivateKeyParagraph,\n                      maxLines: 5,\n                      stepGranularity: 0.1,\n                      style: AppStyles.paragraph(context),\n                    ),\n                  ),\n                  // Container for the private key\n                  Container(\n                    margin: EdgeInsetsDirectional.fromSTEB(30, 24, 30, 0),\n                    padding: EdgeInsetsDirectional.fromSTEB(32, 16, 32, 16),\n                    width: MediaQuery.of(context).size.width - 60,\n                    decoration: BoxDecoration(\n                      borderRadius: BorderRadius.circular(12),\n                      border: Border.all(\n                          width: 1,\n                          color: _keyCopied\n                              ? StateContainer.of(context).curTheme.success15\n                              : StateContainer.of(context).curTheme.primary15),\n                      color: _keyCopied\n                          ? StateContainer.of(context).curTheme.success10\n                          : StateContainer.of(context).curTheme.primary10,\n                    ),\n                    child: FutureBuilder(\n                        future: sl.get<Vault>().getPrivateKey(),\n                        builder:\n                            (BuildContext context, AsyncSnapshot snapshot) {\n                          if (snapshot.hasData && snapshot.data != null) {\n                            return AutoSizeText(\n                              snapshot.data,\n                              textAlign: TextAlign.center,\n                              maxLines: 3,\n                              stepGranularity: 0.5,\n                              style: _keyCopied\n                                  ? AppStyles.privateKeySuccess(context)\n                                  : AppStyles.privateKeyPrimary(context),\n                            );\n                          } else {\n                            return SizedBox();\n                          }\n                        }),\n                  ),\n                  // Container for the \"Copy to Clipboard\" button\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.end,\n                    children: <Widget>[\n                      Container(\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(100.0),\n                          color: _keyCopied\n                              ? StateContainer.of(context).curTheme.success\n                              : StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary,\n                          boxShadow: [\n                            StateContainer.of(context).curTheme.shadowTextDark,\n                          ],\n                        ),\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                        height: 40,\n                        child: FlatButton(\n                          shape: RoundedRectangleBorder(\n                              borderRadius: BorderRadius.circular(100.0)),\n                          child: AutoSizeText(\n                            _keyCopied\n                                ? AppLocalization.of(context).copiedButton\n                                : AppLocalization.of(context).copyButton,\n                            textAlign: TextAlign.center,\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            style: _keyCopied\n                                ? AppStyles.buttonMiniSuccess(context)\n                                : AppStyles.buttonMiniBg(context),\n                          ),\n                          splashColor: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary60,\n                          highlightColor: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary30,\n                          onPressed: () {\n                            sl.get<Vault>().getPrivateKey().then((key) {\n                              UserDataUtil.setSecureClipboardItem(key);\n                            });\n                            setState(() {\n                              _keyCopied = true;\n                            });\n                            if (_keyCopiedTimer != null) {\n                              _keyCopiedTimer.cancel();\n                            }\n                            _keyCopiedTimer =\n                                Timer(const Duration(milliseconds: 1500), () {\n                              if (mounted) {\n                                setState(() {\n                                  _keyCopied = false;\n                                });\n                              }\n                            });\n                          },\n                        ),\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n\n            //\"I've Backed It Up\" and \"Go Back\" buttons\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.Primary,\n                  text: AppLocalization.of(context).iHaveBackedItUpButton,\n                  buttonTop: true,\n                  onPressed: () {\n                    Navigator.of(context).pushNamed('/intro_backup_confirm');\n                  },\n                ),\n              ],\n            ),\n            // \"Go Back\" button\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.PrimaryOutline,\n                  text: AppLocalization.of(context).goBackButton,\n                  onPressed: () {\n                    Navigator.of(context).pop();\n                  },\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_security_first.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/pascal_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\n\nclass IntroSecurityFirstPage extends StatefulWidget {\n  @override\n  _IntroSecurityFirstPageState createState() => _IntroSecurityFirstPageState();\n}\n\nclass _IntroSecurityFirstPageState extends State<IntroSecurityFirstPage> {\n  var _scaffoldKey = GlobalKey<ScaffoldState>();\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      key: _scaffoldKey,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            //A widget that holds welcome animation + paragraph\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // Container for the header\n                  Container(\n                    padding: EdgeInsetsDirectional.only(\n                      top: (MediaQuery.of(context).padding.top) +\n                          (24 - (MediaQuery.of(context).padding.top) / 2),\n                    ),\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                    ),\n                    // Row for back button and the header\n                    child: Row(\n                      children: <Widget>[\n                        // The header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 60,\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(30, 24, 30, 24),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).securityFirstHeader,\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: <Widget>[\n                        // Container for the illustration\n                        Container(\n                          margin: EdgeInsetsDirectional.only(top: 10),\n                          child: SvgRepaintAsset(\n                            asset: StateContainer.of(context)\n                                .curTheme\n                                .illustrationSecurity,\n                            width: MediaQuery.of(context).size.width *\n                                (UIUtil.smallScreen(context) ? 0.35 : 0.5),\n                            height: MediaQuery.of(context).size.width *\n                                (UIUtil.smallScreen(context) ? 0.35 : 0.5) *\n                                (213 / 230),\n                          ),\n                        ),\n                        //Container for the paragraph\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).newKeySecurityParagraph,\n                            maxLines: 4,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraph(context),\n                          ),\n                        ),\n                        //Container for the paragraph\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 10, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .uninstallDisclaimerParagraph,\n                            maxLines: 3,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraphPrimary(context),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n\n            //\"I've Backed It Up\" and \"Go Back\" buttons\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.Primary,\n                  text: AppLocalization.of(context).gotItButton,\n                  buttonTop: true,\n                  onPressed: () {\n                    sl\n                        .get<Vault>()\n                        .setPrivateKey(\n                            sl.get<PascalUtil>().generateKeyPair().privateKey)\n                        .then((key) {\n                      Navigator.of(context).pushNamed('/intro_new_private_key');\n                    });\n                  },\n                ),\n              ],\n            ),\n            // \"Go Back\" button\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.PrimaryOutline,\n                  text: AppLocalization.of(context).goBackButton,\n                  onPressed: () {\n                    Navigator.of(context).pop();\n                  },\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/intro/intro_welcome.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flare_flutter/flare_actor.dart';\n\nclass IntroWelcomePage extends StatefulWidget {\n  @override\n  _IntroWelcomePageState createState() => _IntroWelcomePageState();\n}\n\nclass _IntroWelcomePageState extends State<IntroWelcomePage> {\n  List<DialogListItem> getLanguageList() {\n    List<DialogListItem> ret = [];\n    AvailableLanguage.values.forEach((AvailableLanguage value) {\n      LanguageSetting setting = LanguageSetting(value);\n      ret.add(DialogListItem(\n          option: setting.getDisplayName(context),\n          action: () {\n            if (setting != StateContainer.of(context).curLanguage) {\n              sl.get<SharedPrefsUtil>().setLanguage(setting).then((result) {\n                StateContainer.of(context).updateLanguage(setting);\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            //A widget that holds welcome animation + paragraph\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // A stack for background gradient and the animation\n                  Stack(\n                    children: <Widget>[\n                      // Container for the gradient background\n                      Container(\n                        height: (MediaQuery.of(context).padding.top +\n                                (MediaQuery.of(context).size.width *\n                                    262 /\n                                    400)) -\n                            (MediaQuery.of(context).size.width * 80 / 400),\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                        ),\n                      ),\n                      //Container for the animation\n                      Container(\n                        margin: EdgeInsetsDirectional.only(\n                            top: MediaQuery.of(context).padding.top),\n                        //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n                        width: double.maxFinite,\n                        height: MediaQuery.of(context).size.width * 262 / 400,\n                        child: Center(\n                          child: FlareActor(\n                            StateContainer.of(context)\n                                .curTheme\n                                .animationWelcome,\n                            animation: \"main\",\n                            fit: BoxFit.contain,\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                  //Container for the paragraph\n                  Expanded(\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: <Widget>[\n                        Container(\n                          margin: EdgeInsets.symmetric(horizontal: 30),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).welcomeParagraph,\n                            maxLines: 4,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraph(context),\n                          ),\n                        ),\n                        // \"Language\" button\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.center,\n                          children: <Widget>[\n                            Container(\n                              height: 40.0,\n                              decoration: BoxDecoration(\n                                borderRadius: BorderRadius.circular(100.0),\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .backgroundPrimary,\n                                boxShadow: [\n                                  StateContainer.of(context)\n                                      .curTheme\n                                      .shadowTextDark,\n                                ],\n                              ),\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(30, 20, 30, 0),\n                              child: FlatButton(\n                                shape: RoundedRectangleBorder(\n                                    borderRadius: BorderRadius.circular(120.0)),\n                                child: Container(\n                                  constraints: BoxConstraints(\n                                      maxWidth:\n                                          MediaQuery.of(context).size.width -\n                                              100),\n                                  padding: EdgeInsetsDirectional.only(\n                                      start: 4, end: 4),\n                                  child: AutoSizeText.rich(\n                                    TextSpan(children: [\n                                      TextSpan(\n                                        text: AppLocalization.of(context)\n                                            .languageColonHeader,\n                                        style: TextStyle(\n                                            fontSize: 14,\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .primary,\n                                            fontWeight: FontWeight.w600),\n                                      ),\n                                      TextSpan(\n                                        text: \" \",\n                                        style: TextStyle(\n                                            fontSize: 14,\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .primary,\n                                            fontWeight: FontWeight.w600),\n                                      ),\n                                      TextSpan(\n                                        text: StateContainer.of(context)\n                                            .curLanguage\n                                            .getDisplayName(context),\n                                        style: TextStyle(\n                                            fontSize: 14,\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .textDark,\n                                            fontWeight: FontWeight.w400),\n                                      ),\n                                    ]),\n                                    textAlign: TextAlign.center,\n                                    maxLines: 1,\n                                    stepGranularity: 0.1,\n                                    style: TextStyle(fontSize: 14),\n                                  ),\n                                ),\n                                onPressed: () {\n                                  showAppDialog(\n                                      context: context,\n                                      builder: (_) => DialogOverlay(\n                                          title: AppLocalization.of(context)\n                                              .languageHeader,\n                                          optionsList: getLanguageList()));\n                                },\n                              ),\n                            ),\n                          ],\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n\n            //\"New Private Key\" and \"Import Private Key\" buttons\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.Primary,\n                  text: AppLocalization.of(context).newPrivateKeyButton,\n                  buttonTop: true,\n                  onPressed: () {\n                    Navigator.of(context).pushNamed('/intro_security_first');\n                  },\n                ),\n              ],\n            ),\n            // \"Import Private Key\" button\n            Row(\n              children: <Widget>[\n                AppButton(\n                  type: AppButtonType.PrimaryOutline,\n                  text: AppLocalization.of(context).importPrivateKeyButton,\n                  onPressed: () {\n                    Navigator.of(context)\n                        .pushNamed('/intro_import_private_key');\n                  },\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/lockscreen/lock_screen.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/authentication_method.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\n\nclass LockScreenPage extends StatefulWidget {\n  @override\n  _LockScreenPageState createState() => _LockScreenPageState();\n}\n\nclass _LockScreenPageState extends State<LockScreenPage> {\n  bool _showUnlockButton = false;\n  bool _lockedOut = true;\n  String _countDownTxt = \"\";\n\n  void _goHome() {\n    walletState.requestUpdate();\n    Navigator.of(context)\n        .pushNamedAndRemoveUntil('/overview', (Route<dynamic> route) => false);\n  }\n\n  String _formatCountDisplay(int count) {\n    if (count <= 60) {\n      // Seconds only\n      String secondsStr = count.toString();\n      if (count < 10) {\n        secondsStr = \"0\" + secondsStr;\n      }\n      return \"00:\" + secondsStr;\n    } else if (count > 60 && count <= 3600) {\n      // Minutes:Seconds\n      String minutesStr = \"\";\n      int minutes = count ~/ 60;\n      if (minutes < 10) {\n        minutesStr = \"0\" + minutes.toString();\n      } else {\n        minutesStr = minutes.toString();\n      }\n      String secondsStr = \"\";\n      int seconds = count % 60;\n      if (seconds < 10) {\n        secondsStr = \"0\" + seconds.toString();\n      } else {\n        secondsStr = seconds.toString();\n      }\n      return minutesStr + \":\" + secondsStr;\n    } else {\n      // Hours:Minutes:Seconds\n      String hoursStr = \"\";\n      int hours = count ~/ 3600;\n      if (hours < 10) {\n        hoursStr = \"0\" + hours.toString();\n      } else {\n        hoursStr = hours.toString();\n      }\n      count = count % 3600;\n      String minutesStr = \"\";\n      int minutes = count ~/ 60;\n      if (minutes < 10) {\n        minutesStr = \"0\" + minutes.toString();\n      } else {\n        minutesStr = minutes.toString();\n      }\n      String secondsStr = \"\";\n      int seconds = count % 60;\n      if (seconds < 10) {\n        secondsStr = \"0\" + seconds.toString();\n      } else {\n        secondsStr = seconds.toString();\n      }\n      return hoursStr + \":\" + minutesStr + \":\" + secondsStr;\n    }\n  }\n\n  Future<void> _runCountdown(int count) async {\n    if (count >= 1) {\n      if (mounted) {\n        setState(() {\n          _showUnlockButton = true;\n          _lockedOut = true;\n          _countDownTxt = _formatCountDisplay(count);\n        });\n      }\n      Future.delayed(Duration(seconds: 1), () {\n        _runCountdown(count - 1);\n      });\n    } else {\n      if (mounted) {\n        setState(() {\n          _lockedOut = false;\n        });\n      }\n    }\n  }\n\n  Future<void> _authenticateBiometrics() async {\n    setState(() {\n      _showUnlockButton = true;\n    });\n    bool authenticated = await AuthUtil().authenticateWithBiometrics(\n        AppLocalization.of(context).authenticateToUnlockParagraph);\n    if (authenticated) {\n      _goHome();\n    } else {\n      setState(() {\n        _showUnlockButton = true;\n      });\n    }\n  }\n\n  Future<void> _authenticatePin({bool transitions = false}) async {\n    // PIN authentication\n    String expectedPin = await sl.get<Vault>().getPin();\n    if (transitions) {\n      Navigator.of(context).push(\n        MaterialPageRoute(builder: (BuildContext context) {\n          return PinScreen(\n              type: PinOverlayType.ENTER_PIN,\n              expectedPin: expectedPin,\n              description:\n                  AppLocalization.of(context).enterPINToUnlockParagraph,\n              onSuccess: (pin) {\n                _goHome();\n              });\n        }),\n      );\n    } else {\n      Navigator.of(context).push(\n        NoPushTransitionRoute(builder: (BuildContext context) {\n          return PinScreen(\n              type: PinOverlayType.ENTER_PIN,\n              expectedPin: expectedPin,\n              description:\n                  AppLocalization.of(context).enterPINToUnlockParagraph,\n              onSuccess: (pin) {\n                _goHome();\n              });\n        }),\n      );\n    }\n    Future.delayed(Duration(milliseconds: 200), () {\n      if (mounted) {\n        setState(() {\n          _showUnlockButton = true;\n        });\n      }\n    });\n  }\n\n  Future<void> _authenticate({bool transitions = false}) async {\n    // Test if user is locked out\n    // Get duration of lockout\n    DateTime lockUntil = await sl.get<SharedPrefsUtil>().getLockDate();\n    if (lockUntil == null) {\n      await sl.get<SharedPrefsUtil>().resetLockAttempts();\n    } else {\n      int countDown = lockUntil.difference(DateTime.now().toUtc()).inSeconds;\n      // They're not allowed to attempt\n      if (countDown > 0) {\n        _runCountdown(countDown);\n        return;\n      }\n    }\n    setState(() {\n      _lockedOut = false;\n    });\n    bool useBiometrics = await AuthUtil().useBiometrics();\n    if (useBiometrics) {\n      try {\n        await _authenticateBiometrics();\n      } catch (e) {\n        await _authenticatePin(transitions: transitions);\n      }\n    } else {\n      await _authenticatePin(transitions: transitions);\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _authenticate();\n  }\n\n  void logoutPressed() {\n    showAppDialog(\n        context: context,\n        builder: (_) => DialogOverlay(\n              title: toUppercase(\n                  AppLocalization.of(context).warningHeader, context),\n              warningStyle: true,\n              confirmButtonText: toUppercase(\n                  AppLocalization.of(context).deletePrivateKeyAndLogoutButton,\n                  context),\n              body: TextSpan(\n                children: formatLocalizedColorsDanger(context,\n                    AppLocalization.of(context).logoutFirstDisclaimerParagraph),\n              ),\n              onConfirm: () {\n                Navigator.of(context).pop();\n                showAppDialog(\n                    context: context,\n                    builder: (_) => DialogOverlay(\n                        title: toUppercase(\n                            AppLocalization.of(context).areYouSureHeader,\n                            context),\n                        warningStyle: true,\n                        confirmButtonText: toUppercase(\n                            AppLocalization.of(context).yesImSureButton,\n                            context),\n                        body: TextSpan(\n                          children: formatLocalizedColorsDanger(\n                              context,\n                              AppLocalization.of(context)\n                                  .logoutSecondDisclaimerParagraph),\n                        ),\n                        onConfirm: () {\n                          // Handle logging out\n                          walletState.reset();\n                          sl.get<Vault>().deleteAll().then((_) {\n                            sl.get<SharedPrefsUtil>().deleteAll().then((_) {\n                              Navigator.of(context).pushNamedAndRemoveUntil(\n                                  '/', (Route<dynamic> route) => false);\n                            });\n                          });\n                        }));\n              },\n            ));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            //A widget that holds lock icon and background\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // A stack for background gradient and the lock icon\n                  Stack(\n                    children: <Widget>[\n                      // Container for the gradient background\n                      Container(\n                        height: (MediaQuery.of(context).padding.top +\n                            MediaQuery.of(context).size.width * 0.4),\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                        ),\n                      ),\n                      // \"Locked\" text\n                      Container(\n                        margin: EdgeInsetsDirectional.only(\n                            top: MediaQuery.of(context).padding.top +\n                                MediaQuery.of(context).size.width * 0.08),\n                        alignment: Alignment(0, 0),\n                        child: Text(\n                          toUppercase(AppLocalization.of(context).lockedHeader,\n                              context),\n                          textAlign: TextAlign.center,\n                          style: TextStyle(\n                              fontSize: 30,\n                              fontFamily: \"Metropolis\",\n                              fontWeight: FontWeight.w700),\n                        ),\n                      ),\n                      // Lock Icon\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: <Widget>[\n                          Container(\n                            margin: EdgeInsetsDirectional.only(\n                                top: MediaQuery.of(context).padding.top +\n                                    MediaQuery.of(context).size.width * 0.2),\n                            height: MediaQuery.of(context).size.width * 0.4,\n                            width: MediaQuery.of(context).size.width * 0.4,\n                            decoration: BoxDecoration(\n                                gradient: StateContainer.of(context)\n                                    .curTheme\n                                    .gradientPrimary,\n                                borderRadius: BorderRadius.circular(400)),\n                            child: Icon(Icons.lock,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .backgroundPrimary,\n                                size: MediaQuery.of(context).size.width * 0.2),\n                          ),\n                        ],\n                      ),\n                      // Logout button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, top: 30),\n                        alignment: Alignment.topLeft,\n                        child: Row(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          mainAxisAlignment: MainAxisAlignment.start,\n                          children: <Widget>[\n                            FlatButton(\n                              splashColor: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary30,\n                              highlightColor: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary15,\n                              shape: RoundedRectangleBorder(\n                                  borderRadius: BorderRadius.circular(8)),\n                              onPressed: () {\n                                logoutPressed();\n                              },\n                              padding:\n                                  EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                              // A row for logout icon and text\n                              child: Row(\n                                mainAxisSize: MainAxisSize.min,\n                                children: <Widget>[\n                                  // log out icon\n                                  Container(\n                                    margin: EdgeInsetsDirectional.only(end: 8),\n                                    child: Icon(AppIcons.logout,\n                                        size: 20,\n                                        color: StateContainer.of(context)\n                                            .curTheme\n                                            .backgroundPrimary),\n                                  ),\n                                  // Support text\n                                  Container(\n                                    constraints: BoxConstraints(\n                                        maxWidth:\n                                            (MediaQuery.of(context).size.width -\n                                                    100) *\n                                                0.4),\n                                    child: AutoSizeText(\n                                      AppLocalization.of(context).logoutHeader,\n                                      style: TextStyle(\n                                          fontWeight: FontWeight.w700,\n                                          fontSize: 14,\n                                          fontFamily: \"Metropolis\",\n                                          color: StateContainer.of(context)\n                                              .curTheme\n                                              .backgroundPrimary),\n                                      textAlign: TextAlign.center,\n                                      maxLines: 1,\n                                      minFontSize: 8,\n                                      stepGranularity: 0.1,\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n            _lockedOut\n                ? Align(\n                    alignment: Alignment.bottomCenter,\n                    child: Container(\n                      width: MediaQuery.of(context).size.width - 60,\n                      child: Text(\n                        AppLocalization.of(context).manyFailedAttemptsParagraph,\n                        style: AppStyles.paragraphDanger(context),\n                        textAlign: TextAlign.center,\n                      ),\n                    ),\n                  )\n                : SizedBox(),\n            // \"Unlock\" button\n            _showUnlockButton\n                ? Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.Primary,\n                        text: _lockedOut\n                            ? _countDownTxt\n                            : AppLocalization.of(context).unlockButton,\n                        onPressed: () async {\n                          if (!_lockedOut) {\n                            await _authenticate(transitions: true);\n                          }\n                        },\n                        disabled: _lockedOut,\n                      ),\n                    ],\n                  )\n                : SizedBox(),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/buy_account_sheet.dart",
    "content": "import 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass BuyAccountSheet extends StatefulWidget {\n  _BuyAccountSheetState createState() => _BuyAccountSheetState();\n}\n\nclass _BuyAccountSheetState extends State<BuyAccountSheet> {\n  String accountPrice = \"0.25\";\n  String fiatPrice = \"\";\n  String returnInDays = \"3\";\n\n  OverlayEntry _overlay;\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationGetAccount,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    fiatPrice = walletState.getLocalCurrencyDisplay(\n        currency: StateContainer.of(context).curCurrency,\n        amount: Currency(accountPrice),\n        decimalDigits: 2);\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .buyAccountSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    children: <Widget>[\n                      // Container for the illustration\n                      Container(\n                        margin: EdgeInsetsDirectional.only(\n                          top: 30,\n                        ),\n                        child: SvgRepaintAsset(\n                            asset: StateContainer.of(context)\n                                .curTheme\n                                .illustrationBorrowed,\n                            width: MediaQuery.of(context).size.width *\n                                (UIUtil.smallScreen(context) ? 0.6 : 0.8),\n                            height: MediaQuery.of(context).size.width *\n                                (UIUtil.smallScreen(context) ? 0.6 : 0.8) *\n                                132 /\n                                295),\n                      ),\n                      // Paragraph\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText.rich(\n                          TextSpan(\n                            children: formatLocalizedColors(\n                                context,\n                                AppLocalization.of(context)\n                                    .borrowAccountParagraph.replaceAll(\"%1\", accountPrice).replaceAll(\"%2\", \"~\" + fiatPrice).replaceAll(\"%3\", returnInDays)),\n                          ),\n                          stepGranularity: 0.5,\n                          maxLines: 9,\n                          minFontSize: 8,\n                          style: TextStyle(fontSize: 14),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                //\"Borrow an Account\" and \"Cancel\" buttons\n                Row(\n                  children: <Widget>[\n                    Observer(\n                      builder: (context) {\n                        bool disabled = !walletState.isBorrowEligible || walletState.hasExceededBorrowLimit;\n                        return AppButton(\n                          type: AppButtonType.Primary,\n                          text: toUppercase(AppLocalization.of(context)\n                              .borrowAnAccountButton\n                              ,context),\n                          disabled: disabled,\n                          buttonTop: true,\n                          onPressed: () async {\n                            if (!walletState.isBorrowEligible) {\n                              return;\n                            }\n                            showOverlay(context);\n                            dynamic resp = await walletState.initiateBorrow();\n                            if (walletState.borrowedAccount != null) {\n                              _overlay?.remove();\n                              walletState.loadWallet();\n                              if (resp is PascalAccount) {\n                                Navigator.of(context).pushReplacementNamed('/account', arguments: resp);\n                              } else {\n                                Navigator.of(context).popUntil(RouteUtils.withNameLike('/overview'));\n                                UIUtil.showSnackbar(AppLocalization.of(context).borrowStarted.replaceAll('%1', walletState.borrowedAccount.account.toString()), context);\n                              }\n                            } else {\n                              _overlay?.remove();\n                              Navigator.of(context).popUntil(RouteUtils.withNameLike('/overview'));\n                              UIUtil.showSnackbar(AppLocalization.of(context).somethingWentWrongError, context);\n                            }\n                          },\n                        );\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/confirm_free_account_sheet.dart",
    "content": "import 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/network/http_client.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:logger/logger.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass ConfirmFreeAccountSheet extends StatefulWidget {\n  final String requestId;\n\n  ConfirmFreeAccountSheet({@required this.requestId}) : super();\n\n  _ConfirmFreeAccountSheetState createState() =>\n      _ConfirmFreeAccountSheetState();\n}\n\nclass _ConfirmFreeAccountSheetState extends State<ConfirmFreeAccountSheet> {\n  final Logger log = sl.get<Logger>();\n  OverlayEntry _overlay;\n  TextEditingController codeController;\n\n  @override\n  void initState() {\n    super.initState();\n    this.codeController = TextEditingController();\n    log.d(\"confirming with request ID '${widget.requestId}'\");\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n            filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n            child: Container(\n              width: double.maxFinite,\n              height: double.maxFinite,\n              color: StateContainer.of(context).curTheme.overlay20,\n              child: Center(\n                child: //Container for the animation\n                    Container(\n                  margin: EdgeInsetsDirectional.only(\n                      top: MediaQuery.of(context).padding.top),\n                  //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n                  width: double.maxFinite,\n                  height: MediaQuery.of(context).size.width,\n                  child: Center(\n                    child: FlareActor(\n                      StateContainer.of(context).curTheme.animationGetAccount,\n                      animation: \"main\",\n                      fit: BoxFit.contain,\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n      child: Column(\n        children: <Widget>[\n          Expanded(\n            child: Container(\n              decoration: BoxDecoration(\n                color: StateContainer.of(context).curTheme.backgroundPrimary,\n                borderRadius: BorderRadius.only(\n                  topLeft: Radius.circular(12),\n                  topRight: Radius.circular(12),\n                ),\n              ),\n              child: Column(\n                children: <Widget>[\n                  // Sheet header\n                  Container(\n                    height: 60,\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                    ),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: <Widget>[\n                        // Sized Box\n                        SizedBox(\n                          height: 50,\n                          width: 65,\n                        ),\n                        // Header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 130,\n                          alignment: Alignment(0, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).freeAccountSheetHeader.toUpperCase(),\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                        // Sized Box\n                        SizedBox(\n                          height: 50,\n                          width: 65,\n                        ),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: Column(\n                      children: <Widget>[\n                        //Container for the paragraph\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).enterConfirmationCodeParagraph,\n                            maxLines: 3,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraph(context),\n                          ),\n                        ),\n                        Expanded(\n                          child: KeyboardAvoider(\n                            duration: Duration(milliseconds: 0),\n                            autoScroll: true,\n                            focusPadding: 40,\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: <Widget>[\n                                // Container for SMS confirmation code\n                                Container(\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      30, 30, 30, 30),\n                                  child: AppTextField(\n                                    label: AppLocalization.of(context).confirmationCodeTextFieldHeader,\n                                    style: AppStyles.paragraphMedium(context),\n                                    inputType: TextInputType.number,\n                                    maxLines: 1,\n                                    controller: codeController,\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  //\"CONFIRM\" and \"Go Back\" buttons\n                  Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.Primary,\n                        text: toUppercase(AppLocalization.of(context).confirmButton, context),\n                        buttonTop: true,\n                        onPressed: () async {\n                          showOverlay(context);\n                          bool success = await verifyFreepasaAccount();\n                          _overlay?.remove();\n                          if (success) {\n                            walletState.loadWallet();\n                            Navigator.popUntil(context, RouteUtils.withNameLike('/overview'));\n                            UIUtil.showSnackbar(AppLocalization.of(context).freepasaComplete, context);\n                          }\n                        },\n                      ),\n                    ],\n                  ),\n                  // \"Close\" button\n                  Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.PrimaryOutline,\n                        text: toUppercase(AppLocalization.of(context).goBackButton, context),\n                        onPressed: () {\n                          Navigator.of(context).pop();\n                        },\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  /// Verify a freepasa request, return true if valid, false if not\n  Future<bool> verifyFreepasaAccount() async {\n    try {\n      log.d(\"Sending request to verify freePASA rid: '${widget.requestId}', code ${codeController.text}\");\n      int response = await HttpAPI.verifyFreePASA(\n        widget.requestId,\n        codeController.text\n      );\n      if (response == null) {\n        log.w(\"Null response from HttpAPI.verifyFreePASA\");\n        UIUtil.showSnackbar(AppLocalization.of(context).somethingWentWrongError, context);\n        return false;\n      } else if (response < 0) {\n        log.d(\"Invalid confirmation code entered at freepasa verify\");\n        UIUtil.showSnackbar(AppLocalization.of(context).confirmationCodeError, context);\n        return false;\n      }\n      AccountNumber account = AccountNumber.fromInt(response);\n      await sl.get<SharedPrefsUtil>().setFreepasaAccount(account);\n      return true;\n    } catch (e) {\n      log.e(\"Caught exception at freepasa verify ${e.toString()}\", e);\n      return false;\n    } \n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/get_account_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/buy_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/get_free_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass GetAccountSheet extends StatefulWidget {\n  _GetAccountSheetState createState() => _GetAccountSheetState();\n}\n\nclass _GetAccountSheetState extends State<GetAccountSheet> {\n  String accountPrice = \"0.25\";\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .getAccountSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child:\n                      // Container for the illustration\n                      Container(\n                    margin: EdgeInsetsDirectional.only(top: 24, bottom: 16),\n                    child: SvgRepaintAsset(\n                      asset: StateContainer.of(context)\n                          .curTheme\n                          .illustrationTwoOptions,\n                      width: MediaQuery.of(context).size.width * 0.6,\n                      height:\n                          MediaQuery.of(context).size.width * (142 / 180) * 0.6,\n                    ),\n                  ),\n                ),\n                // Paragraph\n                Container(\n                  margin: EdgeInsetsDirectional.fromSTEB(30, 12, 30, 24),\n                  child: AutoSizeText.rich(\n                    TextSpan(\n                      children: getAccountSheetParagraphs(StateContainer.of(context).curCurrency),\n                    ),\n                    stepGranularity: 0.1,\n                    maxLines: 9,\n                    minFontSize: 8,\n                  ),\n                ),\n                //\"Get a Free Account\" and \"Buy An Account\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).getAFreeAccountButton,\n                      buttonTop: true,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                        AppSheets.showBottomSheet(\n                          context: context,\n                          widget: GetFreeAccountSheet()\n                        );\n                      },\n                    ),\n                  ],\n                ),\n                // \"Buy An Account\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).buyAnAccountButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                        AppSheets.showBottomSheet(\n                            context: context, widget: BuyAccountSheet());\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  getAccountSheetParagraphs(AvailableCurrency curCurrency) {\n    List<TextSpan> ret = [];\n    ret.add(\n      TextSpan(\n        text: AppLocalization.of(context).getAccountFirstParagraph + \"\\n\\n\",\n        style: AppStyles.paragraph(context),\n      ),\n    );\n    ret = ret + []\n      ..addAll(formatLocalizedColors(\n          context, AppLocalization.of(context).getAccountSecondParagraph));\n    ret.add(\n      TextSpan(\n        text: \"\\n\\n\",\n        style: AppStyles.paragraph(context),\n      ),\n    );\n    ret = ret + []\n      ..addAll(formatLocalizedColors(\n          context,\n          AppLocalization.of(context)\n              .getAccountThirdParagraphAlternative2\n              .replaceAll(\"%1\", accountPrice).replaceAll(\"%2\",curCurrency == null || walletState.localCurrencyPrice == null ? \"N/A\" : \"~\" + walletState.getLocalCurrencyDisplay(\n                currency: curCurrency,\n                amount: Currency(accountPrice),\n                decimalDigits: 2)).replaceAll(\"%3\", \"2\")));\n    return ret;\n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/get_free_account_sheet.dart",
    "content": "import 'dart:convert';\nimport 'dart:ui';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/network/http_client.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/confirm_free_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flare_flutter/flare_actor.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass CountryCode {\n  String isoCode;\n  String displayName;\n\n  CountryCode({@required this.isoCode, @required this.displayName});\n\n  static List<CountryCode> fromJsonList(List<dynamic> jsonList) {\n    return jsonList.map((e) => CountryCode.fromJson(e)).toList();\n  }\n\n  factory CountryCode.fromJson(Map<String, dynamic> json) {\n    return CountryCode(isoCode: json['iso'], displayName: json['text']);\n  }\n}\n\nclass GetFreeAccountSheet extends StatefulWidget {\n  _GetFreeAccountSheetState createState() => _GetFreeAccountSheetState();\n}\n\nclass _GetFreeAccountSheetState extends State<GetFreeAccountSheet> {\n  List<CountryCode> _countryCodes;\n  CountryCode _selectedCountry;\n  FixedExtentScrollController _cupertinoPickerController;\n  TextEditingController _phoneNumberController;\n  bool _showPhoneError;\n  OverlayEntry _overlay;\n\n  String requestId;\n\n  Future<List<CountryCode>> readCountryCodeFromAssets() async {\n    return CountryCode.fromJsonList(json.decode(\n        await DefaultAssetBundle.of(context)\n            .loadString(\"assets/country_phone_map.json\")));\n  }\n\n  CountryCode getDefaultCountryCode(List<CountryCode> list) {\n    String locale = Localizations.localeOf(context).countryCode.toUpperCase();\n    return list.firstWhere((cc) => cc.isoCode == locale,\n        orElse: () => list.firstWhere((cc) => cc.isoCode == 'US'));\n  }\n\n  List<Widget> _getCountryCodeForPicker() {\n    List<Widget> ret = [];\n    _countryCodes.forEach((value) {\n      ret.add(Center(\n          child: Text(\n        value?.displayName,\n        style: AppStyles.paragraphMedium(context),\n      )));\n    });\n    return ret;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _phoneNumberController = TextEditingController();\n    this._showPhoneError = false;\n    _cupertinoPickerController = FixedExtentScrollController();\n    this.requestId = null;\n    readCountryCodeFromAssets().then((values) {\n      setState(() {\n        _countryCodes = values;\n        _selectedCountry = getDefaultCountryCode(values);\n        _cupertinoPickerController = FixedExtentScrollController(\n            initialItem: _countryCodes\n                .indexWhere((cc) => cc.isoCode == _selectedCountry.isoCode));\n      });\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n      child: Column(\n        children: <Widget>[\n          Expanded(\n            child: Container(\n              decoration: BoxDecoration(\n                color: StateContainer.of(context).curTheme.backgroundPrimary,\n                borderRadius: BorderRadius.only(\n                  topLeft: Radius.circular(12),\n                  topRight: Radius.circular(12),\n                ),\n              ),\n              child: Column(\n                children: <Widget>[\n                  // Sheet header\n                  Container(\n                    height: 60,\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      gradient:\n                          StateContainer.of(context).curTheme.gradientPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                    ),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: <Widget>[\n                        // Sized Box\n                        SizedBox(\n                          height: 50,\n                          width: 65,\n                        ),\n                        // Header\n                        Container(\n                          width: MediaQuery.of(context).size.width - 130,\n                          alignment: Alignment(0, 0),\n                          child: AutoSizeText(\n                            toUppercase(\n                                AppLocalization.of(context)\n                                    .freeAccountSheetHeader,\n                                context),\n                            style: AppStyles.header(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                        // Sized Box\n                        SizedBox(\n                          height: 50,\n                          width: 65,\n                        ),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: Column(\n                      children: <Widget>[\n                        //Container for the paragraph\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AutoSizeText(\n                            AppLocalization.of(context)\n                                .enterPhoneNumberParagraph,\n                            maxLines: 3,\n                            stepGranularity: 0.1,\n                            style: AppStyles.paragraph(context),\n                          ),\n                        ),\n\n                        Expanded(\n                          child: KeyboardAvoider(\n                            duration: Duration(milliseconds: 0),\n                            autoScroll: true,\n                            focusPadding: 40,\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: <Widget>[\n                                // \"Country Code\" header\n                                Container(\n                                  width: MediaQuery.of(context).size.width - 60,\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      30, 30, 30, 0),\n                                  child: AutoSizeText(\n                                    AppLocalization.of(context)\n                                        .countryCodeTextFieldHeader,\n                                    style: AppStyles.textFieldLabel(context),\n                                    maxLines: 1,\n                                    stepGranularity: 0.1,\n                                    textAlign: TextAlign.start,\n                                  ),\n                                ),\n                                Container(\n                                    margin: EdgeInsetsDirectional.only(\n                                        start: 30, end: 30),\n                                    child: FlatButton(\n                                      onPressed: () {\n                                        if (_countryCodes == null) {\n                                          return;\n                                        }\n                                        showCountryCodePicker();\n                                      },\n                                      padding: EdgeInsets.all(0),\n                                      child: Column(\n                                        children: <Widget>[\n                                          // Container for country code\n                                          Container(\n                                            width: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                60,\n                                            margin:\n                                                EdgeInsetsDirectional.fromSTEB(\n                                                    0, 14, 0, 0),\n                                            child: AutoSizeText.rich(\n                                              TextSpan(children: [\n                                                TextSpan(\n                                                  text: _selectedCountry\n                                                      ?.displayName,\n                                                  style:\n                                                      AppStyles.paragraphMedium(\n                                                          context),\n                                                ),\n                                              ]),\n                                              maxLines: 1,\n                                              stepGranularity: 0.1,\n                                              textAlign: TextAlign.start,\n                                            ),\n                                          ),\n                                          // Container for the underline\n                                          Container(\n                                            width: double.maxFinite,\n                                            margin:\n                                                EdgeInsetsDirectional.fromSTEB(\n                                                    0, 10, 0, 0),\n                                            height: 1,\n                                            color: StateContainer.of(context)\n                                                .curTheme\n                                                .primary,\n                                          ),\n                                        ],\n                                      ),\n                                    )),\n                                // Container for phone number field\n                                Container(\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      30, 30, 30, 40),\n                                  child: AppTextField(\n                                    label: AppLocalization.of(context)\n                                        .phoneNumberTextFieldHeader,\n                                    style: AppStyles.paragraphMedium(context),\n                                    controller: _phoneNumberController,\n                                    maxLines: 1,\n                                    inputType: TextInputType.phone,\n                                    inputFormatters: [\n                                      PhoneNumberFormatter(),\n                                      FilteringTextInputFormatter.allow(\n                                          RegExp(\"[0-9-]\"))\n                                    ],\n                                    onChanged: (text) {\n                                      if (mounted && this._showPhoneError) {\n                                        setState(() {\n                                          this._showPhoneError = false;\n                                        });\n                                      }\n                                    },\n                                  ),\n                                ),\n                                // Error Text\n                                ErrorContainer(\n                                  errorText: this._showPhoneError\n                                      ? AppLocalization.of(context)\n                                          .invalidPhoneNumberParagraph\n                                      : \"\",\n                                ),\n                              ],\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  //\"Send Confirmation\" and \"Cancel\" buttons\n                  Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.Primary,\n                        text:\n                            AppLocalization.of(context).sendConfirmationButton,\n                        buttonTop: true,\n                        onPressed: () async {\n                          if (this.requestId == null) {\n                            showOverlay(context);\n                            String result = await onSubmitted();\n                            _overlay?.remove();\n                            if (result != null) {\n                              this.requestId = result;\n                              AppSheets.showBottomSheet(\n                                  context: context,\n                                  widget: ConfirmFreeAccountSheet(\n                                    requestId: result,\n                                  ),\n                                  noBlur: true);\n                            }\n                          } else {\n                            AppSheets.showBottomSheet(\n                                context: context,\n                                widget: ConfirmFreeAccountSheet(\n                                    requestId: this.requestId),\n                                noBlur: true);\n                          }\n                        },\n                      ),\n                    ],\n                  ),\n                  // \"Close\" button\n                  Row(\n                    children: <Widget>[\n                      AppButton(\n                        type: AppButtonType.PrimaryOutline,\n                        text: AppLocalization.of(context).cancelButton,\n                        onPressed: () {\n                          Navigator.of(context).pop();\n                        },\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showOverlay(BuildContext context) {\n    OverlayState overlayState = Overlay.of(context);\n    _overlay = OverlayEntry(\n      builder: (context) => BackdropFilter(\n        filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n        child: Container(\n          width: double.maxFinite,\n          height: double.maxFinite,\n          color: StateContainer.of(context).curTheme.overlay20,\n          child: Center(\n            child: //Container for the animation\n                Container(\n              margin: EdgeInsetsDirectional.only(\n                  top: MediaQuery.of(context).padding.top),\n              //Width/Height ratio for the animation is needed because BoxFit is not working as expected\n              width: double.maxFinite,\n              height: MediaQuery.of(context).size.width,\n              child: Center(\n                child: FlareActor(\n                  StateContainer.of(context).curTheme.animationGetAccount,\n                  animation: \"main\",\n                  fit: BoxFit.contain,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n    overlayState.insert(_overlay);\n  }\n\n  Future<void> showCountryCodePicker() async {\n    CountryCode countrySelection;\n    await showCupertinoModalPopup(\n      context: context,\n      builder: (context) {\n        return Container(\n          height: MediaQuery.of(context).size.height * 0.4,\n          child: Material(\n            child: CupertinoPicker(\n                backgroundColor:\n                    StateContainer.of(context).curTheme.backgroundPrimary,\n                useMagnifier: true,\n                magnification: 1.5,\n                scrollController: _cupertinoPickerController,\n                onSelectedItemChanged: (index) {\n                  countrySelection = _countryCodes[index];\n                },\n                itemExtent: 30,\n                children: _getCountryCodeForPicker()),\n          ),\n        );\n      },\n    );\n    if (countrySelection != null) {\n      setState(() {\n        _selectedCountry = countrySelection;\n        _cupertinoPickerController = FixedExtentScrollController(\n            initialItem: _countryCodes\n                .indexWhere((cc) => cc.isoCode == _selectedCountry.isoCode));\n      });\n    }\n  }\n\n  // Submit request, return request ID if successful\n  Future<String> onSubmitted() async {\n    // Validate phone number\n    if (_phoneNumberController.text.replaceAll(RegExp(r\"[^0-9]\"), \"\").length <\n        5) {\n      if (mounted) {\n        setState(() {\n          _showPhoneError = true;\n        });\n      }\n      return null;\n    }\n    // Make free pasa request\n    String response = await HttpAPI.getFreePASA(\n        _selectedCountry.isoCode,\n        _phoneNumberController.text,\n        PublicKeyCoder().encodeToBase58(walletState.publicKey));\n    // Error occured if null, otherwise move on to verification screen\n    if (response == null) {\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).somethingWentWrongError, context);\n      return null;\n    }\n    return response;\n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/overview.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/buy_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/get_account_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/overview/public_key_overview_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/settings.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/routes.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/account_card.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/placeholder_account_card.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/reactive_refresh.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/svg_repaint.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:firebase_messaging/firebase_messaging.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass OverviewPage extends StatefulWidget {\n  OverviewPage();\n  @override\n  _OverviewPageState createState() => _OverviewPageState();\n}\n\nclass _OverviewPageState extends State<OverviewPage>\n    with SingleTickerProviderStateMixin, WidgetsBindingObserver {\n  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();\n  // Opacity Animation\n  Animation<double> _opacityAnimation;\n  AnimationController _opacityAnimationController;\n\n  // Pull to refresh\n  bool _isRefreshing;\n  // Whether to lock app\n  bool _lockDisabled;\n\n  int accountToLogin; // Account to login after a notification\n  bool walletLoaded;\n\n  Future<void> walletLoad() async {\n    await walletState?.loadWallet();\n    if (accountToLogin != null && !walletState.walletLoading) {\n      _switchToAccount(accountToLogin);\n      accountToLogin = null;\n    }\n    if (!walletLoaded) {\n      walletLoaded = true;\n      walletState.fcmUpdateBulk();\n    }\n  }\n\n  StreamSubscription<DaemonChangedEvent> _daemonChangeSub;\n  StreamSubscription<DisableLockTimeoutEvent> _disableLockSub;\n\n  void _registerBus() {\n    _daemonChangeSub = EventTaxiImpl.singleton()\n        .registerTo<DaemonChangedEvent>()\n        .listen((event) {\n      walletLoad();\n    });\n    // Hackish event to block auto-lock functionality\n    _disableLockSub = EventTaxiImpl.singleton()\n        .registerTo<DisableLockTimeoutEvent>()\n        .listen((event) {\n      if (event.disable) {\n        cancelLockEvent();\n      }\n      _lockDisabled = event.disable;\n    });\n  }\n\n  void _destroyBus() {\n    if (_daemonChangeSub != null) {\n      _daemonChangeSub.cancel();\n    }\n    if (_disableLockSub != null) {\n      _disableLockSub.cancel();\n    }\n  }\n\n  // To lock and unlock the app\n  StreamSubscription<dynamic> lockStreamListener;\n\n  Future<void> setAppLockEvent() async {\n    if (await sl.get<SharedPrefsUtil>().getLock() && !_lockDisabled) {\n      if (lockStreamListener != null) {\n        lockStreamListener.cancel();\n      }\n      Future<dynamic> delayed = new Future.delayed(\n          (await sl.get<SharedPrefsUtil>().getLockTimeout()).getDuration());\n      delayed.then((_) {\n        return true;\n      });\n      lockStreamListener = delayed.asStream().listen((_) {\n        Navigator.of(context)\n            .pushNamedAndRemoveUntil('/', (Route<dynamic> route) => false);\n      });\n    }\n  }\n\n  Future<void> cancelLockEvent() async {\n    if (lockStreamListener != null) {\n      lockStreamListener.cancel();\n    }\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    switch (state) {\n      case AppLifecycleState.paused:\n        setAppLockEvent();\n        walletState.disconnect();\n        break;\n      case AppLifecycleState.resumed:\n        cancelLockEvent();\n        walletState.reconnect();\n        super.didChangeAppLifecycleState(state);\n        break;\n      default:\n        super.didChangeAppLifecycleState(state);\n        break;\n    }\n  }\n\n  void _switchToAccount(int account) {\n    bool exists = false;\n    walletState.walletAccounts.forEach((acct) {\n      if (acct.account.account == account) {\n        exists = true;\n        if (walletState.activeAccount != AccountNumber.fromInt(account)) {\n          Navigator.popUntil(context, RouteUtils.withNameLike('/overview'));\n          Navigator.pushNamed(context, '/account', arguments: acct);\n        }\n      }\n    });\n    // Disable notifications for this acct\n    if (!exists) {\n      walletState.fcmDeleteAccount(AccountNumber.fromInt(account));\n    }\n  }\n\n  void _chooseCorrectAccountFromNotification(dynamic message) {\n    if (message.containsKey(\"account\")) {\n      int account = int.tryParse(message['account']);\n      if (account != null) {\n        if (!walletState.walletLoading) {\n          _switchToAccount(account);\n        } else {\n          accountToLogin = account;\n        }\n      }\n    }\n  }\n\n  void getNotificationPermissions() async {\n    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async {\n      try {\n        _chooseCorrectAccountFromNotification(message.data);\n      } catch (e) {}\n    });\n    try {\n      NotificationSettings settings = await FirebaseMessaging.instance\n          .requestPermission(sound: true, badge: true, alert: true);\n      if (settings.alert == AppleNotificationSetting.enabled ||\n          settings.badge == AppleNotificationSetting.enabled ||\n          settings.sound == AppleNotificationSetting.enabled ||\n          settings.authorizationStatus == AuthorizationStatus.authorized) {\n        sl.get<SharedPrefsUtil>().getNotificationsSet().then((beenSet) {\n          if (!beenSet) {\n            sl.get<SharedPrefsUtil>().setNotificationsOn(true);\n          }\n        });\n      } else {\n        sl.get<SharedPrefsUtil>().setNotificationsOn(false).then((_) {});\n      }\n    } catch (e) {\n      sl.get<SharedPrefsUtil>().setNotificationsOn(false);\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    walletLoaded = false;\n    _registerBus();\n    getNotificationPermissions();\n    WidgetsBinding.instance.addObserver(this);\n    _isRefreshing = false;\n    _lockDisabled = false;\n    // Load the wallet, total balance, etc.\n    walletLoad();\n    // Opacity Animation\n    _opacityAnimationController = AnimationController(\n      duration: const Duration(milliseconds: 500),\n      vsync: this,\n    );\n    _opacityAnimation = Tween(begin: 1.0, end: 0.4).animate(\n      CurvedAnimation(\n        parent: _opacityAnimationController,\n        curve: Curves.easeIn,\n        reverseCurve: Curves.easeOut,\n      ),\n    );\n    _startAnimation();\n  }\n\n  void _animationStatusListener(AnimationStatus status) {\n    switch (status) {\n      case AnimationStatus.dismissed:\n        _opacityAnimationController.forward();\n        break;\n      case AnimationStatus.completed:\n        _opacityAnimationController.reverse();\n        break;\n      default:\n        return null;\n    }\n  }\n\n  void _animationControllerListener() {\n    if (walletState.walletLoading) {\n      setState(() {});\n    } else {\n      _disposeAnimations();\n    }\n  }\n\n  void _disposeAnimations() {\n    try {\n      _opacityAnimation?.removeStatusListener(_animationStatusListener);\n      _opacityAnimationController?.removeListener(_animationControllerListener);\n      _opacityAnimationController?.dispose();\n    } catch (e) {}\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    _disposeAnimations();\n    _destroyBus();\n    super.dispose();\n  }\n\n  void _startAnimation() {\n    _opacityAnimationController.addListener(_animationControllerListener);\n    _opacityAnimation.addStatusListener(_animationStatusListener);\n    _opacityAnimationController.forward();\n  }\n\n  // Refresh list\n  Future<void> _refresh() async {\n    setState(() {\n      _isRefreshing = true;\n    });\n    HapticUtil.success();\n    walletState.requestUpdate();\n    // Hide refresh indicator after 3 seconds if no server response\n    Future.delayed(new Duration(seconds: 3), () {\n      if (mounted) {\n        setState(() {\n          _isRefreshing = false;\n        });\n      }\n    });\n    walletLoad().whenComplete(() {\n      if (mounted) {\n        setState(() {\n          _isRefreshing = false;\n        });\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      drawerEdgeDragWidth: 200,\n      key: _scaffoldKey,\n      resizeToAvoidBottomInset: false,\n      endDrawer: SizedBox(\n          width: double.infinity, child: Drawer(child: SettingsPage())),\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Column(\n          children: <Widget>[\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.center,\n                children: <Widget>[\n                  // A stack for the main card and the background gradient\n                  Stack(\n                    children: <Widget>[\n                      // Container for the gradient background\n                      Container(\n                        height: 65 +\n                            (MediaQuery.of(context).padding.top) +\n                            (20 - (MediaQuery.of(context).padding.bottom) / 2),\n                        decoration: BoxDecoration(\n                          gradient: StateContainer.of(context)\n                              .curTheme\n                              .gradientPrimary,\n                        ),\n                      ),\n                      //Container for the main card\n                      Container(\n                        height: 130,\n                        margin: EdgeInsetsDirectional.fromSTEB(\n                            12,\n                            (MediaQuery.of(context).padding.top) +\n                                (20 -\n                                    (MediaQuery.of(context).padding.bottom) /\n                                        2),\n                            12,\n                            0),\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                            gradient: StateContainer.of(context)\n                                .curTheme\n                                .gradientPrimary,\n                            borderRadius: BorderRadius.circular(12),\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowMainCard,\n                            ]),\n                        child: ClipRRect(\n                          borderRadius: BorderRadius.circular(12),\n                          child: Material(\n                            color: Colors.transparent,\n                            child: InkWell(\n                              onTap: () {\n                                AppSheets.showBottomSheet(\n                                    context: context,\n                                    widget: PublicKeyOverviewSheet());\n                              },\n                              highlightColor: StateContainer.of(context)\n                                  .curTheme\n                                  .textLight15,\n                              splashColor: StateContainer.of(context)\n                                  .curTheme\n                                  .textLight30,\n                              child: Row(\n                                mainAxisAlignment:\n                                    MainAxisAlignment.spaceBetween,\n                                crossAxisAlignment: CrossAxisAlignment.center,\n                                children: <Widget>[\n                                  // Column for balance texts\n                                  Column(\n                                    mainAxisAlignment: MainAxisAlignment.center,\n                                    crossAxisAlignment:\n                                        CrossAxisAlignment.start,\n                                    children: <Widget>[\n                                      // Container for \"TOTAL BALANCE\" text\n                                      Container(\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            24, 0, 24, 0),\n                                        child: AutoSizeText(\n                                          toUppercase(\n                                              AppLocalization.of(context)\n                                                  .totalBalanceHeader,\n                                              context),\n                                          style:\n                                              AppStyles.paragraphTextLightSmall(\n                                                  context),\n                                        ),\n                                      ),\n                                      // Container for the balance\n                                      Container(\n                                          width: MediaQuery.of(context)\n                                                  .size\n                                                  .width -\n                                              160,\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  24, 4, 24, 4),\n                                          child: Observer(\n                                              builder: (BuildContext context) {\n                                            if (walletState.walletLoading) {\n                                              return Opacity(\n                                                opacity:\n                                                    _opacityAnimation.value,\n                                                child: Align(\n                                                  alignment: Alignment(-1, 0),\n                                                  child: Container(\n                                                    decoration: BoxDecoration(\n                                                      color: StateContainer.of(\n                                                              context)\n                                                          .curTheme\n                                                          .textLight\n                                                          .withOpacity(0.75),\n                                                      borderRadius:\n                                                          BorderRadius.circular(\n                                                              100),\n                                                    ),\n                                                    child: AutoSizeText(\n                                                      \"             \",\n                                                      style: AppStyles.header(\n                                                          context),\n                                                      maxLines: 1,\n                                                      minFontSize: 8,\n                                                      stepGranularity: 1,\n                                                    ),\n                                                  ),\n                                                ),\n                                              );\n                                            } else {\n                                              return AutoSizeText.rich(\n                                                TextSpan(\n                                                  children: [\n                                                    TextSpan(\n                                                      text: \"\",\n                                                      style: AppStyles\n                                                          .iconFontTextLightPascal(\n                                                              context),\n                                                    ),\n                                                    TextSpan(\n                                                        text: \" \",\n                                                        style: TextStyle(\n                                                            fontSize: 12)),\n                                                    TextSpan(\n                                                        text: walletState\n                                                            .totalWalletBalance\n                                                            .toStringOpt(),\n                                                        style: AppStyles.header(\n                                                            context)),\n                                                  ],\n                                                ),\n                                                maxLines: 1,\n                                                minFontSize: 8,\n                                                stepGranularity: 1,\n                                                style: TextStyle(\n                                                  fontSize: 28,\n                                                ),\n                                              );\n                                            }\n                                          })),\n                                      // Container for the fiat conversion\n                                      Container(\n                                        margin: EdgeInsetsDirectional.fromSTEB(\n                                            24, 0, 24, 0),\n                                        child: Observer(\n                                          builder: (BuildContext context) {\n                                            if (walletState.walletLoading ||\n                                                walletState\n                                                        .localCurrencyPrice ==\n                                                    null ||\n                                                walletState\n                                                        .totalWalletBalance ==\n                                                    null) {\n                                              return Opacity(\n                                                opacity:\n                                                    _opacityAnimation.value,\n                                                child: Container(\n                                                  decoration: BoxDecoration(\n                                                    color: StateContainer.of(\n                                                            context)\n                                                        .curTheme\n                                                        .textLight\n                                                        .withOpacity(0.75),\n                                                    borderRadius:\n                                                        BorderRadius.circular(\n                                                            100),\n                                                  ),\n                                                  child: AutoSizeText(\n                                                    \"                  \",\n                                                    style: AppStyles\n                                                        .paragraphTextLightSmall(\n                                                            context),\n                                                  ),\n                                                ),\n                                              );\n                                            } else {\n                                              return AutoSizeText(\n                                                \"(${walletState.getLocalCurrencyDisplay(currency: StateContainer.of(context).curCurrency, amount: walletState.totalWalletBalance)})\",\n                                                style: AppStyles\n                                                    .paragraphTextLightSmall(\n                                                        context),\n                                              );\n                                            }\n                                          },\n                                        ),\n                                      )\n                                    ],\n                                  ),\n                                  // Column for settings icon and price text\n                                  Column(\n                                    mainAxisAlignment:\n                                        MainAxisAlignment.spaceBetween,\n                                    crossAxisAlignment: CrossAxisAlignment.end,\n                                    children: <Widget>[\n                                      // Settings Icon\n                                      Container(\n                                        margin: EdgeInsetsDirectional.only(\n                                            top: 2, end: 2),\n                                        height: 50,\n                                        width: 50,\n                                        child: FlatButton(\n                                            highlightColor:\n                                                StateContainer.of(context)\n                                                    .curTheme\n                                                    .textLight15,\n                                            splashColor:\n                                                StateContainer.of(context)\n                                                    .curTheme\n                                                    .textLight30,\n                                            onPressed: () {\n                                              _scaffoldKey.currentState\n                                                  .openEndDrawer();\n                                            },\n                                            shape: RoundedRectangleBorder(\n                                                borderRadius:\n                                                    BorderRadius.circular(\n                                                        50.0)),\n                                            padding: EdgeInsets.all(0.0),\n                                            child: Icon(AppIcons.settings,\n                                                color:\n                                                    StateContainer.of(context)\n                                                        .curTheme\n                                                        .textLight,\n                                                size: 24)),\n                                      ),\n                                      Container(\n                                        margin: EdgeInsetsDirectional.only(\n                                            end: 16, bottom: 12),\n                                        child: Observer(\n                                          builder: (BuildContext context) {\n                                            if (walletState\n                                                    .localCurrencyPrice ==\n                                                null) {\n                                              return Opacity(\n                                                opacity:\n                                                    _opacityAnimation.value,\n                                                child: Container(\n                                                  decoration: BoxDecoration(\n                                                    color: StateContainer.of(\n                                                            context)\n                                                        .curTheme\n                                                        .textLight\n                                                        .withOpacity(0.75),\n                                                    borderRadius:\n                                                        BorderRadius.circular(\n                                                            100),\n                                                  ),\n                                                  child: AutoSizeText(\n                                                    \"            \",\n                                                    style: AppStyles\n                                                        .paragraphTextLightSmallSemiBold(\n                                                            context),\n                                                  ),\n                                                ),\n                                              );\n                                            } else {\n                                              return AutoSizeText(\n                                                \"${walletState.getLocalCurrencyDisplay(currency: StateContainer.of(context).curCurrency, amount: Currency('1'), decimalDigits: 3)}\",\n                                                style: AppStyles\n                                                    .paragraphTextLightSmallSemiBold(\n                                                        context),\n                                              );\n                                            }\n                                          },\n                                        ),\n                                      ),\n                                    ],\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                  Observer(builder: (BuildContext context) {\n                    // Wallet loaded with no accounts\n                    if (walletState.walletLoading) {\n                      return Expanded(\n                        child: Column(\n                          children: <Widget>[\n                            // Accounts text\n                            Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(24, 18, 24, 4),\n                              alignment: Alignment(-1, 0),\n                              child: AutoSizeText(\n                                toUppercase(\n                                    AppLocalization.of(context).accountsHeader,\n                                    context),\n                                style: AppStyles.headerSmall(context),\n                                textAlign: TextAlign.left,\n                                stepGranularity: 0.5,\n                                maxLines: 1,\n                              ),\n                            ),\n                            // Accounts List\n                            Expanded(\n                              child: Stack(\n                                children: <Widget>[\n                                  // The list\n                                  ReactiveRefreshIndicator(\n                                      backgroundColor:\n                                          StateContainer.of(context)\n                                              .curTheme\n                                              .backgroundPrimary,\n                                      onRefresh: _refresh,\n                                      isRefreshing: _isRefreshing,\n                                      child: ListView(\n                                        padding: EdgeInsetsDirectional.fromSTEB(\n                                            0, 3, 0, 19),\n                                        children: _getPlaceholderAccountCards(),\n                                      )),\n                                  // The gradient at the top\n                                  Container(\n                                    height: 8,\n                                    width: double.maxFinite,\n                                    decoration: BoxDecoration(\n                                        gradient: StateContainer.of(context)\n                                            .curTheme\n                                            .gradientListTop),\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ],\n                        ),\n                      );\n                    } else if (walletState.walletAccounts.isEmpty) {\n                      return Expanded(\n                          child: ReactiveRefreshIndicator(\n                              backgroundColor: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary,\n                              onRefresh: _refresh,\n                              isRefreshing: _isRefreshing,\n                              child: SingleChildScrollView(\n                                physics: AlwaysScrollableScrollPhysics(),\n                                padding: EdgeInsets.all(0),\n                                child: Container(\n                                  height: MediaQuery.of(context).size.height -\n                                      (130 +\n                                          ((MediaQuery.of(context)\n                                                  .padding\n                                                  .top) +\n                                              (20 -\n                                                  (MediaQuery.of(context)\n                                                          .padding\n                                                          .bottom) /\n                                                      2))) -\n                                      ((MediaQuery.of(context).padding.bottom) +\n                                          (24 -\n                                              (MediaQuery.of(context)\n                                                      .padding\n                                                      .bottom) /\n                                                  2)) -\n                                      50 -\n                                      20,\n                                  child: Center(\n                                    child: Column(\n                                      mainAxisAlignment:\n                                          MainAxisAlignment.center,\n                                      children: <Widget>[\n                                        Container(\n                                          margin:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  30, 0, 30, 0),\n                                          child: AutoSizeText.rich(\n                                            TextSpan(\n                                                children: formatLocalizedColors(\n                                                    context,\n                                                    AppLocalization.of(context)\n                                                        .newWalletGreetingParagraph)),\n                                            stepGranularity: 0.5,\n                                            maxLines: 10,\n                                            minFontSize: 8,\n                                            textAlign: TextAlign.center,\n                                            style: TextStyle(fontSize: 14),\n                                          ),\n                                        ),\n                                        // Container for the illustration\n                                        Container(\n                                          margin: EdgeInsetsDirectional.only(\n                                            top: 24,\n                                          ),\n                                          child: SvgRepaintAsset(\n                                              asset: StateContainer.of(context)\n                                                  .curTheme\n                                                  .illustrationNewWallet,\n                                              width: MediaQuery.of(context)\n                                                      .size\n                                                      .width *\n                                                  0.55,\n                                              height: MediaQuery.of(context)\n                                                      .size\n                                                      .width *\n                                                  0.55),\n                                        )\n                                      ],\n                                    ),\n                                  ),\n                                ),\n                              )));\n                    } else {\n                      // Wallet Cards\n                      return Expanded(\n                        child: Column(\n                          children: <Widget>[\n                            // Accounts text\n                            Container(\n                              margin:\n                                  EdgeInsetsDirectional.fromSTEB(24, 18, 24, 4),\n                              alignment: Alignment(-1, 0),\n                              child: AutoSizeText(\n                                toUppercase(\n                                    AppLocalization.of(context).accountsHeader,\n                                    context),\n                                style: AppStyles.headerSmall(context),\n                                textAlign: TextAlign.left,\n                                stepGranularity: 0.5,\n                                maxLines: 1,\n                              ),\n                            ),\n                            // Accounts List\n                            Expanded(\n                              child: Stack(\n                                children: <Widget>[\n                                  // The list\n                                  ReactiveRefreshIndicator(\n                                      backgroundColor:\n                                          StateContainer.of(context)\n                                              .curTheme\n                                              .backgroundPrimary,\n                                      onRefresh: _refresh,\n                                      isRefreshing: _isRefreshing,\n                                      child: ListView.builder(\n                                          physics:\n                                              AlwaysScrollableScrollPhysics(),\n                                          padding:\n                                              EdgeInsetsDirectional.fromSTEB(\n                                                  0, 3, 0, 19),\n                                          itemCount:\n                                              walletState.walletAccounts.length,\n                                          itemBuilder: (context, index) {\n                                            return AccountCard(\n                                                account: walletState\n                                                    .walletAccounts[index]);\n                                          })),\n                                  // The gradient at the top\n                                  Container(\n                                    height: 8,\n                                    width: double.maxFinite,\n                                    decoration: BoxDecoration(\n                                        gradient: StateContainer.of(context)\n                                            .curTheme\n                                            .gradientListTop),\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ],\n                        ),\n                      );\n                    }\n                  }),\n                  // Bottom bar\n                  Observer(builder: (BuildContext context) {\n                    if (walletState.walletLoading) {\n                      // Animated button when loading\n                      return Container(\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                          color: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary,\n                          borderRadius: BorderRadius.only(\n                            topLeft: Radius.circular(12),\n                            topRight: Radius.circular(12),\n                          ),\n                          boxShadow: [\n                            StateContainer.of(context).curTheme.shadowBottomBar,\n                          ],\n                        ),\n                        child: Container(\n                          margin: EdgeInsetsDirectional.only(top: 4),\n                          child: Opacity(\n                            opacity: _opacityAnimation.value,\n                            child: Row(\n                              children: <Widget>[\n                                AppButton(\n                                  text: \"                           \",\n                                  type: AppButtonType.Primary,\n                                  onPressed: () {\n                                    return null;\n                                  },\n                                  placeholder: true,\n                                ),\n                              ],\n                            ),\n                          ),\n                        ),\n                      );\n                    } else if (walletState.walletAccounts.length > 0) {\n                      if (walletState.isBorrowEligible &&\n                          !walletState.hasExceededBorrowLimit) {\n                        return Container(\n                          width: double.maxFinite,\n                          decoration: BoxDecoration(\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                            borderRadius: BorderRadius.only(\n                              topLeft: Radius.circular(12),\n                              topRight: Radius.circular(12),\n                            ),\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowBottomBar,\n                            ],\n                          ),\n                          child: Container(\n                            margin: EdgeInsetsDirectional.only(top: 4),\n                            child: Row(\n                              children: <Widget>[\n                                AppButton(\n                                  text: AppLocalization.of(context)\n                                      .getAnAccountButton,\n                                  type: AppButtonType.Primary,\n                                  onPressed: () {\n                                    AppSheets.showBottomSheet(\n                                        context: context,\n                                        widget: BuyAccountSheet());\n                                  },\n                                ),\n                              ],\n                            ),\n                          ),\n                        );\n                      } else {\n                        return Container(\n                          width: double.maxFinite,\n                          decoration: BoxDecoration(\n                            color: StateContainer.of(context)\n                                .curTheme\n                                .backgroundPrimary,\n                            borderRadius: BorderRadius.only(\n                              topLeft: Radius.circular(12),\n                              topRight: Radius.circular(12),\n                            ),\n                            boxShadow: [\n                              StateContainer.of(context)\n                                  .curTheme\n                                  .shadowBottomBar,\n                            ],\n                          ),\n                          child: Container(\n                            margin: EdgeInsetsDirectional.only(top: 4),\n                            child: Row(\n                              children: <Widget>[\n                                AppButton(\n                                  text: AppLocalization.of(context)\n                                      .viewPublicKeyHeader,\n                                  type: AppButtonType.Primary,\n                                  onPressed: () {\n                                    AppSheets.showBottomSheet(\n                                        context: context,\n                                        widget: PublicKeyOverviewSheet());\n                                  },\n                                ),\n                              ],\n                            ),\n                          ),\n                        );\n                      }\n                    } else {\n                      return Container(\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                          color: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary,\n                          borderRadius: BorderRadius.only(\n                            topLeft: Radius.circular(12),\n                            topRight: Radius.circular(12),\n                          ),\n                          boxShadow: [\n                            StateContainer.of(context).curTheme.shadowBottomBar,\n                          ],\n                        ),\n                        child: Container(\n                          margin: EdgeInsetsDirectional.only(top: 4),\n                          child: Row(\n                            children: <Widget>[\n                              AppButton(\n                                text: AppLocalization.of(context)\n                                    .getAnAccountButton,\n                                type: AppButtonType.Primary,\n                                onPressed: () {\n                                  if (walletState.walletLoading) {\n                                    return null;\n                                  } else {\n                                    AppSheets.showBottomSheet(\n                                        context: context,\n                                        widget: GetAccountSheet());\n                                  }\n                                },\n                              ),\n                            ],\n                          ),\n                        ),\n                      );\n                    }\n                  })\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  List<Widget> _getPlaceholderAccountCards() {\n    List<Widget> ret = [];\n    for (var i = 0; i < 7; i++) {\n      ret.add(Opacity(\n          opacity: _opacityAnimation.value, child: PlaceholderAccountCard()));\n    }\n    return ret;\n  }\n}\n"
  },
  {
    "path": "lib/ui/overview/public_key_overview_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:qr/qr.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:quiver/strings.dart';\n\nclass PublicKeyOverviewSheet extends StatefulWidget {\n  PublicKeyOverviewSheet();\n\n  _PublicKeyOverviewSheetState createState() => _PublicKeyOverviewSheetState();\n}\n\nclass _PublicKeyOverviewSheetState extends State<PublicKeyOverviewSheet> {\n  bool _keyCopied;\n  Timer _keyCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    _keyCopied = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: <Widget>[\n        Container(\n          decoration: BoxDecoration(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            borderRadius: BorderRadius.only(\n              topLeft: Radius.circular(12),\n              topRight: Radius.circular(12),\n            ),\n          ),\n          child: Column(\n            children: <Widget>[\n              // Sheet header\n              Container(\n                height: 60,\n                width: double.maxFinite,\n                decoration: BoxDecoration(\n                  gradient: StateContainer.of(context).curTheme.gradientPrimary,\n                  borderRadius: BorderRadius.only(\n                    topLeft: Radius.circular(12),\n                    topRight: Radius.circular(12),\n                  ),\n                ),\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                  children: <Widget>[\n                    // Sized Box\n                    SizedBox(\n                      height: 50,\n                      width: 65,\n                    ),\n                    // Header\n                    Container(\n                      width: MediaQuery.of(context).size.width - 130,\n                      alignment: Alignment(0, 0),\n                      child: AutoSizeText(\n                        toUppercase(AppLocalization.of(context).publicKeySheetHeader, context),\n                        style: AppStyles.header(context),\n                        maxLines: 1,\n                        stepGranularity: 0.1,\n                        textAlign: TextAlign.center,\n                      ),\n                    ),\n                    // Sized Box\n                    SizedBox(\n                      height: 50,\n                      width: 65,\n                    ),\n                  ],\n                ),\n              ),\n              // QR Code\n              Container(\n                margin: EdgeInsetsDirectional.only(top: 30, bottom: 10),\n                child: Stack(\n                  alignment: Alignment(0, 0),\n                  children: <Widget>[\n                    // Gradient\n                    Container(\n                      width: 198,\n                      height: 198,\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(12),\n                        gradient:\n                            StateContainer.of(context).curTheme.gradientPrimary,\n                      ),\n                    ),\n                    // White overlay\n                    Container(\n                      width: 189,\n                      height: 189,\n                      decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(8),\n                          color: Colors.white),\n                    ),\n                    // QR Code\n                    QrImage(\n                      data: PublicKeyCoder()\n                          .encodeToBase58(walletState.publicKey),\n                      size: 198,\n                      errorCorrectionLevel: QrErrorCorrectLevel.Q,\n                      gapless: false,\n                      version: 9,\n                    ),\n                    // Logo background\n                    Container(\n                      width: 64,\n                      height: 64,\n                      decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(16),\n                          color: Colors.white),\n                    ),\n                    // Logo\n                    Container(\n                      width: 53,\n                      height: 53,\n                      decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(12),\n                        gradient:\n                            StateContainer.of(context).curTheme.gradientPrimary,\n                      ),\n                      child: Icon(AppIcons.pascalsymbol,\n                          color: StateContainer.of(context)\n                              .curTheme\n                              .backgroundPrimary,\n                          size: 33),\n                    ),\n                  ],\n                ),\n              ),\n              //\"Copy Address\" and \"Request Amount\" buttons\n              Row(\n                children: <Widget>[\n                  AppButton(\n                    type: _keyCopied\n                        ? AppButtonType.Success\n                        : AppButtonType.Primary,\n                    text: _keyCopied\n                        ? AppLocalization.of(context).keyCopiedButton\n                        : AppLocalization.of(context).copyPublicKeyButton,\n                    onPressed: () {\n                      if (walletState.publicKey != null) {\n                        Clipboard.setData(ClipboardData(\n                            text: PublicKeyCoder()\n                                .encodeToBase58(walletState.publicKey)));\n                      }\n                      setState(() {\n                        _keyCopied = true;\n                      });\n                      if (_keyCopiedTimer != null) {\n                        _keyCopiedTimer.cancel();\n                      }\n                      _keyCopiedTimer =\n                          Timer(const Duration(milliseconds: 1500), () {\n                        if (mounted) {\n                          setState(() {\n                            _keyCopied = false;\n                          });\n                        }\n                      });\n                    },\n                  ),\n                ],\n              ),\n              // \"Request\" button\n              /*Row(\n                children: <Widget>[\n                  AppButton(\n                    type: AppButtonType.PrimaryOutline,\n                    text: AppLocalization.of(context).requestButton,\n                    onPressed: () {\n                        Navigator.of(context).pop();\n                        AppSheets.showBottomSheet(\n                            context: context,\n                            widget: RequestSheet(address: widget.accountNumber.toString()));\n                      },\n                  ),\n                ],\n              ),*/\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/backup_private_key/backup_private_key_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/backup_private_key/encrypt_private_key_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/backup_private_key/unencrypted_private_key_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/pin_screen.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\n\nclass BackupPrivateKeySheet extends StatefulWidget {\n  _BackupPrivateKeySheetState createState() => _BackupPrivateKeySheetState();\n}\n\nclass _BackupPrivateKeySheetState extends State<BackupPrivateKeySheet> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .privateKeySheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText.rich(\n                          TextSpan(\n                            children: [\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                        .backupKeyFirstParagraph +\n                                    \"\\n\\n\",\n                                style: AppStyles.paragraph(context),\n                              ),\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                        .backupKeySecondParagraph +\n                                    \"\\n\\n\",\n                                style: AppStyles.paragraphPrimary(context),\n                              ),\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                        .backupKeyThirdParagraph +\n                                    \"\\n\\n\",\n                                style: AppStyles.paragraphPrimary(context),\n                              ),\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                    .backupKeyFourthParagraph,\n                                style: AppStyles.paragraph(context),\n                              ),\n                            ],\n                          ),\n                          stepGranularity: 0.5,\n                          maxLines: 14,\n                          minFontSize: 8,\n                          style: TextStyle(fontSize: 14),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                //\"Encrypted Key\" and \"Unencrypted Key\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).encryptedKeyButton,\n                      buttonTop: true,\n                      onPressed: () async {\n                        await authenticate(true);\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).unencryptedKeyButton,\n                      onPressed: () async {\n                        await authenticate(false);\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> _authenticateBiometrics(AuthUtil authUtil, String message, bool encrypted) async {\n    bool authenticated = await authUtil.authenticateWithBiometrics(message);\n    if (authenticated) {\n      HapticUtil.fingerprintSucess();\n      Navigator.of(context).pop();\n      if (encrypted) {\n        AppSheets.showBottomSheet(\n            context: context, widget: EncryptPrivateKeySheet());\n      } else {\n        AppSheets.showBottomSheet(\n            context: context, widget: UnencryptedPrivateKeySheet());\n      }\n    }    \n  }\n\n  Future<void> _authenticatePin(bool encrypted, String message) async {\n    String expectedPin = await sl.get<Vault>().getPin();\n    await Navigator.of(context).push(MaterialPageRoute(\n      builder: (BuildContext context) {\n        return PinScreen(\n          type: PinOverlayType.ENTER_PIN,\n          onSuccess: (pin) {\n            Navigator.of(context).pop();\n            Navigator.of(context).pop();\n            if (encrypted) {\n              AppSheets.showBottomSheet(\n                  context: context, widget: EncryptPrivateKeySheet());\n            } else {\n              AppSheets.showBottomSheet(\n                  context: context, widget: UnencryptedPrivateKeySheet());\n            }\n          },\n          expectedPin: expectedPin,\n          description: message,\n        );\n      },\n    ));    \n  }\n\n  Future<void> authenticate(bool encrypted) async {\n    String message = AppLocalization.of(context).authenticateToBackUpParagraph;\n    // Authenticate\n    AuthUtil authUtil = AuthUtil();\n    if (await authUtil.useBiometrics()) {\n      // Biometric auth\n      try {\n        await _authenticateBiometrics(authUtil, message, encrypted);\n      } catch (e) {\n        await _authenticatePin(encrypted, message);\n      }\n    } else {\n      await _authenticatePin(encrypted, message);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/backup_private_key/encrypt_private_key_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/backup_private_key/encrypted_private_key_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass EncryptPrivateKeySheet extends StatefulWidget {\n  _EncryptPrivateKeySheetState createState() => _EncryptPrivateKeySheetState();\n}\n\nclass _EncryptPrivateKeySheetState extends State<EncryptPrivateKeySheet> {\n  FocusNode passwordFocusNode;\n  TextEditingController passwordController;\n  FocusNode confirmPasswordFocusNode;\n  TextEditingController confirmPasswordController;\n\n  String passwordError;\n\n  bool passwordsMatch;\n\n  @override\n  void initState() {\n    super.initState();\n    this.passwordsMatch = false;\n    this.passwordFocusNode = FocusNode();\n    this.confirmPasswordFocusNode = FocusNode();\n    this.passwordController = TextEditingController();\n    this.confirmPasswordController = TextEditingController();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .encryptSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).encryptKeyParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for new password field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .newPasswordTextFieldHeader,\n                                  style: this.passwordsMatch ? AppStyles.paragraphMediumPrimary(context) : AppStyles.paragraphMedium(context),\n                                  maxLines: 1,\n                                  passwordField: true,\n                                  focusNode: passwordFocusNode,\n                                  controller: passwordController,\n                                  onChanged: (String newText) {\n                                    if (passwordError != null) {\n                                      setState(() {\n                                        passwordError = null;\n                                      });\n                                    }\n                                    if (confirmPasswordController.text ==\n                                        passwordController.text) {\n                                      if (mounted) {\n                                        setState(() {\n                                          passwordsMatch = true;\n                                        });\n                                      }\n                                    } else {\n                                      if (mounted) {\n                                        setState(() {\n                                          passwordsMatch = false;\n                                        });\n                                      }\n                                    }\n                                  },\n                                  textInputAction: TextInputAction.next,\n                                  onSubmitted: (text) {\n                                    confirmPasswordFocusNode.requestFocus();\n                                  },\n                                ),\n                              ),\n                              // Container for confirm password field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 40),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .confirmPasswordTextFieldHeader,\n                                  style: this.passwordsMatch ? AppStyles.paragraphMediumPrimary(context) : AppStyles.paragraphMedium(context),\n                                  maxLines: 1,\n                                  passwordField: true,\n                                  focusNode: confirmPasswordFocusNode,\n                                  controller: confirmPasswordController,\n                                  onChanged: (String newText) {\n                                    if (passwordError != null) {\n                                      setState(() {\n                                        passwordError = null;\n                                      });\n                                    }\n                                    if (confirmPasswordController.text ==\n                                        passwordController.text) {\n                                      if (mounted) {\n                                        setState(() {\n                                          passwordsMatch = true;\n                                        });\n                                      }\n                                    } else {\n                                      if (mounted) {\n                                        setState(() {\n                                          passwordsMatch = false;\n                                        });\n                                      }\n                                    }\n                                  },\n                                ),\n                              ),\n                              // Error text\n                              Container(\n                                margin: EdgeInsetsDirectional.only(\n                                    start: 30, end: 30, top: 4, bottom: 40),\n                                child: AutoSizeText(\n                                  passwordError == null ? \"\" : passwordError,\n                                  style: AppStyles.paragraphPrimary(context),\n                                  textAlign: TextAlign.start,\n                                ),\n                              )\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"Encrypt\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).encryptButton,\n                      buttonTop: true,\n                      onPressed: () {\n                        validatePasswordMatchAndEncrypt();\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        )\n      ],\n    ));\n  }\n\n  void validatePasswordMatchAndEncrypt() {\n    if (passwordController.text != confirmPasswordController.text) {\n      setState(() {\n        passwordError = AppLocalization.of(context).noMatchPasswordError;\n      });\n    } else if (passwordController.text.isEmpty) {\n      setState(() {\n        passwordError = AppLocalization.of(context).emptyPasswordError;\n      });\n    } else {\n      sl.get<Vault>().getPrivateKey().then((pkStr) {\n        PrivateKey pk =\n            PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(pkStr));\n        String encrypted = PDUtil.byteToHex(\n            PrivateKeyCrypt.encrypt(pk, passwordController.text));\n        Navigator.of(context).pop();\n        AppSheets.showBottomSheet(\n            context: context,\n            widget: EncryptedPrivateKeySheet(encryptedKey: encrypted));\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/backup_private_key/encrypted_private_key_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass EncryptedPrivateKeySheet extends StatefulWidget {\n  final String encryptedKey;\n\n  EncryptedPrivateKeySheet({this.encryptedKey});\n\n  _EncryptedPrivateKeySheetState createState() =>\n      _EncryptedPrivateKeySheetState();\n}\n\nclass _EncryptedPrivateKeySheetState extends State<EncryptedPrivateKeySheet> {\n  bool _keyCopied;\n  bool _showingKey;\n  Timer _keyCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    _keyCopied = false;\n    _showingKey = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .privateKeySheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText.rich(\n                          TextSpan(\n                            children: [\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                        .backupEncryptedKeyFirstParagraph +\n                                    \"\\n\\n\",\n                                style: AppStyles.paragraph(context),\n                              ),\n                              TextSpan(\n                                text: AppLocalization.of(context)\n                                    .backupEncryptedKeySecondParagraph,\n                                style: AppStyles.paragraphPrimary(context),\n                              ),\n                            ],\n                          ),\n                          stepGranularity: 0.5,\n                          maxLines: 10,\n                          minFontSize: 8,\n                          style: TextStyle(fontSize: 14),\n                        ),\n                      ),\n                      // Container for the private key\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 24, 30, 0),\n                        padding: EdgeInsetsDirectional.fromSTEB(24, 12, 24, 12),\n                        decoration: BoxDecoration(\n                          borderRadius: BorderRadius.circular(12),\n                          border: Border.all(\n                              width: 1,\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .primary15),\n                          color: StateContainer.of(context).curTheme.primary10,\n                        ),\n                        child: AutoSizeText(\n                          _showingKey\n                              ? widget.encryptedKey\n                              : '•' * widget.encryptedKey.length,\n                          maxLines: 4,\n                          stepGranularity: 0.1,\n                          minFontSize: 8,\n                          textAlign: TextAlign.center,\n                          style: AppStyles.privateKeyPrimary(context),\n                        ),\n                      ),\n                      // Container for the Show/Hide button\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.end,\n                        children: <Widget>[\n                          Container(\n                            decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(100.0),\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary,\n                              boxShadow: [\n                                StateContainer.of(context)\n                                    .curTheme\n                                    .shadowTextDark,\n                              ],\n                            ),\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                            height: 40,\n                            child: FlatButton(\n                              shape: RoundedRectangleBorder(\n                                  borderRadius: BorderRadius.circular(100.0)),\n                              child: AutoSizeText(\n                                _showingKey\n                                    ? AppLocalization.of(context).hideButton\n                                    : AppLocalization.of(context).showButton,\n                                textAlign: TextAlign.center,\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                style: AppStyles.buttonMiniBg(context),\n                              ),\n                              onPressed: () {\n                                setState(() {\n                                  _showingKey = !_showingKey;\n                                });\n                              },\n                            ),\n                          ),\n                        ],\n                      ),\n                    ],\n                  ),\n                ),\n                //\"Copy Encrypted Key\" and \"Close\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: _keyCopied\n                          ? AppButtonType.Success\n                          : AppButtonType.Primary,\n                      text: _keyCopied\n                          ? AppLocalization.of(context).keyCopiedButton\n                          : AppLocalization.of(context).copyEncryptedKeyButton,\n                      buttonTop: true,\n                      onPressed: () {\n                        UserDataUtil.setSecureClipboardItem(widget.encryptedKey);\n                        setState(() {\n                          _keyCopied = true;\n                        });\n                        if (_keyCopiedTimer != null) {\n                          _keyCopiedTimer.cancel();\n                        }\n                        _keyCopiedTimer =\n                            Timer(const Duration(milliseconds: 1500), () {\n                          if (mounted) {\n                            setState(() {\n                              _keyCopied = false;\n                            });\n                          }\n                        });\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/backup_private_key/unencrypted_private_key_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass UnencryptedPrivateKeySheet extends StatefulWidget {\n  _UnencryptedPrivateKeySheetState createState() =>\n      _UnencryptedPrivateKeySheetState();\n}\n\nclass _UnencryptedPrivateKeySheetState\n    extends State<UnencryptedPrivateKeySheet> {\n  bool _keyCopied;\n  bool _showingKey;\n  Timer _keyCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    _keyCopied = false;\n    _showingKey = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .privateKeySheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText.rich(\n                          TextSpan(\n                            children: formatLocalizedColors(\n                                context,\n                                AppLocalization.of(context)\n                                    .backupUnencryptedKeyParagraph),\n                          ),\n                          stepGranularity: 0.5,\n                          maxLines: 6,\n                          minFontSize: 8,\n                          style: TextStyle(fontSize: 14),\n                        ),\n                      ),\n                      // Container for the private key\n                      Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 24, 30, 0),\n                          padding:\n                              EdgeInsetsDirectional.fromSTEB(30, 12, 30, 12),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .primary15),\n                            color:\n                                StateContainer.of(context).curTheme.primary10,\n                          ),\n                          child: FutureBuilder(\n                              future: sl.get<Vault>().getPrivateKey(),\n                              builder: (BuildContext context,\n                                  AsyncSnapshot snapshot) {\n                                if (snapshot.hasData && snapshot.data != null) {\n                                  return AutoSizeText(\n                                      _showingKey\n                                          ? snapshot.data\n                                          : '•' * snapshot.data.length,\n                                      maxLines: 4,\n                                      stepGranularity: 0.1,\n                                      minFontSize: 8,\n                                      textAlign: TextAlign.center,\n                                      style:\n                                          AppStyles.privateKeyPrimary(context));\n                                } else {\n                                  return SizedBox();\n                                }\n                              })),\n                      // Container for the Show/Hide button\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.end,\n                        children: <Widget>[\n                          Container(\n                            decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(100.0),\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .backgroundPrimary,\n                              boxShadow: [\n                                StateContainer.of(context)\n                                    .curTheme\n                                    .shadowTextDark,\n                              ],\n                            ),\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 12, 30, 0),\n                            height: 40,\n                            child: FlatButton(\n                              shape: RoundedRectangleBorder(\n                                  borderRadius: BorderRadius.circular(100.0)),\n                              child: AutoSizeText(\n                                _showingKey\n                                    ? AppLocalization.of(context).hideButton\n                                    : AppLocalization.of(context).showButton,\n                                textAlign: TextAlign.center,\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                                style: AppStyles.buttonMiniBg(context),\n                              ),\n                              onPressed: () {\n                                setState(() {\n                                  _showingKey = !_showingKey;\n                                });\n                              },\n                            ),\n                          ),\n                        ],\n                      ),\n                    ],\n                  ),\n                ),\n                //\"Copy Unencrypted Key\" and \"Close\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: _keyCopied\n                          ? AppButtonType.Success\n                          : AppButtonType.Primary,\n                      text: _keyCopied\n                          ? AppLocalization.of(context).keyCopiedButton\n                          : AppLocalization.of(context)\n                              .copyUnencryptedKeyButton,\n                      buttonTop: true,\n                      onPressed: () {\n                        sl.get<Vault>().getPrivateKey().then((key) {\n                          UserDataUtil.setSecureClipboardItem(key);\n                        });\n                        setState(() {\n                          _keyCopied = true;\n                        });\n                        if (_keyCopiedTimer != null) {\n                          _keyCopiedTimer.cancel();\n                        }\n                        _keyCopiedTimer =\n                            Timer(const Duration(milliseconds: 1500), () {\n                          if (mounted) {\n                            setState(() {\n                              _keyCopied = false;\n                            });\n                          }\n                        });\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/change_daemon_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:validators/validators.dart';\n\nclass ChangeDaemonSheet extends StatefulWidget {\n  final Function onChanged;\n\n  ChangeDaemonSheet({this.onChanged}) : super();\n\n  _ChangeDaemonSheetState createState() => _ChangeDaemonSheetState();\n}\n\nclass _ChangeDaemonSheetState extends State<ChangeDaemonSheet> {\n  FocusNode daemonFocusNode;\n  TextEditingController daemonController;\n\n  String daemonError;\n\n  @override\n  void initState() {\n    super.initState();\n    this.daemonFocusNode = FocusNode();\n    this.daemonController = TextEditingController();\n    sl.get<SharedPrefsUtil>().getRpcUrl().then((val) {\n      if (mounted) {\n        daemonController.text = val;\n      }\n    });\n    this.daemonFocusNode.addListener(() {\n      if (!this.daemonFocusNode.hasFocus) {\n        if (isIP(daemonController.text)) {\n          if (!daemonController.text.contains(\":\")) {\n            daemonController.text = daemonController.text + \":4003\";\n          }\n        }\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Close Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.close,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 20)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .changeDaemonSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        width: double.maxFinite,\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 40, 30, 20),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).changeDaemonParagraph,\n                          style: AppStyles.paragraph(context),\n                          stepGranularity: 0.1,\n                          maxLines: 3,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Expanded(\n                        child: KeyboardAvoider(\n                          duration: Duration(milliseconds: 0),\n                          autoScroll: true,\n                          focusPadding: 40,\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // Container for the name text field\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 10, 30, 0),\n                                child: AppTextField(\n                                  label: AppLocalization.of(context)\n                                      .addressTextFieldHeader,\n                                  style: AppStyles.paragraphMedium(context),\n                                  maxLines: 1,\n                                  firstButton: TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getClipboardText(\n                                              DataType.URL);\n                                      if (text != null) {\n                                        daemonController.text = text;\n                                      }\n                                    },\n                                  ),\n                                  controller: daemonController,\n                                  focusNode: daemonFocusNode,\n                                  onChanged: () {\n                                    if (daemonError != null) {\n                                      setState(() {\n                                        daemonError = null;\n                                      });\n                                    }\n                                  },\n                                ),\n                              ),\n                              // Error Container\n                              ErrorContainer(\n                                errorText: daemonError ?? \"\",\n                              ),\n                              // Container for the \"Set to Default\" button\n                              Row(\n                                children: <Widget>[\n                                  Container(\n                                    decoration: BoxDecoration(\n                                      borderRadius:\n                                          BorderRadius.circular(100.0),\n                                      color: StateContainer.of(context)\n                                          .curTheme\n                                          .backgroundPrimary,\n                                      boxShadow: [\n                                        StateContainer.of(context)\n                                            .curTheme\n                                            .shadowTextDark,\n                                      ],\n                                    ),\n                                    margin: EdgeInsetsDirectional.fromSTEB(\n                                        30, 30, 30, 40),\n                                    height: 40,\n                                    child: FlatButton(\n                                      shape: RoundedRectangleBorder(\n                                          borderRadius:\n                                              BorderRadius.circular(100.0)),\n                                      child: AutoSizeText(\n                                        AppLocalization.of(context)\n                                            .setToDefaultButton,\n                                        textAlign: TextAlign.center,\n                                        maxLines: 1,\n                                        stepGranularity: 0.1,\n                                        style: AppStyles.buttonMiniBg(context),\n                                      ),\n                                      onPressed: () {\n                                        daemonFocusNode.unfocus();\n                                        daemonController.text =\n                                            AppConstants.DEFAULT_RPC_HTTP_URL;\n                                      },\n                                    ),\n                                  ),\n                                ],\n                              ),\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // \"CHANGE DAEMON\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: toUppercase(AppLocalization.of(context)\n                          .changeDaemonButton\n                          ,context),\n                      onPressed: () async {\n                        if (validateFormData()) {\n                          String daemon = daemonController.text;\n                          if (daemon == AppConstants.DEFAULT_RPC_HTTP_URL) {\n                            await sl.get<SharedPrefsUtil>().resetRpcUrl();\n                          } else {\n                            await sl.get<SharedPrefsUtil>().setRpcUrl(daemon);\n                          }\n                          walletState.changeRpcUrl(daemon);\n                          if (widget.onChanged != null) {\n                            widget.onChanged(daemon);\n                          }\n                          UIUtil.showSnackbar(\n                              AppLocalization.of(context)\n                                  .urlChangedToParagraph\n                                  .replaceAll(\"%1\", daemon),\n                              context);\n                          Navigator.of(context).pop();\n                        }\n                      },\n                      buttonTop: true,\n                    ),\n                  ],\n                ),\n                // \"CANCEL\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: toUppercase(AppLocalization.of(context)\n                          .cancelButton\n                          ,context),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  bool validateFormData() {\n    if (!isIP(daemonController.text) && !isURL(daemonController.text)) {\n      setState(() {\n        daemonError = AppLocalization.of(context).invalidAddressError;\n      });\n      return false;\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/contacts/add_contact_sheet.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/formatters.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/error_container.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/payload.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:keyboard_avoider/keyboard_avoider.dart';\nimport 'package:pascaldart/common.dart';\nimport 'package:quiver/strings.dart';\n\nclass AddContactSheet extends StatefulWidget {\n  final AccountNumber account;\n\n  AddContactSheet({this.account});\n\n  _AddContactSheetState createState() => _AddContactSheetState();\n}\n\nclass _AddContactSheetState extends State<AddContactSheet> {\n  FocusNode nameFocusNode;\n  FocusNode addressFocusNode;\n  TextEditingController nameController;\n  TextEditingController addressController;\n\n  String payload;\n  String nameError;\n  String accountError;\n\n  @override\n  void initState() {\n    super.initState();\n    this.nameFocusNode = FocusNode();\n    this.addressFocusNode = FocusNode();\n    this.nameController = TextEditingController();\n    this.addressController = TextEditingController();\n    this.payload = \"\";\n    if (widget.account == null) {\n      this.addressFocusNode.addListener(() {\n        if (!this.addressFocusNode.hasFocus) {\n          try {\n            AccountNumber numberFormatted =\n                AccountNumber(this.addressController.text);\n            this.addressController.text = numberFormatted.toString();\n          } catch (e) {}\n        }\n      });\n    } else {\n      this.addressController.text = widget.account.toString();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                      // Container for the address text field\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(\n                              AppLocalization.of(context).addContactSheetHeader,\n                              context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: KeyboardAvoider(\n                    duration: Duration(milliseconds: 0),\n                    autoScroll: true,\n                    focusPadding: 40,\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Container for the name text field\n                        Container(\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                            child: AppTextField(\n                              label: AppLocalization.of(context)\n                                  .contactNameTextFieldHeader,\n                              style: AppStyles.contactsItemName(context),\n                              prefix: Text(\n                                \" \",\n                                style: AppStyles.iconFontPrimarySmall(context),\n                              ),\n                              maxLines: 1,\n                              focusNode: nameFocusNode,\n                              controller: nameController,\n                              inputFormatters: [\n                                LengthLimitingTextInputFormatter(20)\n                              ],\n                              onChanged: (newText) {\n                                if (isNotEmpty(nameError)) {\n                                  setState(() {\n                                    nameError = null;\n                                  });\n                                }\n                              },\n                              textInputAction: TextInputAction.newline,\n                              onSubmitted: (text) {\n                                addressFocusNode.requestFocus();\n                              },\n                            )),\n                        ErrorContainer(\n                          errorText: nameError ?? \"\",\n                        ),\n                        // Container for the address text field\n                        Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                          child: AppTextField(\n                            label: AppLocalization.of(context)\n                                .addressTextFieldHeader,\n                            style: AppStyles.contactsItemAddress(context),\n                            firstButton: widget.account == null\n                                ? TextFieldButton(\n                                    icon: AppIcons.paste,\n                                    onPressed: () {\n                                      UserDataUtil.getClipboardText(\n                                              DataType.ACCOUNT)\n                                          .then((account) {\n                                        if (account != null) {\n                                          addressController.text = account;\n                                        }\n                                      });\n                                    },\n                                  )\n                                : null,\n                            secondButton: widget.account == null\n                                ? TextFieldButton(\n                                    icon: AppIcons.scan,\n                                    onPressed: () async {\n                                      String text =\n                                          await UserDataUtil.getQRData(\n                                              DataType.ACCOUNT,\n                                              StateContainer.of(context)\n                                                  .curTheme\n                                                  .scannerTheme);\n                                      if (text != null) {\n                                        addressController.text = text;\n                                      }\n                                    })\n                                : null,\n                            maxLines: 1,\n                            textCapitalization: TextCapitalization.characters,\n                            controller: addressController,\n                            focusNode: addressFocusNode,\n                            inputFormatters: [\n                              FilteringTextInputFormatter.allow(\n                                  RegExp(\"[0-9-]\")),\n                              PascalAccountFormatter()\n                            ],\n                            onChanged: (newText) {\n                              if (isNotEmpty(accountError)) {\n                                setState(() {\n                                  accountError = null;\n                                });\n                              }\n                            },\n                            readOnly: widget.account != null,\n                          ),\n                        ),\n                        ErrorContainer(\n                          errorText: accountError ?? \"\",\n                        ),\n                        // Container for the \"Add Payload\" button\n                        Payload(\n                          onPayloadChanged: (newPayload, encrypted) {\n                            setState(() {\n                              payload = newPayload;\n                            });\n                          },\n                          allowEncryption: false,\n                        )\n                      ],\n                    ),\n                  ),\n                ),\n                //\"Add Contact\" and \"Close\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.Primary,\n                      text: AppLocalization.of(context).addContactButton,\n                      buttonTop: true,\n                      onPressed: () async {\n                        if (await validateForm()) {\n                          Contact newContact = Contact(\n                              account: widget.account == null\n                                  ? AccountNumber(addressController.text)\n                                  : widget.account,\n                              name: nameController.text,\n                              payload: payload);\n                          await sl.get<DBHelper>().saveContact(newContact);\n                          EventTaxiImpl.singleton()\n                              .fire(ContactAddedEvent(contact: newContact));\n                          UIUtil.showSnackbar(\n                              AppLocalization.of(context)\n                                  .addedToContactsParagraph\n                                  .replaceAll(\"%1\", newContact.name),\n                              context);\n                          EventTaxiImpl.singleton()\n                              .fire(ContactModifiedEvent(contact: newContact));\n                          Navigator.of(context).pop();\n                        }\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ));\n  }\n\n  Future<bool> validateForm() async {\n    bool isValid = true;\n    // Address Validations\n    // Don't validate address if it came pre-filled in\n    if (widget.account == null) {\n      if (addressController.text.isEmpty) {\n        isValid = false;\n        setState(() {\n          accountError = AppLocalization.of(context).invalidAccountError;\n        });\n      } else {\n        try {\n          AccountNumber acctNum = AccountNumber(addressController.text);\n          addressFocusNode.unfocus();\n          bool exists =\n              await sl.get<DBHelper>().contactExistsWithAccount(acctNum);\n          if (exists) {\n            isValid = false;\n            setState(() {\n              accountError =\n                  AppLocalization.of(context).contactAlreadyExistsError;\n            });\n          }\n        } catch (e) {\n          isValid = false;\n          setState(() {\n            accountError = AppLocalization.of(context).invalidAccountError;\n          });\n        }\n      }\n    }\n    // Name Validations\n    if (nameController.text.isEmpty) {\n      isValid = false;\n      setState(() {\n        nameError = AppLocalization.of(context).nameRequiredError;\n      });\n    } else {\n      bool nameExists =\n          await sl.get<DBHelper>().contactExistsWithName(nameController.text);\n      if (nameExists) {\n        isValid = false;\n        setState(() {\n          nameError = AppLocalization.of(context).contactAlreadyExistsError;\n        });\n      }\n    }\n    return isValid;\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/contacts/contact_detail_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/account/send/send_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/webview.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\n\nclass ContactDetailSheet extends StatefulWidget {\n  final Contact contact;\n  final Account account;\n\n  ContactDetailSheet({this.contact, this.account});\n  _ContactDetailSheetState createState() => _ContactDetailSheetState();\n}\n\nclass _ContactDetailSheetState extends State<ContactDetailSheet> {\n  bool contactNameCopied;\n  Timer contactNameCopiedTimer;\n  bool contactAddressCopied;\n  Timer contactAddressCopiedTimer;\n  bool contactPayloadCopied;\n  Timer contactPayloadCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    contactNameCopied = false;\n    contactAddressCopied = false;\n    contactPayloadCopied = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Trashcan Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 5, end: 10),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () async {\n                              bool deleted = await sl\n                                  .get<DBHelper>()\n                                  .deleteContact(widget.contact);\n                              if (deleted) {\n                                EventTaxiImpl.singleton().fire(\n                                    ContactRemovedEvent(\n                                        contact: widget.contact));\n                                EventTaxiImpl.singleton().fire(\n                                    ContactModifiedEvent(\n                                        contact: widget.contact));\n                                UIUtil.showSnackbar(\n                                    AppLocalization.of(context)\n                                        .removedFromContactsParagraph\n                                        .replaceAll(\"%1\", widget.contact.name),\n                                    context);\n                                Navigator.of(context).pop();\n                              } else {\n                                UIUtil.showSnackbar(\n                                    AppLocalization.of(context)\n                                        .failedToRemoveFromContactsParagraph\n                                        .replaceAll(\"%1\", widget.contact.name),\n                                    context);\n                              }\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.trashcan,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 24)),\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .contactSheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Search Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 10, end: 5),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              AppWebView.showWebView(context,\n                                  'http://explorer.pascalcoin.org/account.php?account=${widget.contact.account.toString()}');\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.search,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 24)),\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: SingleChildScrollView(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Contact name gesture detector\n                        GestureDetector(\n                          onTapDown: (details) {\n                            _copyToClipboard(\"Contact Name\");\n                          },\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // \"Contact Name\" header\n                              Container(\n                                width: double.maxFinite,\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 40, 30, 0),\n                                child: AutoSizeText(\n                                  contactNameCopied\n                                      ? AppLocalization.of(context).copiedButton\n                                      : AppLocalization.of(context)\n                                          .contactNameTextFieldHeader,\n                                  style: contactNameCopied\n                                      ? AppStyles.textFieldLabelSuccess(context)\n                                      : AppStyles.textFieldLabel(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              ),\n                              // Container for the Contact Name\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: contactNameCopied\n                                          ? StateContainer.of(context)\n                                              .curTheme\n                                              .success15\n                                          : StateContainer.of(context)\n                                              .curTheme\n                                              .textDark15),\n                                  color: contactNameCopied\n                                      ? StateContainer.of(context)\n                                          .curTheme\n                                          .success10\n                                      : StateContainer.of(context)\n                                          .curTheme\n                                          .textDark10,\n                                ),\n                                child: AutoSizeText.rich(\n                                  TextSpan(children: [\n                                    TextSpan(\n                                      text: \" \",\n                                      style: contactNameCopied\n                                          ? AppStyles.iconFontSuccessSmall(\n                                              context)\n                                          : AppStyles.iconFontPrimarySmall(\n                                              context),\n                                    ),\n                                    TextSpan(\n                                      text: widget.contact.name,\n                                      style: contactNameCopied\n                                          ? AppStyles.contactsItemNameSuccess(\n                                              context)\n                                          : AppStyles.contactsItemName(context),\n                                    ),\n                                  ]),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                  style: TextStyle(fontSize: 14.0),\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                        GestureDetector(\n                          onTapDown: (details) {\n                            _copyToClipboard(\"Address\");\n                          },\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: <Widget>[\n                              // \"Address\" header\n                              Container(\n                                width: double.maxFinite,\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 30, 30, 0),\n                                child: AutoSizeText(\n                                  contactAddressCopied\n                                      ? AppLocalization.of(context).copiedButton\n                                      : AppLocalization.of(context)\n                                          .addressTextFieldHeader,\n                                  style: contactAddressCopied\n                                      ? AppStyles.textFieldLabelSuccess(context)\n                                      : AppStyles.textFieldLabel(context),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  textAlign: TextAlign.start,\n                                ),\n                              ),\n                              // Container for the address\n                              Container(\n                                margin: EdgeInsetsDirectional.fromSTEB(\n                                    30, 12, 30, 0),\n                                padding: EdgeInsetsDirectional.fromSTEB(\n                                    12, 8, 12, 8),\n                                decoration: BoxDecoration(\n                                  borderRadius: BorderRadius.circular(12),\n                                  border: Border.all(\n                                      width: 1,\n                                      color: contactAddressCopied\n                                          ? StateContainer.of(context)\n                                              .curTheme\n                                              .success15\n                                          : StateContainer.of(context)\n                                              .curTheme\n                                              .textDark15),\n                                  color: contactAddressCopied\n                                      ? StateContainer.of(context)\n                                          .curTheme\n                                          .success10\n                                      : StateContainer.of(context)\n                                          .curTheme\n                                          .textDark10,\n                                ),\n                                child: AutoSizeText(\n                                  widget.contact.account.toString(),\n                                  maxLines: 1,\n                                  stepGranularity: 0.1,\n                                  minFontSize: 8,\n                                  textAlign: TextAlign.center,\n                                  style: contactAddressCopied\n                                      ? AppStyles.privateKeySuccess(context)\n                                      : AppStyles.privateKeyTextDark(context),\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                        isNotEmpty(widget.contact.payload)\n                            ? GestureDetector(\n                                onTapDown: (details) {\n                                  _copyToClipboard(\"Payload\");\n                                },\n                                child: Column(\n                                  crossAxisAlignment: CrossAxisAlignment.start,\n                                  children: <Widget>[\n                                    // \"Payload\" header\n                                    Container(\n                                      width: double.maxFinite,\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          30, 30, 30, 0),\n                                      child: AutoSizeText(\n                                        contactPayloadCopied\n                                            ? AppLocalization.of(context)\n                                                .copiedButton\n                                            : AppLocalization.of(context)\n                                                .payloadTextFieldHeader,\n                                        style: contactPayloadCopied\n                                            ? AppStyles.textFieldLabelSuccess(\n                                                context)\n                                            : AppStyles.textFieldLabel(context),\n                                        maxLines: 1,\n                                        stepGranularity: 0.1,\n                                        textAlign: TextAlign.start,\n                                      ),\n                                    ),\n                                    // Container for the payload text\n                                    Container(\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          30, 12, 30, 0),\n                                      padding: EdgeInsetsDirectional.fromSTEB(\n                                          12, 8, 12, 8),\n                                      decoration: BoxDecoration(\n                                        borderRadius: BorderRadius.circular(12),\n                                        border: Border.all(\n                                            width: 1,\n                                            color: contactPayloadCopied\n                                                ? StateContainer.of(context)\n                                                    .curTheme\n                                                    .success15\n                                                : StateContainer.of(context)\n                                                    .curTheme\n                                                    .textDark15),\n                                        color: contactPayloadCopied\n                                            ? StateContainer.of(context)\n                                                .curTheme\n                                                .success10\n                                            : StateContainer.of(context)\n                                                .curTheme\n                                                .textDark10,\n                                      ),\n                                      child: Container(\n                                        constraints: BoxConstraints(\n                                            maxWidth: MediaQuery.of(context)\n                                                    .size\n                                                    .width -\n                                                86),\n                                        child: AutoSizeText(\n                                          widget.contact.payload,\n                                          maxLines: 3,\n                                          stepGranularity: 0.1,\n                                          minFontSize: 8,\n                                          textAlign: TextAlign.center,\n                                          style: contactPayloadCopied\n                                              ? AppStyles.paragraphSuccess(\n                                                  context)\n                                              : AppStyles.paragraph(context),\n                                        ),\n                                      ),\n                                    )\n                                  ],\n                                ),\n                              )\n                            : SizedBox(),\n                      ],\n                    ),\n                  ),\n                ),\n                //\"Add Contact\" and \"Close\" buttons\n                _showSendButton()\n                    ? Row(\n                        children: <Widget>[\n                          AppButton(\n                            type: AppButtonType.Primary,\n                            text: AppLocalization.of(context).sendButton,\n                            buttonTop: true,\n                            onPressed: () {\n                              if (widget.account != null) {\n                                Navigator.pop(context);\n                                AppSheets.showBottomSheet(\n                                  context: context,\n                                  widget: SendSheet(\n                                      account: widget.account.account,\n                                      contact: widget.contact,\n                                      localCurrency: StateContainer.of(context).curCurrency),\n                                );\n                              } else {\n                                showAppDialog(\n                                    context: context,\n                                    builder: (_) => DialogOverlay(\n                                        title: AppLocalization.of(context)\n                                            .accountToSendFromHeader,\n                                        optionsList: _getAccountsList()));\n                              }\n                            },\n                          ),\n                        ],\n                      )\n                    : SizedBox(),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  bool _showSendButton() {\n    return ((widget.account != null &&\n            widget.account.accountBalance > Currency('0')) ||\n        (widget.account == null &&\n            !walletState.walletLoading &&\n            walletState.totalWalletBalance > Currency('0') &&\n            walletState.getNonzeroBalanceAccounts().length > 0));\n  }\n\n  List<DialogListItem> _getAccountsList() {\n    /// Get a list of accounts we can send from\n    List<DialogListItem> ret = [];\n    walletState.getNonzeroBalanceAccounts().forEach((acct) {\n      ret.add(DialogListItem(\n          option:\n              \"${acct.account.toString()} (${acct.balance.toStringOpt()} PASC)\",\n          action: () {\n            Navigator.of(context).pop();\n            Navigator.of(context).pop();\n            AppSheets.showBottomSheet(\n              context: context,\n              widget: SendSheet(\n                account: acct,\n                contact: widget.contact,\n                fromOverview: true,\n                localCurrency: StateContainer.of(context).curCurrency\n              ),\n            );\n          }));\n    });\n    return ret;\n  }\n\n  void _copyToClipboard(String toCopy) {\n    if (toCopy == \"Contact Name\") {\n      Clipboard.setData(\n          ClipboardData(text: (widget.contact.name.toString())));\n      setState(() {\n        contactNameCopied = true;\n        contactAddressCopied = false;\n        contactPayloadCopied = false;\n      });\n      if (contactNameCopiedTimer != null) {\n        contactNameCopiedTimer.cancel();\n      }\n      contactNameCopiedTimer = Timer(const Duration(milliseconds: 1500), () {\n        if (mounted) {\n          setState(() {\n            contactNameCopied = false;\n          });\n        }\n      });\n    }\n    if (toCopy == \"Address\") {\n      Clipboard.setData(ClipboardData(text: widget.contact.account.toString()));\n      setState(() {\n        contactAddressCopied = true;\n        contactNameCopied = false;\n        contactPayloadCopied = false;\n      });\n      if (contactAddressCopiedTimer != null) {\n        contactAddressCopiedTimer.cancel();\n      }\n      contactAddressCopiedTimer = Timer(const Duration(milliseconds: 1500), () {\n        if (mounted) {\n          setState(() {\n            contactAddressCopied = false;\n          });\n        }\n      });\n    }\n    if (toCopy == \"Payload\") {\n      Clipboard.setData(ClipboardData(text: widget.contact.payload));\n      setState(() {\n        contactPayloadCopied = true;\n        contactNameCopied = false;\n        contactAddressCopied = false;\n      });\n      if (contactPayloadCopiedTimer != null) {\n        contactPayloadCopiedTimer.cancel();\n      }\n      contactPayloadCopiedTimer = Timer(const Duration(milliseconds: 1500), () {\n        if (mounted) {\n          setState(() {\n            contactPayloadCopied = false;\n          });\n        }\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/contacts/contacts.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/db/appdb.dart';\nimport 'package:blaise_wallet_flutter/model/db/contact.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/contacts/add_contact_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/contacts/contact_detail_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/settings_list_item.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:logger/logger.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:share/share.dart';\n\nclass ContactsPage extends StatefulWidget {\n  final Account account;\n\n  ContactsPage({this.account}) : super();\n\n  @override\n  _ContactsPageState createState() => _ContactsPageState();\n}\n\nclass _ContactsPageState extends State<ContactsPage> {\n  final Logger log = sl.get<Logger>();\n\n  List<Contact> _contacts;\n  String documentsDirectory;\n\n  StreamSubscription<ContactAddedEvent> _contactAddedSub;\n  StreamSubscription<ContactRemovedEvent> _contactRemovedSub;\n\n  void _registerBus() {\n    // Contact added bus event\n    _contactAddedSub = EventTaxiImpl.singleton()\n        .registerTo<ContactAddedEvent>()\n        .listen((event) {\n      setState(() {\n        _contacts.add(event.contact);\n        //Sort by name\n        _contacts.sort(\n            (a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));\n      });\n      // Full update which includes downloading new monKey\n      _updateContacts();\n    });\n    // Contact removed bus event\n    _contactRemovedSub = EventTaxiImpl.singleton()\n        .registerTo<ContactRemovedEvent>()\n        .listen((event) {\n      setState(() {\n        _contacts.remove(event.contact);\n      });\n    });\n  }\n\n  void _destroyBus() {\n    if (_contactAddedSub != null) {\n      _contactAddedSub.cancel();\n    }\n    if (_contactRemovedSub != null) {\n      _contactRemovedSub.cancel();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    // Populate contacts\n    _contacts = [];\n    _updateContacts();\n    // Get FS directory for export\n    getApplicationDocumentsDirectory().then((directory) {\n      documentsDirectory = directory.path;\n      setState(() {\n        documentsDirectory = directory.path;\n      });\n      _updateContacts();\n    });\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  void _updateContacts() {\n    sl.get<DBHelper>().getContacts().then((contacts) {\n      for (Contact c in contacts) {\n        if (!_contacts.contains(c)) {\n          setState(() {\n            _contacts.add(c);\n          });\n        }\n      }\n      // Re-sort list\n      setState(() {\n        _contacts.sort(\n            (a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));\n      });\n    });\n  }\n\n  Future<void> _exportContacts() async {\n    List<Contact> contacts = await sl.get<DBHelper>().getContacts();\n    if (contacts.length == 0) {\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).noContactsToExportError, context);\n      return;\n    }\n    List<Map<String, dynamic>> jsonList = List();\n    contacts.forEach((contact) {\n      jsonList.add(contact.toJson());\n    });\n    DateTime exportTime = DateTime.now();\n    String filename =\n        \"blaisecontacts_${exportTime.year}${exportTime.month}${exportTime.day}${exportTime.hour}${exportTime.minute}${exportTime.second}.txt\";\n    Directory baseDirectory = await getApplicationDocumentsDirectory();\n    File contactsFile = File(\"${baseDirectory.path}/$filename\");\n    await contactsFile.writeAsString(json.encode(jsonList));\n    UIUtil.cancelLockEvent();\n    Share.shareFile(contactsFile);\n  }\n\n  Future<void> _importContacts() async {\n    UIUtil.cancelLockEvent();\n    FilePickerResult result = await FilePicker.platform.pickFiles(\n        allowMultiple: false,\n        type: FileType.custom,\n        allowedExtensions: [\"txt\"]);\n    if (result != null) {\n      File f = File(result.files.single.path);\n      if (!await f.exists()) {\n        UIUtil.showSnackbar(\n            AppLocalization.of(context).failedToImportContactsError, context);\n        return;\n      }\n      try {\n        String contents = await f.readAsString();\n        Iterable contactsJson = json.decode(contents);\n        List<Contact> contacts = List.empty();\n        List<Contact> contactsToAdd = List.empty();\n        contactsJson.forEach((contact) {\n          contacts.add(Contact.fromJson(contact));\n        });\n        for (Contact contact in contacts) {\n          if (!await sl.get<DBHelper>().contactExistsWithName(contact.name) &&\n              !await sl\n                  .get<DBHelper>()\n                  .contactExistsWithAccount(contact.account)) {\n            // Contact doesnt exist, make sure name and address are valid\n            if (contact.account != null &&\n                contact.account.toString().length > 0) {\n              if (contact.name.length <= 20) {\n                contactsToAdd.add(contact);\n              }\n            }\n          }\n        }\n        // Save all the new contacts and update states\n        int numSaved = await sl.get<DBHelper>().saveContacts(contactsToAdd);\n        if (numSaved > 0) {\n          _updateContacts();\n          EventTaxiImpl.singleton().fire(ContactModifiedEvent(\n              contact: Contact(name: \"\", account: AccountNumber.fromInt(0))));\n          UIUtil.showSnackbar(\n              AppLocalization.of(context)\n                  .successfullyImportedContactsParagraph\n                  .replaceAll(\"%1\", numSaved.toString()),\n              context);\n        } else {\n          UIUtil.showSnackbar(\n              AppLocalization.of(context).noContactsToImportError, context);\n        }\n      } catch (e) {\n        log.e(e.toString());\n        UIUtil.showSnackbar(\n            AppLocalization.of(context).failedToImportContactsError, context);\n        return;\n      }\n    } else {\n      // Cancelled by user\n      log.e(\"FilePicker cancelled by user\");\n      UIUtil.showSnackbar(\n          AppLocalization.of(context).failedToImportContactsError, context);\n      return;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Stack(\n          children: <Widget>[\n            // Container for the gradient background\n            Container(\n              height: 104 +\n                  (MediaQuery.of(context).padding.top) +\n                  (36 - (MediaQuery.of(context).padding.top) / 2),\n              decoration: BoxDecoration(\n                gradient: StateContainer.of(context).curTheme.gradientPrimary,\n              ),\n            ),\n            // Column for the rest\n            Column(\n              children: <Widget>[\n                // Container for the header and the buttons\n                Container(\n                  margin: EdgeInsetsDirectional.only(\n                    top: (MediaQuery.of(context).padding.top) +\n                        (36 - (MediaQuery.of(context).padding.top) / 2),\n                    bottom: 8,\n                  ),\n                  // Row for the header and the buttons\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Back button and header\n                      Row(\n                        crossAxisAlignment: CrossAxisAlignment.center,\n                        children: <Widget>[\n                          // Back Button\n                          Container(\n                            margin: EdgeInsetsDirectional.only(start: 2),\n                            height: 50,\n                            width: 50,\n                            child: FlatButton(\n                                highlightColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight15,\n                                splashColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight30,\n                                onPressed: () {\n                                  Navigator.of(context).pop();\n                                },\n                                shape: RoundedRectangleBorder(\n                                    borderRadius: BorderRadius.circular(50.0)),\n                                padding: EdgeInsets.all(0.0),\n                                child: Icon(AppIcons.back,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .textLight,\n                                    size: 24)),\n                          ),\n                          // The header\n                          Container(\n                            width: MediaQuery.of(context).size.width - 200,\n                            margin: EdgeInsetsDirectional.fromSTEB(4, 0, 24, 0),\n                            child: AutoSizeText(\n                              AppLocalization.of(context).contactsHeader,\n                              style: AppStyles.header(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                            ),\n                          ),\n                        ],\n                      ),\n                      // Import and export buttons\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.end,\n                        crossAxisAlignment: CrossAxisAlignment.center,\n                        children: <Widget>[\n                          // Import Button\n                          Container(\n                            height: 40,\n                            width: 40,\n                            child: FlatButton(\n                                highlightColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight15,\n                                splashColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight30,\n                                onPressed: () {\n                                  _importContacts();\n                                },\n                                shape: RoundedRectangleBorder(\n                                    borderRadius: BorderRadius.circular(50.0)),\n                                padding: EdgeInsets.all(0.0),\n                                child: Icon(AppIcons.import_icon,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .textLight,\n                                    size: 24)),\n                          ),\n                          // Export Button\n                          Container(\n                            margin:\n                                EdgeInsetsDirectional.only(start: 4, end: 12),\n                            height: 40,\n                            width: 40,\n                            child: FlatButton(\n                                highlightColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight15,\n                                splashColor: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight30,\n                                onPressed: () {\n                                  _exportContacts();\n                                },\n                                shape: RoundedRectangleBorder(\n                                    borderRadius: BorderRadius.circular(50.0)),\n                                padding: EdgeInsets.all(0.0),\n                                child: Icon(AppIcons.export_icon,\n                                    color: StateContainer.of(context)\n                                        .curTheme\n                                        .textLight,\n                                    size: 24)),\n                          ),\n                        ],\n                      ),\n                    ],\n                  ),\n                ),\n                // Expanded list\n                Expanded(\n                  // Container for the list\n                  child: Container(\n                    margin: EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0),\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      color:\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                      boxShadow: [\n                        StateContainer.of(context).curTheme.shadowSettingsList,\n                      ],\n                    ),\n                    // Settings List\n                    child: ClipRRect(\n                      borderRadius: BorderRadius.only(\n                          topLeft: Radius.circular(12),\n                          topRight: Radius.circular(12)),\n                      child: Stack(\n                        children: <Widget>[\n                          ListView.builder(\n                            physics: AlwaysScrollableScrollPhysics(),\n                            padding: EdgeInsetsDirectional.only(\n                                bottom:\n                                    MediaQuery.of(context).padding.bottom + 12),\n                            itemCount: _contacts.length,\n                            itemBuilder: (context, index) {\n                              return SettingsListItem(\n                                contactName: _contacts[index].name,\n                                contactAddress:\n                                    _contacts[index].account.toString(),\n                                contact: true,\n                                onPressed: () {\n                                  AppSheets.showBottomSheet(\n                                      context: context,\n                                      widget: ContactDetailSheet(\n                                          contact: _contacts[index],\n                                          account: widget.account));\n                                },\n                              );\n                            },\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n                // Bottom bar\n                Align(\n                  alignment: Alignment.bottomCenter,\n                  child: Container(\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      color:\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                      boxShadow: [\n                        StateContainer.of(context).curTheme.shadowBottomBar,\n                      ],\n                    ),\n                    child: Container(\n                      margin: EdgeInsetsDirectional.only(top: 4),\n                      child: Row(\n                        children: <Widget>[\n                          AppButton(\n                            text: AppLocalization.of(context).addContactButton,\n                            type: AppButtonType.Primary,\n                            onPressed: () {\n                              AppSheets.showBottomSheet(\n                                  context: context, widget: AddContactSheet());\n                            },\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/public_key_sheet.dart",
    "content": "import 'dart:async';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:pascaldart/pascaldart.dart';\n\nclass PublicKeySheet extends StatefulWidget {\n  _PublicKeySheetState createState() => _PublicKeySheetState();\n}\n\nclass _PublicKeySheetState extends State<PublicKeySheet> {\n  bool _keyCopied;\n  Timer _keyCopiedTimer;\n\n  @override\n  void initState() {\n    super.initState();\n    _keyCopied = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Expanded(\n          child: Container(\n            decoration: BoxDecoration(\n              color: StateContainer.of(context).curTheme.backgroundPrimary,\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(12),\n                topRight: Radius.circular(12),\n              ),\n            ),\n            child: Column(\n              children: <Widget>[\n                // Sheet header\n                Container(\n                  height: 60,\n                  width: double.maxFinite,\n                  decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      topRight: Radius.circular(12),\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                      // Header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 130,\n                        alignment: Alignment(0, 0),\n                        child: AutoSizeText(\n                          toUppercase(AppLocalization.of(context)\n                              .publicKeySheetHeader\n                              ,context),\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          textAlign: TextAlign.center,\n                        ),\n                      ),\n                      // Sized Box\n                      SizedBox(\n                        height: 50,\n                        width: 65,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      // Paragraph\n                      Container(\n                        margin: EdgeInsetsDirectional.fromSTEB(30, 30, 30, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).publicKeyParagraph,\n                          stepGranularity: 0.5,\n                          maxLines: 6,\n                          minFontSize: 8,\n                          style: AppStyles.paragraph(context),\n                        ),\n                      ),\n                      // Container for the private key\n                      Container(\n                          margin: EdgeInsetsDirectional.fromSTEB(30, 24, 30, 0),\n                          padding:\n                              EdgeInsetsDirectional.fromSTEB(30, 12, 30, 12),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(12),\n                            border: Border.all(\n                                width: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .primary15),\n                            color:\n                                StateContainer.of(context).curTheme.primary10,\n                          ),\n                          child: Observer(builder: (BuildContext context) {\n                            if (walletState.publicKey != null) {\n                              return AutoSizeText(\n                                PublicKeyCoder()\n                                    .encodeToBase58(walletState.publicKey),\n                                maxLines: 6,\n                                stepGranularity: 0.1,\n                                minFontSize: 8,\n                                textAlign: TextAlign.center,\n                                style: AppStyles.privateKeyPrimary(context),\n                              );\n                            } else {\n                              return SizedBox();\n                            }\n                          })),\n                    ],\n                  ),\n                ),\n                //\"Copy Unencrypted Key\" and \"Close\" buttons\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: _keyCopied\n                          ? AppButtonType.Success\n                          : AppButtonType.Primary,\n                      text: _keyCopied\n                          ? AppLocalization.of(context).keyCopiedButton\n                          : AppLocalization.of(context).copyPublicKeyButton,\n                      buttonTop: true,\n                      onPressed: () {\n                        if (walletState.publicKey != null) {\n                          Clipboard.setData(ClipboardData(\n                              text: PublicKeyCoder()\n                                  .encodeToBase58(walletState.publicKey)));\n                        }\n                        setState(() {\n                          _keyCopied = true;\n                        });\n                        if (_keyCopiedTimer != null) {\n                          _keyCopiedTimer.cancel();\n                        }\n                        _keyCopiedTimer =\n                            Timer(const Duration(milliseconds: 1500), () {\n                          if (mounted) {\n                            setState(() {\n                              _keyCopied = false;\n                            });\n                          }\n                        });\n                      },\n                    ),\n                  ],\n                ),\n                // \"Close\" button\n                Row(\n                  children: <Widget>[\n                    AppButton(\n                      type: AppButtonType.PrimaryOutline,\n                      text: AppLocalization.of(context).closeButton,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/security.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/authentication_method.dart';\nimport 'package:blaise_wallet_flutter/model/lock_timeout.dart';\nimport 'package:blaise_wallet_flutter/model/unlock_setting.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/settings_list_item.dart';\nimport 'package:blaise_wallet_flutter/util/authentication.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:flutter/material.dart';\n\nclass SecurityPage extends StatefulWidget {\n  @override\n  _SecurityPageState createState() => _SecurityPageState();\n}\n\nclass _SecurityPageState extends State<SecurityPage> {\n  var _scaffoldKey = GlobalKey<ScaffoldState>();\n\n  bool _hasBiometricsEnrolled;\n  AuthenticationMethod curAuthMethod =\n      AuthenticationMethod(AuthMethod.BIOMETRICS);\n  LockTimeoutSetting curTimeoutSetting =\n      LockTimeoutSetting(LockTimeoutOption.ONE);\n  UnlockSetting curAuthOnLaunch = UnlockSetting(UnlockOption.NO);\n\n  List<DialogListItem> _getAuthMethods() {\n    List<DialogListItem> ret = [];\n    AuthMethod.values.forEach((AuthMethod value) {\n      AuthenticationMethod method = AuthenticationMethod(value);\n      ret.add(DialogListItem(\n          option: method.getDisplayName(context),\n          action: () async {\n            await sl.get<SharedPrefsUtil>().setAuthMethod(method);\n            if (mounted) {\n              setState(() {\n                curAuthMethod = method;\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  List<DialogListItem> _authOnLaunchOptions() {\n    List<DialogListItem> ret = [];\n    UnlockOption.values.forEach((UnlockOption value) {\n      UnlockSetting setting = UnlockSetting(value);\n      ret.add(DialogListItem(\n          option: setting.getDisplayName(context),\n          action: () async {\n            await sl\n                .get<SharedPrefsUtil>()\n                .setLock(setting.setting == UnlockOption.YES);\n            if (mounted) {\n              setState(() {\n                curAuthOnLaunch = setting;\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  List<DialogListItem> _getLockTimeoutList() {\n    List<DialogListItem> ret = [];\n    LockTimeoutOption.values.forEach((LockTimeoutOption value) {\n      LockTimeoutSetting setting = LockTimeoutSetting(value);\n      ret.add(DialogListItem(\n          option: setting.getDisplayName(context),\n          action: () async {\n            await sl.get<SharedPrefsUtil>().setLockTimeout(setting);\n            if (mounted) {\n              setState(() {\n                curTimeoutSetting = setting;\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _hasBiometricsEnrolled = false;\n    AuthUtil().hasBiometrics().then((hasBiometrics) {\n      if (mounted) {\n        setState(() {\n          _hasBiometricsEnrolled = hasBiometrics;\n        });\n      }\n    });\n    sl.get<SharedPrefsUtil>().getAuthMethod().then((authMethod) {\n      if (mounted) {\n        setState(() {\n          curAuthMethod = authMethod;\n        });\n      }\n    });\n    sl.get<SharedPrefsUtil>().getLockTimeout().then((result) {\n      if (mounted) {\n        setState(() {\n          curTimeoutSetting = result;\n        });\n      }\n    });\n    sl.get<SharedPrefsUtil>().getLock().then((result) {\n      if (result) {\n        if (mounted) {\n          setState(() {\n            curAuthOnLaunch = UnlockSetting(UnlockOption.YES);\n          });\n        }\n      } else {\n        if (mounted) {\n          setState(() {\n            curAuthOnLaunch = UnlockSetting(UnlockOption.NO);\n          });\n        }\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      key: _scaffoldKey,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Stack(\n          children: <Widget>[\n            // Container for the gradient background\n            Container(\n              height: 104 +\n                  (MediaQuery.of(context).padding.top) +\n                  (36 - (MediaQuery.of(context).padding.top) / 2),\n              decoration: BoxDecoration(\n                gradient: StateContainer.of(context).curTheme.gradientPrimary,\n              ),\n            ),\n            // Column for the rest\n            Column(\n              children: <Widget>[\n                // Container for the header and button\n                Container(\n                  margin: EdgeInsetsDirectional.only(\n                    top: (MediaQuery.of(context).padding.top) +\n                        (36 - (MediaQuery.of(context).padding.top) / 2),\n                    bottom: 8,\n                  ),\n                  // Row for back button and the header\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: <Widget>[\n                      // Back Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 2),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.back,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 24)),\n                      ),\n                      // The header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 100,\n                        margin: EdgeInsetsDirectional.fromSTEB(4, 0, 24, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).securityHeader,\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // Expanded list\n                Expanded(\n                  // Container for the list\n                  child: Container(\n                    margin: EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0),\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      color:\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                      boxShadow: [\n                        StateContainer.of(context).curTheme.shadowSettingsList,\n                      ],\n                    ),\n                    // Settings List\n                    child: ListView(\n                      padding: EdgeInsetsDirectional.only(\n                          bottom: MediaQuery.of(context).padding.bottom + 12),\n                      children: <Widget>[\n                        // Preferences text\n                        Container(\n                          alignment: Alignment(-1, 0),\n                          margin: EdgeInsetsDirectional.only(\n                              start: 24, end: 24, top: 16, bottom: 8),\n                          child: AutoSizeText(\n                            AppLocalization.of(context).preferencesHeader,\n                            style: AppStyles.settingsHeader(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                        // Divider\n                        Container(\n                          width: double.maxFinite,\n                          height: 1,\n                          color: StateContainer.of(context).curTheme.textDark10,\n                        ),\n                        // List Items\n                        _hasBiometricsEnrolled\n                            ? SettingsListItem(\n                                header: AppLocalization.of(context)\n                                    .authenticationMethodHeader,\n                                subheader:\n                                    curAuthMethod.getDisplayName(context),\n                                icon: AppIcons.fingerprint,\n                                onPressed: () {\n                                  showAppDialog(\n                                      context: context,\n                                      builder: (_) => DialogOverlay(\n                                          title: AppLocalization.of(context)\n                                              .authenticationMethodHeader,\n                                          optionsList: _getAuthMethods()));\n                                },\n                              )\n                            : SizedBox(),\n                        _hasBiometricsEnrolled\n                            ? Container(\n                                width: double.maxFinite,\n                                height: 1,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark10,\n                              )\n                            : SizedBox(),\n                        SettingsListItem(\n                          header: AppLocalization.of(context)\n                              .authenticateOnLaunchHeader,\n                          subheader: curAuthOnLaunch.getDisplayName(context),\n                          icon: AppIcons.lock,\n                          onPressed: () {\n                            showAppDialog(\n                                context: context,\n                                builder: (_) => DialogOverlay(\n                                    title: AppLocalization.of(context)\n                                        .authenticateOnLaunchHeader,\n                                    optionsList: _authOnLaunchOptions()));\n                          },\n                        ),\n                        SettingsListItem(\n                          header: AppLocalization.of(context)\n                              .automaticallyLockHeader,\n                          subheader: curTimeoutSetting.getDisplayName(context),\n                          icon: AppIcons.timer,\n                          disabled: curAuthOnLaunch.setting == UnlockOption.NO,\n                          onPressed: () {\n                            if (curAuthOnLaunch.setting == UnlockOption.YES) {\n                              showAppDialog(\n                                  context: context,\n                                  builder: (_) => DialogOverlay(\n                                      title: AppLocalization.of(context)\n                                          .automaticallyLockHeader,\n                                      optionsList: _getLockTimeoutList()));\n                            }\n                          },\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/settings/settings.dart",
    "content": "import 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/daemon_changed_event.dart';\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/model/available_themes.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:blaise_wallet_flutter/model/notification_enabled.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/store/account/account.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/webview.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:package_info/package_info.dart';\nimport 'package:share/share.dart';\nimport 'package:blaise_wallet_flutter/themes.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/backup_private_key/backup_private_key_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/change_daemon_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/settings/public_key_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/settings_list_item.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:blaise_wallet_flutter/util/vault.dart';\nimport 'package:flutter/material.dart';\n\nclass SettingsPage extends StatefulWidget {\n  final Account account;\n\n  SettingsPage({this.account}) : super();\n\n  @override\n  _SettingsPageState createState() => _SettingsPageState();\n}\n\nclass _SettingsPageState extends State<SettingsPage> {\n  var _scaffoldKey = GlobalKey<ScaffoldState>();\n\n  List<DialogListItem> getThemeList() {\n    List<DialogListItem> ret = [];\n    ThemeOptions.values.forEach((ThemeOptions value) {\n      ThemeSetting theme = ThemeSetting(value);\n      ret.add(DialogListItem(\n          option: theme.getDisplayName(context),\n          action: () {\n            StateContainer.of(context).updateTheme(ThemeSetting(value));\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  List<DialogListItem> getCurrencyList() {\n    List<DialogListItem> ret = [];\n    AvailableCurrencyEnum.values.forEach((AvailableCurrencyEnum value) {\n      AvailableCurrency currency = AvailableCurrency(value);\n      ret.add(DialogListItem(\n          option: currency.getDisplayName(context),\n          action: () {\n            sl.get<SharedPrefsUtil>().setCurrency(currency).then((result) {\n              if (StateContainer.of(context).curCurrency.currency !=\n                  currency.currency) {\n                setState(() {\n                  StateContainer.of(context).curCurrency = currency;\n                });\n                walletState.requestUpdate();\n              }\n            });\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  List<DialogListItem> getNotificationList() {\n    List<DialogListItem> ret = [];\n    NotificationOptions.values.forEach((NotificationOptions value) {\n      NotificationSetting setting = NotificationSetting(value);\n      ret.add(DialogListItem(\n          option: setting.getDisplayName(context),\n          action: () {\n            if (setting != _curNotificiationSetting) {\n              sl\n                  .get<SharedPrefsUtil>()\n                  .setNotificationsOn(setting.setting == NotificationOptions.ON)\n                  .then((result) {\n                setState(() {\n                  _curNotificiationSetting = setting;\n                });\n                walletState.fcmUpdateBulk();\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  List<DialogListItem> getLanguageList() {\n    List<DialogListItem> ret = [];\n    AvailableLanguage.values.forEach((AvailableLanguage value) {\n      LanguageSetting setting = LanguageSetting(value);\n      ret.add(DialogListItem(\n          option: setting.getDisplayName(context),\n          action: () {\n            if (setting != StateContainer.of(context).curLanguage) {\n              sl.get<SharedPrefsUtil>().setLanguage(setting).then((result) {\n                StateContainer.of(context).updateLanguage(setting);\n              });\n            }\n            Navigator.of(context).pop();\n          }));\n    });\n    return ret;\n  }\n\n  String daemonURL;\n  String versionString = \"\";\n  NotificationSetting _curNotificiationSetting =\n      NotificationSetting(NotificationOptions.ON);\n\n  @override\n  void initState() {\n    super.initState();\n    sl.get<SharedPrefsUtil>().getRpcUrl().then((result) {\n      if (result != AppConstants.DEFAULT_RPC_HTTP_URL && mounted) {\n        setState(() {\n          daemonURL = result;\n        });\n      }\n    });\n    // Version string\n    PackageInfo.fromPlatform().then((packageInfo) {\n      setState(() {\n        versionString = \"v${packageInfo.version}\";\n      });\n    });\n    // Get default notification setting\n    sl.get<SharedPrefsUtil>().getNotificationsOn().then((notificationsOn) {\n      setState(() {\n        _curNotificiationSetting = notificationsOn\n            ? NotificationSetting(NotificationOptions.ON)\n            : NotificationSetting(NotificationOptions.OFF);\n      });\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // The main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      key: _scaffoldKey,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      body: LayoutBuilder(\n        builder: (context, constraints) => Stack(\n          children: <Widget>[\n            // Container for the gradient background\n            Container(\n              height: 104 +\n                  (MediaQuery.of(context).padding.top) +\n                  (36 - (MediaQuery.of(context).padding.top) / 2),\n              decoration: BoxDecoration(\n                gradient: StateContainer.of(context).curTheme.gradientPrimary,\n              ),\n            ),\n            // Column for the rest\n            Column(\n              children: <Widget>[\n                // Container for the header and button\n                Container(\n                  margin: EdgeInsetsDirectional.only(\n                    top: (MediaQuery.of(context).padding.top) +\n                        (36 - (MediaQuery.of(context).padding.top) / 2),\n                    bottom: 8,\n                  ),\n                  // Row for back button and the header\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: <Widget>[\n                      // Back Button\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 2),\n                        height: 50,\n                        width: 50,\n                        child: FlatButton(\n                            highlightColor:\n                                StateContainer.of(context).curTheme.textLight15,\n                            splashColor:\n                                StateContainer.of(context).curTheme.textLight30,\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                            },\n                            shape: RoundedRectangleBorder(\n                                borderRadius: BorderRadius.circular(50.0)),\n                            padding: EdgeInsets.all(0.0),\n                            child: Icon(AppIcons.back,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textLight,\n                                size: 24)),\n                      ),\n                      // The header\n                      Container(\n                        width: MediaQuery.of(context).size.width - 100,\n                        margin: EdgeInsetsDirectional.fromSTEB(4, 0, 24, 0),\n                        child: AutoSizeText(\n                          AppLocalization.of(context).settingsHeader,\n                          style: AppStyles.header(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                // Expanded list\n                Expanded(\n                  child: Container(\n                    margin: EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0),\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      color:\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                      borderRadius: BorderRadius.only(\n                        topLeft: Radius.circular(12),\n                        topRight: Radius.circular(12),\n                      ),\n                      boxShadow: [\n                        StateContainer.of(context).curTheme.shadowSettingsList,\n                      ],\n                    ),\n                    // Settings List\n                    child: ClipRRect(\n                      borderRadius: BorderRadius.only(\n                          topLeft: Radius.circular(12),\n                          topRight: Radius.circular(12)),\n                      child: ListView(\n                        padding: EdgeInsetsDirectional.only(\n                            bottom: MediaQuery.of(context).padding.bottom + 24),\n                        children: <Widget>[\n                          // Preferences text\n                          Container(\n                            alignment: Alignment(-1, 0),\n                            margin: EdgeInsetsDirectional.only(\n                                start: 24, end: 24, top: 18, bottom: 8),\n                            child: AutoSizeText(\n                              AppLocalization.of(context).preferencesHeader,\n                              style: AppStyles.settingsHeader(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                            ),\n                          ),\n                          // Divider\n                          Container(\n                            width: double.maxFinite,\n                            height: 1,\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          // List Items\n                          SettingsListItem(\n                            header: AppLocalization.of(context).currencyHeader,\n                            subheader: StateContainer.of(context)\n                                .curCurrency\n                                .getDisplayName(context),\n                            icon: AppIcons.currency,\n                            onPressed: () {\n                              showAppDialog(\n                                  context: context,\n                                  builder: (_) => DialogOverlay(\n                                      title: AppLocalization.of(context)\n                                          .currencyHeader,\n                                      optionsList: getCurrencyList()));\n                            },\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).languageHeader,\n                            subheader: StateContainer.of(context)\n                                .curLanguage\n                                .getDisplayName(context),\n                            icon: AppIcons.language,\n                            onPressed: () {\n                              showAppDialog(\n                                  context: context,\n                                  builder: (_) => DialogOverlay(\n                                      title: AppLocalization.of(context)\n                                          .languageHeader,\n                                      optionsList: getLanguageList()));\n                            },\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).themeHeader,\n                            subheader: StateContainer.of(context)\n                                        .curTheme\n                                        .toString() ==\n                                    BlaiseLightTheme().toString()\n                                ? AppLocalization.of(context).themeLightHeader\n                                : StateContainer.of(context)\n                                            .curTheme\n                                            .toString() ==\n                                        BlaiseDarkTheme().toString()\n                                    ? AppLocalization.of(context)\n                                        .themeDarkHeader\n                                    : AppLocalization.of(context)\n                                        .themeCopperHeader,\n                            icon: AppIcons.theme,\n                            onPressed: () {\n                              showAppDialog(\n                                  context: context,\n                                  builder: (_) => DialogOverlay(\n                                      title: AppLocalization.of(context)\n                                          .themeHeader,\n                                      optionsList: getThemeList()));\n                            },\n                          ),\n                          SettingsListItem(\n                            header:\n                                AppLocalization.of(context).notificationsHeader,\n                            subheader: _curNotificiationSetting\n                                .getDisplayName(context),\n                            icon: AppIcons.notifications,\n                            onPressed: () {\n                              showAppDialog(\n                                  context: context,\n                                  builder: (_) => DialogOverlay(\n                                      title: AppLocalization.of(context)\n                                          .notificationsHeader,\n                                      optionsList: getNotificationList()));\n                            },\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).securityHeader,\n                            icon: AppIcons.security,\n                            onPressed: () {\n                              Navigator.pushNamed(context, '/security');\n                            },\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).daemonHeader,\n                            subheader: daemonURL ??\n                                AppLocalization.of(context).defaultHeader,\n                            icon: AppIcons.changedaemon,\n                            onPressed: () {\n                              AppSheets.showBottomSheet(\n                                  context: context,\n                                  widget:\n                                      ChangeDaemonSheet(onChanged: (newDaemon) {\n                                    EventTaxiImpl.singleton().fire(\n                                        DaemonChangedEvent(\n                                            newDaemon: newDaemon));\n                                    if (newDaemon !=\n                                        AppConstants.DEFAULT_RPC_HTTP_URL) {\n                                      setState(() {\n                                        daemonURL = newDaemon;\n                                      });\n                                    } else {\n                                      setState(() {\n                                        daemonURL = null;\n                                      });\n                                    }\n                                  }));\n                            },\n                          ),\n                          // Manage text\n                          Container(\n                            alignment: Alignment(-1, 0),\n                            margin: EdgeInsetsDirectional.only(\n                                start: 24, end: 24, top: 18, bottom: 8),\n                            child: AutoSizeText(\n                              AppLocalization.of(context).manageHeader,\n                              style: AppStyles.settingsHeader(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                            ),\n                          ),\n                          // Divider\n                          Container(\n                            width: double.maxFinite,\n                            height: 1,\n                            color:\n                                StateContainer.of(context).curTheme.textDark10,\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).contactsHeader,\n                            icon: AppIcons.contacts,\n                            onPressed: () {\n                              Navigator.pushNamed(context, '/contacts',\n                                  arguments: widget.account);\n                            },\n                          ),\n                          SettingsListItem(\n                            header: AppLocalization.of(context)\n                                .backUpPrivateKeyHeader,\n                            icon: AppIcons.backupprivatekey,\n                            onPressed: () {\n                              AppSheets.showBottomSheet(\n                                  context: context,\n                                  widget: BackupPrivateKeySheet());\n                            },\n                          ),\n                          SettingsListItem(\n                            header:\n                                AppLocalization.of(context).viewPublicKeyHeader,\n                            icon: Icons.public,\n                            onPressed: () {\n                              AppSheets.showBottomSheet(\n                                  context: context, widget: PublicKeySheet());\n                            },\n                          ),\n                          SettingsListItem(\n                              header: AppLocalization.of(context).shareHeader,\n                              icon: AppIcons.share,\n                              onPressed: () {\n                                UIUtil.cancelLockEvent();\n                                Share.share(AppLocalization.of(context)\n                                    .checkOutBlaiseParagraph);\n                              }),\n                          SettingsListItem(\n                            header: AppLocalization.of(context).logoutHeader,\n                            icon: AppIcons.logout,\n                            onPressed: () {\n                              logoutPressed();\n                            },\n                          ),\n                          Padding(\n                            padding: EdgeInsets.only(top: 10.0, bottom: 10.0),\n                            child: Row(\n                              mainAxisAlignment: MainAxisAlignment.center,\n                              children: <Widget>[\n                                Text(versionString,\n                                    style: AppStyles.textStyleVersion(context)),\n                                Text(\" | \",\n                                    style: AppStyles.textStyleVersion(context)),\n                                GestureDetector(\n                                    onTap: () {\n                                      AppWebView.showWebView(context,\n                                          AppConstants.PRIVACY_POLICY_URL);\n                                    },\n                                    child: Text(\n                                        AppLocalization.of(context)\n                                            .privacyPolicyHeader,\n                                        style:\n                                            AppStyles.textStyleVersionUnderline(\n                                                context))),\n                                Text(\" | \",\n                                    style: AppStyles.textStyleVersion(context)),\n                                GestureDetector(\n                                    onTap: () {\n                                      AppWebView.showWebView(context,\n                                          AppConstants.PRIVACY_POLICY_URL);\n                                    },\n                                    child: Text(\"EULA\",\n                                        style:\n                                            AppStyles.textStyleVersionUnderline(\n                                                context))),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void logoutPressed() {\n    showAppDialog(\n        context: context,\n        builder: (_) => DialogOverlay(\n              title: toUppercase(\n                  AppLocalization.of(context).warningHeader, context),\n              warningStyle: true,\n              confirmButtonText: toUppercase(\n                  AppLocalization.of(context).deletePrivateKeyAndLogoutButton,\n                  context),\n              body: TextSpan(\n                children: formatLocalizedColorsDanger(context,\n                    AppLocalization.of(context).logoutFirstDisclaimerParagraph),\n              ),\n              onConfirm: () {\n                Navigator.of(context).pop();\n                showAppDialog(\n                    context: context,\n                    builder: (_) => DialogOverlay(\n                        title: toUppercase(\n                            AppLocalization.of(context).areYouSureHeader,\n                            context),\n                        warningStyle: true,\n                        confirmButtonText: toUppercase(\n                            AppLocalization.of(context).yesImSureButton,\n                            context),\n                        body: TextSpan(\n                          children: formatLocalizedColorsDanger(\n                              context,\n                              AppLocalization.of(context)\n                                  .logoutSecondDisclaimerParagraph),\n                        ),\n                        onConfirm: () {\n                          // Handle logging out\n                          walletState.reset();\n                          sl.get<Vault>().deleteAll().then((_) {\n                            sl.get<SharedPrefsUtil>().deleteAll().then((_) {\n                              Navigator.of(context).pushNamedAndRemoveUntil(\n                                  '/', (Route<dynamic> route) => false);\n                            });\n                          });\n                        }));\n              },\n            ));\n  }\n}\n"
  },
  {
    "path": "lib/ui/util/app_icons.dart",
    "content": "/// Flutter icons AppIcons\n/// Copyright (C) 2019 by original authors @ fluttericon.com, fontello.com\n/// This font was generated by FlutterIcon.com, which is derived from Fontello.\n///\n/// To use this font, place it in your fonts/ directory and include the\n/// following in your pubspec.yaml\n///\n/// flutter:\n///   fonts:\n///    - family:  AppIcons\n///      fonts:\n///       - asset: fonts/AppIcons.ttf\n///\n/// \n///\nimport 'package:flutter/widgets.dart';\n\nclass AppIcons {\n  AppIcons._();\n\n  static const _kFontFam = 'AppIcons';\n\n  static const IconData addcontact = const IconData(0xe800, fontFamily: _kFontFam);\n  static const IconData back = const IconData(0xe801, fontFamily: _kFontFam);\n  static const IconData backupprivatekey = const IconData(0xe802, fontFamily: _kFontFam);\n  static const IconData close = const IconData(0xe803, fontFamily: _kFontFam);\n  static const IconData contacts = const IconData(0xe804, fontFamily: _kFontFam);\n  static const IconData currency = const IconData(0xe805, fontFamily: _kFontFam);\n  static const IconData currencyswitch = const IconData(0xe806, fontFamily: _kFontFam);\n  static const IconData downarrow = const IconData(0xe807, fontFamily: _kFontFam);\n  static const IconData edit = const IconData(0xe808, fontFamily: _kFontFam);\n  static const IconData export_icon = const IconData(0xe809, fontFamily: _kFontFam);\n  static const IconData fingerprint = const IconData(0xe80a, fontFamily: _kFontFam);\n  static const IconData hide = const IconData(0xe80b, fontFamily: _kFontFam);\n  static const IconData import_icon = const IconData(0xe80c, fontFamily: _kFontFam);\n  static const IconData language = const IconData(0xe80d, fontFamily: _kFontFam);\n  static const IconData lock = const IconData(0xe80e, fontFamily: _kFontFam);\n  static const IconData support = const IconData(0xe80f, fontFamily: _kFontFam);\n  static const IconData notifications = const IconData(0xe810, fontFamily: _kFontFam);\n  static const IconData contact = const IconData(0xe811, fontFamily: _kFontFam);\n  static const IconData pascalcurrency = const IconData(0xe812, fontFamily: _kFontFam);\n  static const IconData paste = const IconData(0xe813, fontFamily: _kFontFam);\n  static const IconData scan = const IconData(0xe814, fontFamily: _kFontFam);\n  static const IconData search = const IconData(0xe815, fontFamily: _kFontFam);\n  static const IconData security = const IconData(0xe816, fontFamily: _kFontFam);\n  static const IconData settings = const IconData(0xe817, fontFamily: _kFontFam);\n  static const IconData share = const IconData(0xe818, fontFamily: _kFontFam);\n  static const IconData shareaddress = const IconData(0xe819, fontFamily: _kFontFam);\n  static const IconData show = const IconData(0xe81a, fontFamily: _kFontFam);\n  static const IconData theme = const IconData(0xe81b, fontFamily: _kFontFam);\n  static const IconData tick = const IconData(0xe81c, fontFamily: _kFontFam);\n  static const IconData timer = const IconData(0xe81d, fontFamily: _kFontFam);\n  static const IconData trashcan = const IconData(0xe81e, fontFamily: _kFontFam);\n  static const IconData uparrow = const IconData(0xe81f, fontFamily: _kFontFam);\n  static const IconData changedaemon = const IconData(0xe820, fontFamily: _kFontFam);\n  static const IconData pascalsymbol = const IconData(0xe821, fontFamily: _kFontFam);\n  static const IconData chatbubble = const IconData(0xe822, fontFamily: _kFontFam);\n  static const IconData max = const IconData(0xe823, fontFamily: _kFontFam);\n  static const IconData logout = const IconData(0xe824, fontFamily: _kFontFam);\n}\n"
  },
  {
    "path": "lib/ui/util/formatters.dart",
    "content": "import 'package:blaise_wallet_flutter/util/number_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:intl/intl.dart';\n\n/// For Pascal Accounts\nclass PascalAccountFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    // Ensure only one - is present\n    if (newValue.text.isNotEmpty && newValue.text.allMatches('-').length > 1) {\n      return oldValue;\n    } else if (newValue.text.isNotEmpty && newValue.text.contains('-')) {\n      // Ensure only two digits after \"-\"\n      if (newValue.text.length - newValue.text.indexOf('-') > 3) {\n        return oldValue;\n      }  \n    }\n    return newValue;\n  }\n}\n\n/// For Pascal Names\nclass PascalNameFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    // Ensure first character is not a number\n    if (newValue.text.startsWith(RegExp(r\"[0-9]\"))) {\n      return oldValue;\n    }\n    return newValue;\n  }\n}\n\n/// For phone numbers\n/// Ensures no more than 20 digits\n/// Ensures hyphens only occur after a number\nclass PhoneNumberFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    // Check digit count, 20 is max\n    if (newValue.text.replaceAll(RegExp(r\"[^0-9]\"), \"\").length > 20) {\n      return oldValue;\n    }\n    // Ensure only 1 hyphen after a number\n    if (newValue.text.endsWith(\"-\") && oldValue.text.endsWith(\"-\")) {\n      return oldValue;\n    }\n    return newValue;\n  }\n}\n\n/// Input formatter for Crpto/Fiat amounts\nclass CurrencyFormatter extends TextInputFormatter {\n\n  String commaSeparator;\n  String decimalSeparator;\n  int maxDecimalDigits;\n\n  CurrencyFormatter({this.commaSeparator = \",\", this.decimalSeparator = \".\", this.maxDecimalDigits = NumberUtil.maxDecimalDigits});\n\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    bool returnOriginal = true;\n    if (newValue.text.contains(decimalSeparator) || newValue.text.contains(commaSeparator)) {\n      returnOriginal = false;\n    }\n\n    // If no text, or text doesnt contain a period of comma, no work to do here\n    if(newValue.selection.baseOffset == 0 || returnOriginal) {\n      return newValue;\n    }\n\n    String workingText = newValue.text.replaceAll(commaSeparator, decimalSeparator);\n    // if contains more than 2 decimals in newValue, return oldValue\n    if (decimalSeparator.allMatches(workingText).length > 1) {\n      return newValue.copyWith(\n        text: oldValue.text,\n        selection: new TextSelection.collapsed(offset: oldValue.text.length));\n    } else if (workingText.startsWith(decimalSeparator)) {\n      workingText = \"0\" + workingText;\n    }\n\n    List<String> splitStr = workingText.split(decimalSeparator);\n    // If this string contains more than 1 decimal, move all characters to after the first decimal\n    if (splitStr.length > 2) {\n      returnOriginal = false;\n      splitStr.forEach((val) {\n        if (splitStr.indexOf(val) > 1) {\n          splitStr[1] += val;\n        }\n      });\n    }\n    if (splitStr[1].length <= maxDecimalDigits) {\n      if (workingText == newValue.text) {\n        return newValue;\n      } else {\n        return newValue.copyWith(\n          text: workingText,\n          selection: new TextSelection.collapsed(offset: workingText.length));\n       }\n    }\n    String newText = splitStr[0] + decimalSeparator + splitStr[1].substring(0, maxDecimalDigits);\n    return newValue.copyWith(\n      text: newText,\n      selection: new TextSelection.collapsed(offset: newText.length));\n  }\n}\n\nclass LocalCurrencyFormatter extends TextInputFormatter {\n  NumberFormat currencyFormat;\n  bool active;\n\n  LocalCurrencyFormatter({this.currencyFormat, this.active});\n\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    if (newValue.text.isEmpty) {\n      // Return empty string\n      return newValue.copyWith(\n        text: \"\",\n        selection: new TextSelection.collapsed(offset: 0));\n    }\n    // Ensure our input is in the right formatting here\n    if (active) {\n      // Make local currency = amount with correct decimal separator\n      String curText = newValue.text;\n      String shouldBeText = NumberUtil.sanitizeNumber(curText.replaceAll(\",\", \".\"));\n      shouldBeText = shouldBeText.replaceAll(\".\", currencyFormat.symbols.DECIMAL_SEP);\n      if (shouldBeText != curText) {\n        return newValue.copyWith(\n          text: shouldBeText,\n          selection: TextSelection.collapsed(offset: shouldBeText.length));\n      }\n    } else {\n      // Make crypto amount formatted as US locale\n      String curText = newValue.text;\n      String shouldBeText = NumberUtil.sanitizeNumber(curText.replaceAll(\",\", \".\"));\n      if (shouldBeText != curText) {\n        return newValue.copyWith(\n          text: shouldBeText,\n          selection: TextSelection.collapsed(offset: shouldBeText.length));\n      }\n    }\n    return newValue;\n  }\n}\n\n\n/// Ensures input is always uppercase\nclass UpperCaseTextFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    return TextEditingValue(\n      text: newValue.text?.toUpperCase(),\n      selection: newValue.selection,\n    );\n  }\n}\n\n/// Ensures input is always lowercase\nclass LowerCaseTextFormatter extends TextInputFormatter {\n  @override\n  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {\n    return TextEditingValue(\n      text: newValue.text?.toLowerCase(),\n      selection: newValue.selection,\n    );\n  }\n}"
  },
  {
    "path": "lib/ui/util/margins.dart",
    "content": "import 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\n\nclass AppMarginSizes {\n  static const m0 = 0.0;\n  static const m1 = 4.0;\n  static const m2 = 16.0;\n  static const m3 = 18.0;\n  static const m4 = 24.0;\n  static const m5 = 30.0;\n  static const m6 = 40.0;\n}\n\nclass AppMargins {\n  // Text Field Header Margins\n  static EdgeInsetsDirectional textFieldHeader(BuildContext context) {\n    return UIUtil.smallScreen(context)\n        ? EdgeInsetsDirectional.fromSTEB(AppMarginSizes.m5, AppMarginSizes.m2,\n            AppMarginSizes.m5, AppMarginSizes.m0)\n        : EdgeInsetsDirectional.fromSTEB(AppMarginSizes.m5, AppMarginSizes.m5,\n            AppMarginSizes.m5, AppMarginSizes.m0);\n  }\n}\n"
  },
  {
    "path": "lib/ui/util/routes.dart",
    "content": "import 'package:flutter/material.dart';\n\nenum TransitionOption {\n  NONE,\n  NOPUSH,\n  NOPOP\n}\n\n/// NoTransitionRoute\n/// Custom route which has no transitions\nclass NoTransitionRoute<T> extends MaterialPageRoute<T> {\n  NoTransitionRoute(\n    {WidgetBuilder builder, RouteSettings settings})\n      : super(builder: builder, settings: settings);\n\n  @override\n  Widget buildTransitions(BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      Widget child) {\n    return child;\n  }\n}\n\n/// NoPushTransitionRoute\n/// Custom route which has no transition when pushed, but has a pop animation\nclass NoPushTransitionRoute<T> extends MaterialPageRoute<T> {\n  NoPushTransitionRoute({ WidgetBuilder builder, RouteSettings settings })\n      : super(builder: builder, settings: settings);\n\n  @override\n  Widget buildTransitions(BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      Widget child) {\n    // is popping\n    if (animation.status == AnimationStatus.reverse) {\n      return super.buildTransitions(context, animation, secondaryAnimation, child);\n    }\n    return child;\n  }\n}\n\n/// NoPopTransitionRoute\n/// Custom route which has no transition when popped, but has a push animation\nclass NoPopTransitionRoute<T> extends MaterialPageRoute<T> {\n  NoPopTransitionRoute({ WidgetBuilder builder, RouteSettings settings })\n      : super(builder: builder, settings: settings);\n\n  @override\n  Widget buildTransitions(BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      Widget child) {\n    // is pushing\n    if (animation.status == AnimationStatus.forward) {\n      return super.buildTransitions(context, animation, secondaryAnimation, child);\n    }\n    return child;\n  }\n}\n\nclass RouteUtils {\n  static RoutePredicate withNameLike(String name) {\n    return (Route<dynamic> route) {\n      return !route.willHandlePopInternally\n          && route is ModalRoute\n          && route.settings.name != null \n          && route.settings.name.contains(name);\n    };\n  }\n}"
  },
  {
    "path": "lib/ui/util/text_styles.dart",
    "content": "import 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:flutter/material.dart';\n\nclass AppStyles {\n  // For snackbar/Toast text\n  static TextStyle snackbar(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.small,\n        fontWeight: FontWeight.w700,\n        color: StateContainer.of(context).curTheme.backgroundPrimary);\n  }\n\n  // For headers\n  static TextStyle header(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.largest,\n        fontWeight: FontWeight.w700,\n        color: StateContainer.of(context).curTheme.textLight);\n  }\n\n  // For small headers\n  static TextStyle headerSmall(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.medium,\n        fontWeight: FontWeight.w500,\n        color: StateContainer.of(context).curTheme.primary);\n  }\n\n  static TextStyle headerSmallBold(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.medium,\n        fontWeight: FontWeight.w700,\n        color: StateContainer.of(context).curTheme.primary);\n  }\n  static TextStyle headerSmallBoldSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.medium,\n        fontWeight: FontWeight.w700,\n        color: StateContainer.of(context).curTheme.success);\n  }\n\n  // For paragraphs\n  static TextStyle paragraph(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w400);\n  }\n\n  // For paragraphs\n  static TextStyle paragraphSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w400);\n  }\n\n  static TextStyle paragraphMedium(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  static TextStyle paragraphMediumPrimary(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  static TextStyle paragraphMediumSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  // For paragraphs\n  static TextStyle paragraphPrimary(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // For paragraphs\n  static TextStyle primarySmall600(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: AppFontSizes.small,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle primarySmallest400(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w400);\n  }\n\n  static TextStyle primarySmallest500(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  static TextStyle primarySmallest600(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle dangerSmallest600(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.danger,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle paragraphDanger(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.danger,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle balanceMedium(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 18.0,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle balanceSmall(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle balanceSmallSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle balanceSmallTextDark(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle balanceSmallSecondary(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.secondary,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle paragraphBig(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 16.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  static TextStyle paragraphBigDisabled(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark30,\n        fontSize: 16.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  static TextStyle paragraphTextLightSmall(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w300);\n  }\n\n  static TextStyle textLightSmall600(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle paragraphTextLightSmallSemiBold(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  // Modal header\n  static TextStyle snackBar(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Modal header\n  static TextStyle modalHeader(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 18.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Settings item header\n  static TextStyle settingsItemHeader(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle settingsItemHeaderDisabled(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark60,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Settings item subheader\n  static TextStyle settingsItemSubHeader(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w400);\n  }\n\n  static TextStyle settingsItemSubHeaderDisabled(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark60,\n        fontSize: 12.0,\n        height: 1.3,\n        fontWeight: FontWeight.w400);\n  }\n\n  // Date on operations list items\n  static TextStyle operationDate(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark50,\n        fontSize: 12.0,\n        fontWeight: FontWeight.w400);\n  }\n\n  // Operation type\n  static TextStyle operationType(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 13.0,\n        fontWeight: FontWeight.w600);\n  }\n\n  // Settings header\n  static TextStyle settingsHeader(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 16.0,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle iconFontPrimaryMedium(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'AppIcons',\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 16.0);\n  }\n\n  static TextStyle iconFontSuccessMedium(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'AppIcons',\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 16.0);\n  }\n\n  static TextStyle iconFontPrimarySmall(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'AppIcons',\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0);\n  }\n\n  static TextStyle iconFontSuccessSmall(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'AppIcons',\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0);\n  }\n\n  static TextStyle emptySpaceSmallest(BuildContext context) {\n    return TextStyle(fontSize: 12);\n  }\n\n  static TextStyle emptySpaceTiny(BuildContext context) {\n    return TextStyle(fontSize: 10);\n  }\n\n  static TextStyle accountsItemName(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle accountsItemNumber(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark60,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w500);\n  }\n\n  // Contacts item name\n  static TextStyle contactsItemName(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Contacts item name primary\n  static TextStyle contactsItemNamePrimary(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Contacts item name primary\n  static TextStyle contactsItemNameSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0,\n        height: 1.3,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Contacts item address\n  static TextStyle contactsItemAddress(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'SourceCodePro',\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w400);\n  }\n\n  // Contacts item address\n  static TextStyle monoTextDarkSmall400(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'SourceCodePro',\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        fontWeight: FontWeight.w400);\n  }\n\n  static TextStyle contactsItemAddressPrimary(BuildContext context) {\n    return TextStyle(\n        fontFamily: 'Metropolis',\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 16.0,\n        fontWeight: FontWeight.w400);\n  }\n\n  // For text field labels\n  static TextStyle textFieldLabel(BuildContext context) {\n    return TextStyle(\n        color: StateContainer.of(context).curTheme.primary,\n        fontFamily: 'Metropolis',\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: 16.0,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  static TextStyle textFieldLabelSuccess(BuildContext context) {\n    return TextStyle(\n        color: StateContainer.of(context).curTheme.success,\n        fontFamily: 'Metropolis',\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: 16.0,\n        height: 1.3,\n        fontWeight: FontWeight.w600);\n  }\n\n  // For primary Private Key\n  static TextStyle privateKeyPrimary(BuildContext context) {\n    return TextStyle(\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14.0,\n        height: 1,\n        fontWeight: FontWeight.w500,\n        fontFamily: 'SourceCodePro');\n  }\n\n  // For neutral Private Key\n  static TextStyle privateKeyTextDark(BuildContext context) {\n    return TextStyle(\n        color: StateContainer.of(context).curTheme.textDark,\n        fontSize: 14.0,\n        height: 1,\n        fontWeight: FontWeight.w500,\n        fontFamily: 'SourceCodePro');\n  }\n\n  // For neutral Private Key\n  static TextStyle privateKeyTextDarkFaded(BuildContext context) {\n    return TextStyle(\n      fontFamily: 'SourceCodePro',\n      color: StateContainer.of(context).curTheme.textDark.withOpacity(0.5),\n      fontSize: 14.0,\n      height: 1,\n      fontWeight: FontWeight.w500,\n    );\n  }\n\n  // For success Private Key\n  static TextStyle privateKeySuccess(BuildContext context) {\n    return TextStyle(\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 14.0,\n        height: 1,\n        fontWeight: FontWeight.w500,\n        fontFamily: 'SourceCodePro');\n  }\n\n  // Primary Button Text\n  static TextStyle buttonPrimary(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.textLight,\n        fontSize: 18,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Outline Button Text\n  static TextStyle buttonPrimaryOutline(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 18,\n        fontWeight: FontWeight.w700);\n  }\n\n  static TextStyle buttonSuccessOutline(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.success,\n        fontSize: 18,\n        fontWeight: FontWeight.w700);\n  }\n\n  // Danger Button Text\n  static TextStyle buttonDanger(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      color: StateContainer.of(context).curTheme.textLight,\n      fontSize: 12,\n      fontWeight: FontWeight.w700,\n      height: 1.3,\n    );\n  }\n\n  // Danger Outline Button Text\n  static TextStyle buttonDangerOutline(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      color: StateContainer.of(context).curTheme.danger,\n      fontSize: 12,\n      fontWeight: FontWeight.w700,\n      height: 1.3,\n    );\n  }\n\n  // Bg Colored Mini Button Text\n  static TextStyle buttonMiniBg(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.primary,\n        fontSize: 14,\n        fontWeight: FontWeight.w600);\n  }\n\n  // Success Colored Mini Button Text\n  static TextStyle buttonMiniSuccess(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        color: StateContainer.of(context).curTheme.backgroundPrimary,\n        fontSize: 14,\n        fontWeight: FontWeight.w600);\n  }\n\n  // For header pascal icon\n  static TextStyle iconFontTextLightPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 28,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  // For pascal icon on the account card balance\n  static TextStyle iconFontPrimaryBalanceMediumPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 18,\n      color: StateContainer.of(context).curTheme.primary,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  // For pascal icon on the operation items\n  static TextStyle iconFontPrimaryBalanceSmallPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.primary,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  static TextStyle iconFontSuccessBalanceSmallPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.success,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  static TextStyle iconFontTextDarkBalanceSmallPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.textDark,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  static TextStyle iconFontSecondarySmallPascal(BuildContext context) {\n    return TextStyle(\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.secondary,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  // For chat bubble icon\n  static TextStyle iconFontPrimaryBalanceSmallest(BuildContext context) {\n    return TextStyle(\n      fontSize: 12,\n      color: StateContainer.of(context).curTheme.primary50,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  static TextStyle iconFontTextDarkBalanceSmallest(BuildContext context) {\n    return TextStyle(\n      fontSize: 12,\n      color: StateContainer.of(context).curTheme.textDark50,\n      fontFamily: 'AppIcons',\n    );\n  }\n\n  // Account Card Name\n  static TextStyle accountCardName(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontWeight: FontWeight.w700,\n    );\n  }\n\n  // Account Card Address\n  static TextStyle accountCardAddress(BuildContext context) {\n    return TextStyle(\n      fontSize: 14,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontFamily: 'SourceCodePro',\n    );\n  }\n\n  // PIN Description\n  static TextStyle pinDescription(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.small,\n      color: StateContainer.of(context).curTheme.textLight,\n    );\n  }\n\n  // PIN Description\n  static TextStyle pinNumberPad(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.larger,\n      color: StateContainer.of(context).curTheme.primary,\n      fontWeight: FontWeight.w700,\n    );\n  }\n\n  // Text Dark Small 400\n  static TextStyle textDarkSmall400(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.small,\n      color: StateContainer.of(context).curTheme.textDark,\n      fontWeight: FontWeight.w400,\n    );\n  }\n\n  // Text Dark Large 400\n  static TextStyle textDarkLarge700(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.large,\n      color: StateContainer.of(context).curTheme.textDark,\n      fontWeight: FontWeight.w700,\n    );\n  }\n\n  // Text Light Small 400\n  static TextStyle textLightSmall400(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.small,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontWeight: FontWeight.w400,\n    );\n  }\n\n  // Text Light Large 400\n  static TextStyle textLightLarge700(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.large,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontWeight: FontWeight.w700,\n    );\n  }\n\n  // Text Light Small 700\n  static TextStyle textLightSmall700(BuildContext context) {\n    return TextStyle(\n      fontFamily: \"Metropolis\",\n      fontFamilyFallback: [\"RobotoRegular\"],\n      fontSize: AppFontSizes.small,\n      color: StateContainer.of(context).curTheme.textLight,\n      fontWeight: FontWeight.w700,\n    );\n  }\n\n  // Version info in settings\n  static TextStyle textStyleVersion(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.small,\n        fontWeight: FontWeight.w100,\n        color: StateContainer.of(context).curTheme.textDark60);\n  }\n\n  static TextStyle textStyleVersionUnderline(BuildContext context) {\n    return TextStyle(\n        fontFamily: \"Metropolis\",\n        fontFamilyFallback: [\"RobotoRegular\"],\n        fontSize: AppFontSizes.small,\n        fontWeight: FontWeight.w100,\n        color: StateContainer.of(context).curTheme.textDark60,\n        decoration: TextDecoration.underline);\n  }\n}\n\nclass AppFontSizes {\n  static const smallest = 12.0;\n  static const small = 14.0;\n  static const medium = 16.0;\n  static const large = 18.0;\n  static const larger = 24.0;\n  static const largest = 28.0;\n}\n"
  },
  {
    "path": "lib/ui/widgets/account_card.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/account/receive/receive_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/account/send/send_sheet.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/sheets.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_mobx/flutter_mobx.dart';\nimport 'package:flutter_slidable/flutter_slidable.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:quiver/strings.dart';\n\n/// A widget for buttons\nclass AccountCard extends StatefulWidget {\n  final PascalAccount account;\n\n  AccountCard({@required this.account});\n\n  _AccountCardState createState() => _AccountCardState();\n}\n\nclass _AccountCardState extends State<AccountCard> {\n  @override\n  Widget build(BuildContext context) {\n    // Account Card\n    return Slidable(\n      actionPane: SlidableBehindActionPane(),\n      actionExtentRatio: 0.175,\n      movementDuration: Duration(milliseconds: 150),\n      actions: _getButtons(),\n      child: Container(\n        width: double.maxFinite,\n        margin: EdgeInsetsDirectional.fromSTEB(12, 5, 12, 5),\n        height: 70,\n        decoration: BoxDecoration(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            borderRadius: BorderRadius.circular(12),\n            boxShadow: [StateContainer.of(context).curTheme.shadowAccountCard]),\n        child: Stack(\n          children: <Widget>[\n            // Left gradient background\n            Container(\n              height: double.maxFinite,\n              width: MediaQuery.of(context).size.width * 0.47 - 24,\n              decoration: BoxDecoration(\n                  gradient: StateContainer.of(context).curTheme.gradientPrimary,\n                  borderRadius: BorderRadius.only(\n                      topLeft: Radius.circular(12),\n                      bottomLeft: Radius.circular(12))),\n            ),\n            FlatButton(\n              onPressed: () {\n                if (!widget.account.isFreepasa) {\n                  Navigator.pushNamed(context, '/account',\n                      arguments: widget.account);\n                } else {\n                  showAppDialog(\n                      context: context,\n                      builder: (_) => DialogOverlay(\n                            title: toUppercase(\n                                AppLocalization.of(context).unconfirmedAccountHeader, context),\n                            confirmButtonText: AppLocalization.of(context).okayButton,\n                            singleButton: true,\n                            onConfirm: ()=>Navigator.pop(context),\n                            body: TextSpan(\n                              children: formatLocalizedColors(context,\n                                  AppLocalization.of(context).unconfirmedAccountParagraph),\n                            ),\n                      )\n                  );\n                }\n              },\n              padding: EdgeInsets.all(0),\n              shape: RoundedRectangleBorder(\n                borderRadius: BorderRadius.all(Radius.circular(12)),\n              ),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: <Widget>[\n                  // Left part of the card with account name and number\n                  Container(\n                    height: double.maxFinite,\n                    width: MediaQuery.of(context).size.width * 0.47 - 24,\n                    padding: EdgeInsetsDirectional.only(start: 16, end: 16),\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        isNotEmpty(widget.account.name.accountName)\n                            ? Container(\n                                margin: EdgeInsetsDirectional.only(bottom: 2),\n                                child: AutoSizeText(\n                                  widget.account.name.accountName,\n                                  style: AppStyles.accountCardName(context),\n                                  textAlign: TextAlign.left,\n                                  stepGranularity: 0.5,\n                                  maxLines: 1,\n                                  minFontSize: 8,\n                                ),\n                              )\n                            : SizedBox(),\n                        AutoSizeText(\n                          widget.account.account.toString(),\n                          style: AppStyles.accountCardAddress(context),\n                          textAlign: TextAlign.left,\n                          stepGranularity: 0.5,\n                          maxLines: 1,\n                        )\n                      ],\n                    ),\n                  ),\n                  // Right part of the card with balance\n                  Container(\n                    height: double.maxFinite,\n                    width: MediaQuery.of(context).size.width * 0.53 - 24,\n                    padding: EdgeInsetsDirectional.only(end: 16),\n                    alignment: Alignment(1, 0),\n                    child: Observer(\n                      builder: (context) {\n                        String status = \"\";\n                        if (widget.account.isFreepasa) {\n                          status = AppLocalization.of(context).pendingHeader;\n                        } else if (walletState.borrowedAccount != null && walletState.borrowedAccount.account == widget.account.account) {\n                          if (walletState.borrowedAccount.paid) {\n                            status = AppLocalization.of(context).borrowedTransferredHeader;\n                          } else {\n                            status = AppLocalization.of(context).borrowedHeader;\n                          }\n                        } else if (widget.account.state == AccountState.LISTED) {\n                          status = AppLocalization.of(context).forSaleHeader;\n                        }\n                        if (!widget.account.isBorrowed && !widget.account.isFreepasa && !(widget.account.state == AccountState.LISTED)) {\n                          return AutoSizeText.rich(\n                            TextSpan(\n                              children: [\n                                TextSpan(\n                                  text: \"\",\n                                  style: AppStyles\n                                      .iconFontPrimaryBalanceMediumPascal(\n                                          context),\n                                ),\n                                TextSpan(\n                                    text: \" \", style: TextStyle(fontSize: 7)),\n                                TextSpan(\n                                    text: widget.account.balance.toStringOpt(),\n                                    style: AppStyles.balanceMedium(context)),\n                              ],\n                            ),\n                            textAlign: TextAlign.end,\n                            maxLines: 1,\n                            minFontSize: 4,\n                            stepGranularity: 1,\n                            style: TextStyle(\n                              fontSize: 18,\n                            ),\n                          );                          \n                        } else {\n                          return Container(\n                            decoration: BoxDecoration(\n                                gradient: StateContainer.of(context)\n                                    .curTheme\n                                    .gradientPrimary,\n                                borderRadius: BorderRadius.circular(100)),\n                            padding:\n                                EdgeInsetsDirectional.fromSTEB(10, 5, 10, 5),\n                            child: AutoSizeText(\n                              status,\n                              style: AppStyles.textLightSmall600(context),\n                              textAlign: TextAlign.center,\n                              maxLines: 1,\n                              minFontSize: 8,\n                              stepGranularity: 1,\n                            ),\n                          );\n                        }\n                      },\n                    ) \n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  // The function that does nothing\n  void _doNothing() {\n    return null;\n  }\n\n  // Widget that returns the hidden buttons\n  List<Widget> _getButtons() {\n    List<Widget> ret = [];\n    if (widget.account.isFreepasa) {\n      return ret;\n    }\n    ret.add(\n      // Receive Icon\n      Container(\n        color: Colors.transparent,\n        margin: EdgeInsetsDirectional.only(\n          start: MediaQuery.of(context).size.width * 0.05,\n        ),\n        child: ClipRRect(\n          borderRadius: BorderRadius.circular(12),\n          child: Container(\n            height: 48,\n            width: 50,\n            decoration: BoxDecoration(\n                gradient: StateContainer.of(context).curTheme.gradientPrimary,\n                boxShadow: [\n                  StateContainer.of(context).curTheme.shadowPrimaryOne\n                ]),\n            child: FlatButton(\n                highlightColor: StateContainer.of(context).curTheme.textLight15,\n                splashColor: StateContainer.of(context).curTheme.textLight30,\n                onPressed: () {\n                  Navigator.pushNamed(context, '/account',\n                      arguments: widget.account);\n                  AppSheets.showBottomSheet(\n                      context: context,\n                      widget: ReceiveSheet(\n                        accountName: widget.account.name.accountName,\n                        accountNumber: widget.account.account,\n                      ));\n                },\n                shape: RoundedRectangleBorder(\n                    borderRadius: BorderRadius.circular(12.0)),\n                padding: EdgeInsets.all(0.0),\n                child: Icon(AppIcons.downarrow,\n                    color: StateContainer.of(context).curTheme.textLight,\n                    size: 24)),\n          ),\n        ),\n      ),\n    );\n    widget.account.balance == Currency('0')\n        ? _doNothing()\n        : ret.add(\n            // Send icon\n            Container(\n            color: Colors.transparent,\n            padding: EdgeInsetsDirectional.only(\n              start: (MediaQuery.of(context).size.width * 0.05) * 2 / 3,\n              end: (MediaQuery.of(context).size.width * 0.05) * 1 / 3,\n            ),\n            child: ClipRRect(\n              borderRadius: BorderRadius.circular(12),\n              child: Container(\n                margin: EdgeInsetsDirectional.only(top: 0, end: 0),\n                height: 48,\n                width: 50,\n                decoration: BoxDecoration(\n                    gradient:\n                        StateContainer.of(context).curTheme.gradientPrimary,\n                    boxShadow: [\n                      StateContainer.of(context).curTheme.shadowPrimaryOne\n                    ]),\n                child: FlatButton(\n                    highlightColor:\n                        StateContainer.of(context).curTheme.textLight15,\n                    splashColor:\n                        StateContainer.of(context).curTheme.textLight30,\n                    onPressed: () {\n                      if (widget.account.balance > Currency('0')) {\n                        Navigator.pushNamed(context, '/account',\n                            arguments: widget.account);\n                        AppSheets.showBottomSheet(\n                            context: context,\n                            widget: SendSheet(account: widget.account, localCurrency: StateContainer.of(context).curCurrency));\n                      }\n                    },\n                    shape: RoundedRectangleBorder(\n                        borderRadius: BorderRadius.circular(12.0)),\n                    padding: EdgeInsets.all(0.0),\n                    child: Icon(AppIcons.uparrow,\n                        color: StateContainer.of(context).curTheme.textLight,\n                        size: 24)),\n              ),\n            ),\n          ));\n    return ret;\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/app_text_field.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\n/// TextField button\nclass TextFieldButton extends StatelessWidget {\n  final IconData icon;\n  final Function onPressed;\n\n  TextFieldButton({@required this.icon, this.onPressed});\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      height: 38,\n      width: 38,\n      decoration: BoxDecoration(\n        shape: BoxShape.circle,\n        gradient: StateContainer.of(context).curTheme.gradientPrimary,\n      ),\n      child: FlatButton(\n        padding: EdgeInsets.all(0),\n        shape: CircleBorder(),\n        onPressed: () {\n          return onPressed != null ? onPressed() : null;\n        },\n        splashColor: StateContainer.of(context).curTheme.backgroundPrimary30,\n        highlightColor: StateContainer.of(context).curTheme.backgroundPrimary15,\n        child: Icon(\n          icon,\n          size: 22,\n          color: StateContainer.of(context).curTheme.backgroundPrimary,\n        ),\n      ),\n    );\n  }\n}\n\n/// A widget for our custom textfields\nclass AppTextField extends StatefulWidget {\n  final String label;\n  final TextFieldButton firstButton;\n  final TextFieldButton secondButton;\n  final TextEditingController controller;\n  final FocusNode focusNode;\n  final TextCapitalization textCapitalization;\n  final TextInputType inputType;\n  final TextStyle style;\n  final bool passwordField;\n  final Widget prefix;\n  final int maxLines;\n  final List<TextInputFormatter> inputFormatters;\n  final Function onChanged;\n  final Function onTap;\n  final bool readOnly;\n  final TextInputAction textInputAction;\n  final Function onSubmitted;\n\n  AppTextField(\n      {@required this.label,\n      @required this.style,\n      this.firstButton,\n      this.secondButton,\n      this.controller,\n      this.focusNode,\n      this.textCapitalization,\n      this.inputType = TextInputType.text,\n      this.prefix,\n      this.maxLines,\n      this.inputFormatters,\n      this.onChanged,\n      this.onTap,\n      this.onSubmitted,\n      this.passwordField = false,\n      this.readOnly = false,\n      this.textInputAction = TextInputAction.done});\n\n  _AppTextFieldState createState() => _AppTextFieldState();\n}\n\nclass _AppTextFieldState extends State<AppTextField> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: <Widget>[\n        Container(\n          alignment: Alignment(-1, 0),\n          child: AutoSizeText(\n            widget.label,\n            style: AppStyles.textFieldLabel(context),\n          ),\n        ),\n        Container(\n          child: Theme(\n              data: ThemeData(\n                primaryColor: StateContainer.of(context).curTheme.primary,\n                hintColor: StateContainer.of(context).curTheme.primary,\n                splashColor: StateContainer.of(context).curTheme.primary30,\n                highlightColor: StateContainer.of(context).curTheme.primary15,\n                textSelectionColor:\n                    StateContainer.of(context).curTheme.primary30,\n              ),\n              child: Stack(\n                alignment: AlignmentDirectional.center,\n                children: <Widget>[\n                  TextField(\n                    readOnly: widget.readOnly,\n                    controller: widget.controller,\n                    focusNode: widget.focusNode,\n                    obscureText: widget.passwordField,\n                    style: widget.style,\n                    cursorColor: StateContainer.of(context).curTheme.primary,\n                    keyboardType: widget.inputType,\n                    autocorrect: false,\n                    textCapitalization:\n                        widget.textCapitalization ?? TextCapitalization.none,\n                    textInputAction: widget.textInputAction,\n                    maxLines: widget.maxLines,\n                    minLines: 1,\n                    onSubmitted: (text) {\n                      if (widget.textInputAction == TextInputAction.done && widget.onSubmitted == null) {\n                        FocusScope.of(context).unfocus();\n                      } else if (widget.onSubmitted != null) {\n                        widget.onSubmitted();\n                      }\n                    },\n                    inputFormatters: widget.inputFormatters,\n                    onTap: widget.onTap,\n                    onChanged: (String newValue) {\n                      if (widget.onChanged != null) {\n                        widget.onChanged(newValue);\n                      }\n                    },\n                    decoration: InputDecoration(\n                      enabledBorder: UnderlineInputBorder(\n                        borderSide: BorderSide(\n                            color: StateContainer.of(context).curTheme.primary),\n                      ),\n                      focusedBorder: UnderlineInputBorder(\n                        borderSide: BorderSide(\n                            color: StateContainer.of(context).curTheme.primary,\n                            width: 2),\n                      ),\n                      errorBorder: UnderlineInputBorder(\n                        borderSide: BorderSide(\n                            color: StateContainer.of(context).curTheme.danger,\n                            width: 2),\n                      ),\n                      prefix: widget.prefix,\n                      suffixIcon: widget.firstButton == null &&\n                              widget.secondButton == null\n                          ? Container(\n                            width: 0,\n                            height: 0,\n                          )\n                          : Container(\n                              width: widget.firstButton == null ||\n                                      widget.secondButton == null\n                                  ? 50\n                                  : 100,\n                              height: 38,\n                            ),\n                    ),\n                  ),\n                  // Buttons\n                  Column(\n                    mainAxisSize: MainAxisSize.max,\n                    children: <Widget>[\n                      Row(\n                        mainAxisAlignment: MainAxisAlignment.end,\n                        children: <Widget>[\n                          widget.secondButton != null\n                              ? Container(\n                                  margin: EdgeInsetsDirectional.only(start: 12),\n                                  width: 38,\n                                  height: 38,\n                                  child: widget.secondButton)\n                              : SizedBox(),\n                          widget.firstButton != null\n                              ? Container(\n                                  margin: EdgeInsetsDirectional.only(start: 12),\n                                  width: 38,\n                                  height: 38,\n                                  child: widget.firstButton)\n                              : SizedBox()\n                        ],\n                      ),\n                    ],\n                  )\n                ],\n              )),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/buttons.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\nenum AppButtonType {\n  Primary,\n  PrimaryLeft,\n  PrimaryRight,\n  PrimaryOutline,\n  Success,\n  SuccessOutline,\n  Danger,\n  DangerOutline,\n}\n\n/// A widget for buttons\nclass AppButton extends StatefulWidget {\n  final AppButtonType type;\n  final String text;\n  final Function onPressed;\n  final bool disabled;\n  final bool buttonTop;\n  final bool buttonMiddle;\n  final bool placeholder;\n\n  AppButton(\n      {this.type,\n      this.text,\n      this.onPressed,\n      this.disabled = false,\n      this.buttonTop = false,\n      this.placeholder = false,\n      this.buttonMiddle = false});\n\n  _AppButtonState createState() => _AppButtonState();\n}\n\nclass _AppButtonState extends State<AppButton> {\n  @override\n  Widget build(BuildContext context) {\n    return Expanded(\n        child: Opacity(\n      opacity: widget.disabled ? 0.4 : 1.0,\n      child: Container(\n        margin: widget.buttonTop\n            ? EdgeInsetsDirectional.fromSTEB(20, 20, 20, 0)\n            : widget.buttonMiddle\n                ? EdgeInsetsDirectional.fromSTEB(20, 16, 20, 0)\n                : EdgeInsetsDirectional.fromSTEB(\n                    widget.type == AppButtonType.PrimaryRight ? 10 : 20,\n                    16,\n                    widget.type == AppButtonType.PrimaryLeft ? 10 : 20,\n                    (MediaQuery.of(context).padding.bottom) +\n                        (24 - (MediaQuery.of(context).padding.bottom) / 2),\n                  ),\n        height: 50,\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(12.0),\n          gradient: (widget.type == AppButtonType.Primary ||\n                  widget.type == AppButtonType.PrimaryOutline ||\n                  widget.type == AppButtonType.PrimaryLeft ||\n                  widget.type == AppButtonType.PrimaryRight)\n              ? StateContainer.of(context).curTheme.gradientPrimary\n              : (widget.type == AppButtonType.Danger ||\n                      widget.type == AppButtonType.DangerOutline ||\n                      widget.type == AppButtonType.Success ||\n                      widget.type == AppButtonType.SuccessOutline)\n                  ? null\n                  : StateContainer.of(context)\n                      .curTheme\n                      .gradientPrimary, // Success color placeholder\n          color: (widget.type == AppButtonType.Danger ||\n                  widget.type == AppButtonType.DangerOutline)\n              ? StateContainer.of(context).curTheme.danger\n              : widget.type == AppButtonType.Success ||\n                      widget.type == AppButtonType.SuccessOutline\n                  ? StateContainer.of(context).curTheme.success\n                  : null,\n          boxShadow: [\n            widget.type == AppButtonType.Primary ||\n                    widget.type == AppButtonType.PrimaryLeft ||\n                    widget.type == AppButtonType.PrimaryRight\n                ? StateContainer.of(context).curTheme.shadowPrimaryOne\n                : widget.type == AppButtonType.PrimaryOutline\n                    ? StateContainer.of(context).curTheme.shadowPrimaryTwo\n                    : widget.type == AppButtonType.Success\n                        ? StateContainer.of(context).curTheme.shadowSuccessOne\n                        : widget.type == AppButtonType.SuccessOutline\n                            ? StateContainer.of(context)\n                                .curTheme\n                                .shadowSuccessTwo\n                            : widget.type == AppButtonType.Danger\n                                ? StateContainer.of(context)\n                                    .curTheme\n                                    .shadowDangerOne\n                                : StateContainer.of(context)\n                                    .curTheme\n                                    .shadowDangerTwo,\n          ],\n        ),\n        child: widget.type == AppButtonType.Primary ||\n                widget.type == AppButtonType.PrimaryLeft ||\n                widget.type == AppButtonType.PrimaryRight ||\n                widget.type == AppButtonType.Success ||\n                widget.type == AppButtonType.Danger\n            // Primary Button\n            ? FlatButton(\n                shape: RoundedRectangleBorder(\n                    borderRadius: BorderRadius.circular(12.0)),\n                child: !widget.placeholder\n                    ? AutoSizeText(\n                        widget.text,\n                        textAlign: TextAlign.center,\n                        maxLines: widget.type == AppButtonType.Danger ? 2 : 1,\n                        stepGranularity: 0.1,\n                        style: widget.type == AppButtonType.Danger\n                            ? AppStyles.buttonDanger(context)\n                            : AppStyles.buttonPrimary(context),\n                      )\n                    // Placeholder button rectangle\n                    : Container(\n                        decoration: BoxDecoration(\n                          color: StateContainer.of(context).curTheme.textLight.withOpacity(0.75),\n                          borderRadius: BorderRadius.circular(100),\n                        ),\n                        child: AutoSizeText(\n                          widget.text,\n                          textAlign: TextAlign.center,\n                          maxLines: widget.type == AppButtonType.Danger ? 2 : 1,\n                          stepGranularity: 0.1,\n                          style: widget.type == AppButtonType.Danger\n                              ? AppStyles.buttonDanger(context)\n                              : AppStyles.buttonPrimary(context),\n                        ),\n                      ),\n                splashColor:\n                    StateContainer.of(context).curTheme.backgroundPrimary30,\n                highlightColor:\n                    StateContainer.of(context).curTheme.backgroundPrimary15,\n                onPressed: () {\n                  if (widget.onPressed != null && !widget.disabled) {\n                    widget.onPressed();\n                  }\n                  return;\n                },\n              )\n            // Primary Outlined Button\n            : Stack(\n                children: <Widget>[\n                  Container(\n                    margin: EdgeInsets.all(2),\n                    height: 46,\n                    decoration: BoxDecoration(\n                      borderRadius: BorderRadius.circular(10),\n                      color:\n                          StateContainer.of(context).curTheme.backgroundPrimary,\n                    ),\n                  ),\n                  Container(\n                    height: 50,\n                    width: double.maxFinite,\n                    decoration: BoxDecoration(\n                      borderRadius: BorderRadius.circular(12),\n                      color: Colors.transparent,\n                    ),\n                    child: FlatButton(\n                      child: AutoSizeText(\n                        widget.text,\n                        textAlign: TextAlign.center,\n                        maxLines: 1,\n                        stepGranularity: 0.1,\n                        style: widget.type == AppButtonType.DangerOutline\n                            ? AppStyles.buttonDangerOutline(context)\n                            : widget.type == AppButtonType.SuccessOutline\n                                ? AppStyles.buttonSuccessOutline(context)\n                                : AppStyles.buttonPrimaryOutline(context),\n                      ),\n                      color: Colors.transparent,\n                      splashColor: widget.type == AppButtonType.SuccessOutline\n                          ? StateContainer.of(context).curTheme.success30\n                          : widget.type == AppButtonType.DangerOutline\n                              ? StateContainer.of(context).curTheme.danger30\n                              : StateContainer.of(context).curTheme.primary30,\n                      highlightColor: widget.type ==\n                              AppButtonType.SuccessOutline\n                          ? StateContainer.of(context).curTheme.success15\n                          : widget.type == AppButtonType.DangerOutline\n                              ? StateContainer.of(context).curTheme.danger15\n                              : StateContainer.of(context).curTheme.primary15,\n                      shape: RoundedRectangleBorder(\n                          borderRadius: BorderRadius.circular(12.0)),\n                      onPressed: () {\n                        if (widget.onPressed != null && !widget.disabled) {\n                          widget.onPressed();\n                        }\n                        return;\n                      },\n                    ),\n                  ),\n                ],\n              ),\n      ),\n    ));\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/error_container.dart",
    "content": "import 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\nclass ErrorContainer extends StatelessWidget {\n  final String errorText;\n  ErrorContainer({@required this.errorText});\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      alignment: Alignment(-1, 0),\n      margin: EdgeInsetsDirectional.only(start: 30, end: 30, top: 4, bottom: 0),\n      child: Text(this.errorText,\n          style: AppStyles.dangerSmallest600(context),\n          textAlign: TextAlign.start),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/fee_container.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\nclass FeeContainer extends StatelessWidget {\n  final String feeText;\n  FeeContainer({@required this.feeText});\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      margin: EdgeInsetsDirectional.fromSTEB(30, 4, 30, 0),\n      alignment: Alignment(-1, 0),\n      child: AutoSizeText.rich(\n        TextSpan(children: [\n          TextSpan(\n            text: AppLocalization.of(context).feeColonHeader + \" \",\n            style: AppStyles.primarySmall600(context),\n          ),\n          TextSpan(\n            text: \"\",\n            style: AppStyles.iconFontPrimaryBalanceSmallPascal(context),\n          ),\n          TextSpan(text: \" \", style: TextStyle(fontSize: 6)),\n          TextSpan(\n              text: this.feeText, style: AppStyles.primarySmall600(context)),\n        ]),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/operation_list_item.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:quiver/strings.dart';\n\nenum OperationType {\n  Received,\n  Sent,\n  NameChanged,\n  ListedForSale,\n  DelistedForSale,\n  Welcome\n}\n\n/// A widget for displaying a mnemonic phrase\nclass OperationListItem extends StatefulWidget {\n  final OperationType type;\n  final String amount;\n  final String address;\n  final String date;\n  final String payload;\n  final Function onPressed;\n  final String name;\n  final String price;\n  final bool isContact;\n\n  OperationListItem({\n    this.type,\n    this.amount,\n    this.address,\n    this.date,\n    this.payload,\n    this.onPressed,\n    this.name,\n    this.price,\n    this.isContact = false\n  });\n\n  _OperationListItemState createState() => _OperationListItemState();\n}\n\nclass _OperationListItemState extends State<OperationListItem> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(children: <Widget>[\n      Container(\n        width: double.maxFinite,\n        height: widget.type == OperationType.Welcome ? null : 74,\n        child: FlatButton(\n          padding: EdgeInsetsDirectional.only(start: 24, end: 24),\n          onPressed: () {\n            if (widget.onPressed != null) {\n              widget.onPressed();\n            }\n            return;\n          },\n          splashColor: StateContainer.of(context).curTheme.primary30,\n          highlightColor: StateContainer.of(context).curTheme.primary15,\n          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)),\n          child: widget.type == OperationType.Welcome\n              ? Container(\n                  margin: EdgeInsetsDirectional.fromSTEB(30, 16, 30, 16),\n                  child: AutoSizeText.rich(\n                    TextSpan(\n                        children: formatLocalizedColors(context,\n                            AppLocalization.of(context).newAccountParagraph)),\n                    stepGranularity: 0.5,\n                    maxLines: 3,\n                    minFontSize: 8,\n                    textAlign: TextAlign.center,\n                    style: TextStyle(fontSize: 14),\n                  ),\n                )\n              : Row(\n                  mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                  children: <Widget>[\n                    Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        // Operation Type\n                        Container(\n                          padding: EdgeInsetsDirectional.fromSTEB(8, 4, 8, 4),\n                          decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(100),\n                              color: widget.type == OperationType.Received\n                                  ? StateContainer.of(context).curTheme.primary\n                                  : widget.type == OperationType.Sent\n                                      ? StateContainer.of(context)\n                                          .curTheme\n                                          .textDark\n                                      : StateContainer.of(context)\n                                          .curTheme\n                                          .secondary),\n                          child: AutoSizeText(\n                            widget.type == OperationType.Received\n                                ? AppLocalization.of(context).receivedHeader\n                                : widget.type == OperationType.Sent\n                                    ? AppLocalization.of(context).sentHeader\n                                    : widget.type == OperationType.NameChanged\n                                        ? AppLocalization.of(context)\n                                            .nameChangedHeader\n                                        : widget.type ==\n                                                OperationType.ListedForSale\n                                            ? AppLocalization.of(context)\n                                                .listedForSaleHeader\n                                            : widget.type ==\n                                                    OperationType\n                                                        .DelistedForSale\n                                                ? AppLocalization.of(context)\n                                                    .delistedHeader\n                                                : AppLocalization.of(context)\n                                                    .undefinedHeader,\n                            style: AppStyles.operationType(context),\n                          ),\n                        ),\n                        // Amount & Payload indicator or New Account Name\n                        widget.type == OperationType.DelistedForSale\n                            ? SizedBox()\n                            : Container(\n                                width:\n                                    MediaQuery.of(context).size.width / 2 - 72,\n                                margin: EdgeInsetsDirectional.only(top: 4),\n                                child: widget.type == OperationType.Received ||\n                                        widget.type == OperationType.Sent ||\n                                        widget.type ==\n                                            OperationType.ListedForSale\n                                    ? AutoSizeText.rich(\n                                        TextSpan(\n                                          children: [\n                                            TextSpan(\n                                              text: \"\",\n                                              style: widget.type ==\n                                                      OperationType.Received\n                                                  ? AppStyles\n                                                      .iconFontPrimaryBalanceSmallPascal(\n                                                          context)\n                                                  : widget.type ==\n                                                          OperationType.Sent\n                                                      ? AppStyles\n                                                          .iconFontTextDarkBalanceSmallPascal(\n                                                              context)\n                                                      : AppStyles\n                                                          .iconFontSecondarySmallPascal(\n                                                              context),\n                                            ),\n                                            TextSpan(\n                                                text: \" \",\n                                                style: TextStyle(fontSize: 7)),\n                                            TextSpan(\n                                                text: widget.type ==\n                                                            OperationType\n                                                                .Received ||\n                                                        widget.type ==\n                                                            OperationType.Sent\n                                                    ? widget.amount\n                                                    : widget.price,\n                                                style: widget.type ==\n                                                        OperationType.Received\n                                                    ? AppStyles.balanceSmall(\n                                                        context)\n                                                    : widget.type ==\n                                                            OperationType.Sent\n                                                        ? AppStyles\n                                                            .balanceSmallTextDark(\n                                                                context)\n                                                        : AppStyles\n                                                            .balanceSmallSecondary(\n                                                                context)),\n                                            isNotEmpty(widget.payload)\n                                                ? TextSpan(\n                                                    text: \" \",\n                                                    style:\n                                                        TextStyle(fontSize: 14))\n                                                : TextSpan(),\n                                            isNotEmpty(widget.payload)\n                                                ? TextSpan(\n                                                    text: \"\",\n                                                    style: widget.type ==\n                                                            OperationType\n                                                                .Received\n                                                        ? AppStyles\n                                                            .iconFontPrimaryBalanceSmallest(\n                                                                context)\n                                                        : AppStyles\n                                                            .iconFontTextDarkBalanceSmallest(\n                                                                context),\n                                                  )\n                                                : TextSpan(),\n                                          ],\n                                        ),\n                                        textAlign: TextAlign.start,\n                                        maxLines: 1,\n                                        minFontSize: 4,\n                                        stepGranularity: 1,\n                                        style: TextStyle(\n                                          fontSize: 14,\n                                        ),\n                                      )\n                                    : widget.type == OperationType.NameChanged\n                                        ? AutoSizeText(\n                                            widget.name,\n                                            textAlign: TextAlign.start,\n                                            maxLines: 1,\n                                            minFontSize: 4,\n                                            stepGranularity: 1,\n                                            style:\n                                                AppStyles.balanceSmallSecondary(\n                                                    context),\n                                          )\n                                        : SizedBox(),\n                              ),\n                      ],\n                    ),\n                    Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: <Widget>[\n                        widget.type == OperationType.Received ||\n                                widget.type == OperationType.Sent\n                            ?\n                            // Address\n                            widget.isContact\n                                ? Container(\n                                    width:\n                                        MediaQuery.of(context).size.width / 2 -\n                                            72,\n                                    margin:\n                                        EdgeInsetsDirectional.only(bottom: 4),\n                                    alignment: Alignment(1, 0),\n                                    child: AutoSizeText.rich(\n                                      TextSpan(children: [\n                                        TextSpan(\n                                          text: \" \",\n                                          style: AppStyles.iconFontPrimarySmall(\n                                              context),\n                                        ),\n                                        TextSpan(\n                                          text: widget.address,\n                                          style: AppStyles.contactsItemName(\n                                              context),\n                                        ),\n                                      ]),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.end,\n                                      style: TextStyle(\n                                        fontSize: 14,\n                                      ),\n                                    ),\n                                  )\n                                : Container(\n                                    width:\n                                        MediaQuery.of(context).size.width / 2 -\n                                            72,\n                                    margin:\n                                        EdgeInsetsDirectional.only(bottom: 4),\n                                    alignment: Alignment(1, 0),\n                                    child: AutoSizeText(\n                                      widget.address,\n                                      style: AppStyles.monoTextDarkSmall400(\n                                          context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                      textAlign: TextAlign.end,\n                                    ),\n                                  )\n                            : SizedBox(),\n                        // Date\n                        Container(\n                          width: MediaQuery.of(context).size.width / 2 - 72,\n                          alignment: Alignment(1, 0),\n                          child: AutoSizeText(\n                            widget.date,\n                            style: AppStyles.operationDate(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                            textAlign: TextAlign.end,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n        ),\n      ),\n      Container(\n        width: double.maxFinite,\n        height: 1,\n        color: StateContainer.of(context).curTheme.textDark10,\n      )\n    ]);\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/overlay_dialog.dart",
    "content": "import 'dart:ui';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/buttons.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\n\n/// An overlay that supports a list of options as well as text/confirm actions\nclass DialogOverlay extends StatefulWidget {\n  final String title;\n  final List<DialogListItem> optionsList;\n  final bool warningStyle;\n  final TextSpan body;\n  final String confirmButtonText;\n  final Function onConfirm;\n  final bool feeDialog;\n  final bool singleButton;\n\n  DialogOverlay(\n      {this.title,\n      this.optionsList,\n      this.body,\n      this.confirmButtonText,\n      this.onConfirm,\n      this.warningStyle = false,\n      this.singleButton = false,\n      this.feeDialog = false});\n\n  @override\n  State<StatefulWidget> createState() => _DialogOverlayState();\n}\n\nclass _DialogOverlayState extends State<DialogOverlay>\n    with SingleTickerProviderStateMixin {\n  AnimationController _controller;\n  Animation<double> _scaleAnimation;\n  Animation<double> _opacityAnimation;\n\n  @override\n  void initState() {\n    super.initState();\n\n    _controller =\n        AnimationController(vsync: this, duration: Duration(milliseconds: 200));\n    _scaleAnimation = Tween(begin: 0.75, end: 1.0).animate(\n        CurvedAnimation(parent: _controller, curve: Curves.decelerate));\n    _opacityAnimation = Tween(begin: 0.25, end: 1.0).animate(\n        CurvedAnimation(parent: _controller, curve: Curves.decelerate));\n    _controller.addListener(() {\n      setState(() {});\n    });\n\n    _controller.forward();\n  }\n\n  @override\n  void dispose() {\n    _controller?.dispose();\n    super.dispose();\n  }\n\n  Widget buildListItems(List<DialogListItem> optionsList) {\n    List<Widget> widgets = [];\n    for (var option in optionsList) {\n      widgets.add(\n        // Single Option\n        Container(\n          width: double.maxFinite,\n          height: 50,\n          child: FlatButton(\n              onPressed: () {\n                if (option.action == null || option.disabled) {\n                  return;\n                }\n                option.action();\n              },\n              shape: RoundedRectangleBorder(\n                borderRadius: BorderRadius.circular(0),\n              ),\n              padding: EdgeInsets.all(0),\n              child: Container(\n                alignment: Alignment(-1, 0),\n                margin: EdgeInsetsDirectional.only(start: 24, end: 24),\n                child: AutoSizeText(\n                  option.option,\n                  style: option.disabled\n                      ? AppStyles.paragraphBigDisabled(context)\n                      : AppStyles.paragraphBig(context),\n                  textAlign: TextAlign.start,\n                  maxLines: 1,\n                  stepGranularity: 0.1,\n                ),\n              )),\n        ),\n      );\n    }\n    return Column(children: widgets);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: Material(\n        color: Colors.transparent,\n        child: BackdropFilter(\n          filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n          child: FadeTransition(\n            opacity: _opacityAnimation,\n            child: ScaleTransition(\n              scale: _scaleAnimation,\n              child: Container(\n                margin: EdgeInsetsDirectional.only(start: 20, end: 20),\n                constraints: BoxConstraints(\n                  maxHeight: MediaQuery.of(context).size.height * 0.8,\n                  maxWidth: 280,\n                ),\n                decoration: BoxDecoration(\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  borderRadius: BorderRadius.circular(12),\n                  boxShadow: [\n                    BoxShadow(\n                      color: StateContainer.of(context).curTheme.shadow50,\n                      offset: Offset(0, 30),\n                      blurRadius: 60,\n                      spreadRadius: -10,\n                    ),\n                  ],\n                ),\n                child: ClipRRect(\n                  borderRadius: BorderRadius.circular(12),\n                  child: Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: <Widget>[\n                      Container(\n                        width: double.maxFinite,\n                        decoration: BoxDecoration(\n                          gradient: widget.warningStyle\n                              ? null\n                              : StateContainer.of(context)\n                                  .curTheme\n                                  .gradientPrimary,\n                          color: widget.warningStyle\n                              ? StateContainer.of(context).curTheme.danger\n                              : null,\n                          borderRadius: BorderRadius.only(\n                              topLeft: Radius.circular(12),\n                              topRight: Radius.circular(12)),\n                        ),\n                        child: Container(\n                          margin:\n                              EdgeInsetsDirectional.fromSTEB(24, 16, 24, 16),\n                          child: AutoSizeText(\n                            widget.title,\n                            style: AppStyles.modalHeader(context),\n                            maxLines: 1,\n                            stepGranularity: 0.1,\n                          ),\n                        ),\n                      ),\n                      // Options container\n                      widget.body != null\n                          ? Column(\n                              children: <Widget>[\n                                Container(\n                                  margin: EdgeInsetsDirectional.fromSTEB(\n                                      24, 16, 24, 16),\n                                  child: Column(\n                                    children: <Widget>[\n                                      AutoSizeText.rich(\n                                        widget.body,\n                                        stepGranularity: 0.1,\n                                        maxLines: 8,\n                                        minFontSize: 8,\n                                      )\n                                    ],\n                                  ),\n                                ),\n                                Row(\n                                  children: <Widget>[\n                                    AppButton(\n                                      type: widget.feeDialog ||\n                                              widget.singleButton\n                                          ? AppButtonType.Primary\n                                          : AppButtonType.Danger,\n                                      text: widget.confirmButtonText,\n                                      buttonTop:\n                                          widget.singleButton ? false : true,\n                                      onPressed: () {\n                                        if (widget.onConfirm != null) {\n                                          widget.onConfirm();\n                                        }\n                                      },\n                                    ),\n                                  ],\n                                ),\n                                !widget.singleButton\n                                    ? Row(\n                                        children: <Widget>[\n                                          AppButton(\n                                            type: widget.feeDialog\n                                                ? AppButtonType.PrimaryOutline\n                                                : AppButtonType.DangerOutline,\n                                            text: toUppercase(\n                                                AppLocalization.of(context)\n                                                    .cancelButton,\n                                                context),\n                                            onPressed: () {\n                                              Navigator.of(context).pop();\n                                            },\n                                          ),\n                                        ],\n                                      )\n                                    : SizedBox(),\n                              ],\n                            )\n                          : Container(\n                              constraints: BoxConstraints(\n                                  maxHeight:\n                                      MediaQuery.of(context).size.height * 0.6 -\n                                          60,\n                                  minHeight: 0),\n                              // Options list\n                              child: SingleChildScrollView(\n                                padding: EdgeInsetsDirectional.only(\n                                    top: 8, bottom: 8),\n                                child: buildListItems(widget.optionsList),\n                              ),\n                            ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass DialogListItem {\n  final String option;\n  final Function action;\n  final bool disabled;\n  DialogListItem({@required this.option, this.action, this.disabled = false});\n}\n\n/// Modified dialog function from flutter source. Modified for the backdrop blur effect\n\nWidget _buildMaterialDialogTransitions(\n    BuildContext context,\n    Animation<double> animation,\n    Animation<double> secondaryAnimation,\n    Widget child) {\n  return FadeTransition(\n    opacity: CurvedAnimation(\n      parent: animation,\n      curve: Curves.easeOut,\n    ),\n    child: child,\n  );\n}\n\nFuture<T> showAppDialog<T>({\n  @required\n      BuildContext context,\n  bool barrierDismissible = true,\n  @Deprecated(\n      'Instead of using the \"child\" argument, return the child from a closure '\n      'provided to the \"builder\" argument. This will ensure that the BuildContext '\n      'is appropriate for widgets built in the dialog.')\n      Widget child,\n  WidgetBuilder builder,\n}) {\n  assert(child == null || builder == null);\n  assert(debugCheckHasMaterialLocalizations(context));\n\n  final ThemeData theme = Theme.of(context);\n  return showGeneralDialog(\n    context: context,\n    pageBuilder: (BuildContext buildContext, Animation<double> animation,\n        Animation<double> secondaryAnimation) {\n      final Widget pageChild = child ?? Builder(builder: builder);\n      return SafeArea(\n        child: Builder(builder: (BuildContext context) {\n          return theme != null\n              ? Theme(data: theme, child: pageChild)\n              : pageChild;\n        }),\n      );\n    },\n    barrierDismissible: barrierDismissible,\n    barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,\n    barrierColor: StateContainer.of(context).curTheme.overlay10,\n    transitionDuration: const Duration(milliseconds: 0),\n    transitionBuilder: _buildMaterialDialogTransitions,\n  );\n}\n"
  },
  {
    "path": "lib/ui/widgets/payload.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/app_icons.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/app_text_field.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/tap_outside_unfocus.dart';\nimport 'package:blaise_wallet_flutter/util/user_data_util.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:quiver/strings.dart';\nimport 'package:event_taxi/event_taxi.dart';\n\nclass Payload extends StatefulWidget {\n  final Function onPayloadChanged;\n  final String initialPayload;\n  final bool allowEncryption;\n\n  Payload(\n      {@required this.onPayloadChanged,\n      this.initialPayload = \"\",\n      this.allowEncryption = true})\n      : super();\n\n  @override\n  _PayloadState createState() => _PayloadState();\n}\n\nclass _PayloadState extends State<Payload> {\n  bool _hasPayload;\n  String _payload;\n  bool _encrypted;\n\n  StreamSubscription<PayloadChangedEvent> _payloadSub;\n\n  void _registerBus() {\n    _payloadSub = EventTaxiImpl.singleton()\n        .registerTo<PayloadChangedEvent>()\n        .listen((event) {\n      setState(() {\n        _payload = event.payload;\n        _encrypted = false;\n        _hasPayload = isNotEmpty(event.payload);\n      });\n    });\n  }\n\n  void _destroyBus() {\n    if (_payloadSub != null) {\n      _payloadSub.cancel();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _registerBus();\n    this._hasPayload = isNotEmpty(widget.initialPayload);\n    this._payload = widget.initialPayload;\n    this._encrypted = false;\n  }\n\n  @override\n  void dispose() {\n    _destroyBus();\n    super.dispose();\n  }\n\n  void handlePayloadChange(String newPayload, bool encrypted) {\n    if (isNotEmpty(newPayload) && mounted) {\n      widget.onPayloadChanged(newPayload, encrypted);\n      setState(() {\n        _payload = newPayload;\n        _hasPayload = true;\n        _encrypted = encrypted;\n      });\n    } else if (mounted) {\n      widget.onPayloadChanged(newPayload, encrypted);\n      setState(() {\n        _payload = \"\";\n        _hasPayload = false;\n        _encrypted = encrypted;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // Payload text and edit button\n    return this._hasPayload\n        ? Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: <Widget>[\n              // Container for the payload\n              Container(\n                  constraints: BoxConstraints(\n                      maxWidth: MediaQuery.of(context).size.width - 110),\n                  margin: EdgeInsetsDirectional.fromSTEB(30, 20, 12, 0),\n                  padding: EdgeInsetsDirectional.fromSTEB(12, 8, 12, 8),\n                  decoration: BoxDecoration(\n                    borderRadius: BorderRadius.circular(12),\n                    border: Border.all(\n                        width: 1,\n                        color: StateContainer.of(context).curTheme.textDark15),\n                    color: StateContainer.of(context).curTheme.textDark10,\n                  ),\n                  child: Row(mainAxisSize: MainAxisSize.min, children: <Widget>[\n                    Container(\n                      constraints: BoxConstraints(\n                          maxWidth: MediaQuery.of(context).size.width -\n                              (_encrypted ? 151 : 136)),\n                      child: AutoSizeText(\n                        this._payload,\n                        maxLines: 3,\n                        stepGranularity: 0.1,\n                        minFontSize: 6,\n                        textAlign: TextAlign.left,\n                        style: AppStyles.paragraphMedium(context),\n                      ),\n                    ),\n                    _encrypted\n                        ? Container(\n                            alignment: Alignment.center,\n                            margin: EdgeInsetsDirectional.only(start: 3.0),\n                            child: Icon(FontAwesomeIcons.lock,\n                                size: 12,\n                                color: StateContainer.of(context)\n                                    .curTheme\n                                    .textDark))\n                        : SizedBox()\n                  ])),\n              // Container for the edit button\n              Container(\n                  margin: EdgeInsetsDirectional.fromSTEB(0, 20, 30, 0),\n                  child: TextFieldButton(\n                    icon: Icons.edit,\n                    onPressed: () async {\n                      await showAppDialog(\n                          context: context,\n                          builder: (_) => PayloadDialog(\n                                initialPayload: _payload,\n                                encrypted: _encrypted,\n                                onPayloadChanged: (newPayload, encrypted) {\n                                  handlePayloadChange(newPayload, encrypted);\n                                },\n                              ));\n                    },\n                  ))\n            ],\n          )\n        :\n        // \"Add Payload\" button\n        Row(\n            children: <Widget>[\n              Container(\n                height: 40.0,\n                decoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(100.0),\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  boxShadow: [\n                    StateContainer.of(context).curTheme.shadowTextDark,\n                  ],\n                ),\n                margin: EdgeInsetsDirectional.fromSTEB(30, 20, 30, 40),\n                child: FlatButton(\n                  shape: RoundedRectangleBorder(\n                      borderRadius: BorderRadius.circular(100.0)),\n                  child: AutoSizeText(\n                    AppLocalization.of(context).addAPayloadButton,\n                    textAlign: TextAlign.center,\n                    maxLines: 1,\n                    stepGranularity: 0.1,\n                    style: AppStyles.buttonMiniBg(context),\n                  ),\n                  onPressed: () async {\n                    await showAppDialog(\n                        context: context,\n                        builder: (_) => PayloadDialog(\n                              onPayloadChanged: (newPayload, encrypted) {\n                                handlePayloadChange(newPayload, encrypted);\n                              },\n                              allowEncryption: widget.allowEncryption,\n                            ));\n                  },\n                ),\n              ),\n            ],\n          );\n  }\n}\n\n/// An overlay that supports a list of options as well as text/confirm actions\nclass PayloadDialog extends StatefulWidget {\n  final Function onPayloadChanged;\n  final String initialPayload;\n  final bool encrypted;\n  final bool allowEncryption;\n\n  PayloadDialog(\n      {@required this.onPayloadChanged,\n      this.initialPayload = \"\",\n      this.encrypted = false,\n      this.allowEncryption = true})\n      : super();\n\n  @override\n  _PayloadDialogState createState() => _PayloadDialogState();\n}\n\nclass _PayloadDialogState extends State<PayloadDialog>\n    with SingleTickerProviderStateMixin {\n  AnimationController _controller;\n  Animation<double> _scaleAnimation;\n  Animation<double> _opacityAnimation;\n\n  TextEditingController payloadController;\n\n  bool _encrypted;\n\n  @override\n  void initState() {\n    super.initState();\n    // Set initial value\n    this.payloadController = TextEditingController();\n    this.payloadController.text = widget.initialPayload;\n    this._encrypted = widget.encrypted;\n\n    _controller =\n        AnimationController(vsync: this, duration: Duration(milliseconds: 200));\n    _scaleAnimation = Tween(begin: 0.75, end: 1.0).animate(\n        CurvedAnimation(parent: _controller, curve: Curves.decelerate));\n    _opacityAnimation = Tween(begin: 0.25, end: 1.0).animate(\n        CurvedAnimation(parent: _controller, curve: Curves.decelerate));\n    _controller.addListener(() {\n      setState(() {});\n    });\n\n    _controller.forward();\n  }\n\n  @override\n  void dispose() {\n    _controller?.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TapOutsideUnfocus(\n        child: Align(\n            alignment: Alignment(0, 1),\n            child: Material(\n              color: Colors.transparent,\n              child: BackdropFilter(\n                filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),\n                child: FadeTransition(\n                  opacity: _opacityAnimation,\n                  child: ScaleTransition(\n                    scale: _scaleAnimation,\n                    child: AnimatedContainer(\n                      duration: Duration(milliseconds: 200),\n                      curve: Curves.easeOutQuad,\n                      margin: EdgeInsetsDirectional.only(\n                          start: 20,\n                          end: 20,\n                          bottom:\n                              MediaQuery.of(context).viewInsets.bottom + 50),\n                      constraints: BoxConstraints(\n                          maxHeight: MediaQuery.of(context).size.height * 0.4,\n                          maxWidth: MediaQuery.of(context).size.width - 40),\n                      decoration: BoxDecoration(\n                        color: StateContainer.of(context)\n                            .curTheme\n                            .backgroundPrimary,\n                        borderRadius: BorderRadius.circular(12),\n                        boxShadow: [\n                          BoxShadow(\n                            color: StateContainer.of(context).curTheme.shadow50,\n                            offset: Offset(0, 30),\n                            blurRadius: 60,\n                            spreadRadius: -10,\n                          ),\n                        ],\n                      ),\n                      child: ClipRRect(\n                        borderRadius: BorderRadius.circular(12),\n                        child: Column(\n                          mainAxisSize: MainAxisSize.min,\n                          children: <Widget>[\n                            Container(\n                                constraints: BoxConstraints(\n                                    maxHeight:\n                                        MediaQuery.of(context).size.height *\n                                                0.6 -\n                                            60,\n                                    minHeight: 0),\n                                // Options list\n                                child: Column(\n                                  mainAxisSize: MainAxisSize.min,\n                                  children: <Widget>[\n                                    // Container for the amount text field\n                                    Container(\n                                      margin: EdgeInsetsDirectional.fromSTEB(\n                                          20, 24, 20, 0),\n                                      child: AppTextField(\n                                        label: AppLocalization.of(context)\n                                            .payloadTextFieldHeader,\n                                        controller: payloadController,\n                                        style: AppStyles.paragraph(context),\n                                        maxLines: 1,\n                                        firstButton: TextFieldButton(\n                                            icon: AppIcons.paste,\n                                            onPressed: () {\n                                              Clipboard.getData(\"text/plain\")\n                                                  .then((clipboardData) {\n                                                if (clipboardData.text.length <=\n                                                    80) {\n                                                  widget.onPayloadChanged(\n                                                      clipboardData.text,\n                                                      _encrypted);\n                                                  payloadController.text =\n                                                      clipboardData.text;\n                                                }\n                                              });\n                                            }),\n                                        secondButton: TextFieldButton(\n                                            icon: AppIcons.scan,\n                                            onPressed: () async {\n                                              String text =\n                                                  await UserDataUtil.getQRData(\n                                                      DataType.RAW,\n                                                      StateContainer.of(context).curTheme.scannerTheme);\n                                              if (text != null &&\n                                                  text.length <= 80) {\n                                                widget.onPayloadChanged(\n                                                    text, _encrypted);\n                                                payloadController.text = text;\n                                              }\n                                            }),\n                                        onChanged: (payload) {\n                                          widget.onPayloadChanged(\n                                              payload, _encrypted);\n                                        },\n                                        inputFormatters: [\n                                          LengthLimitingTextInputFormatter(80)\n                                        ],\n                                      ),\n                                    ),\n                                    widget.allowEncryption\n                                        ? Row(\n                                            children: <Widget>[\n                                              Container(\n                                                  constraints: BoxConstraints(\n                                                      maxWidth:\n                                                          MediaQuery.of(context)\n                                                                  .size\n                                                                  .width -\n                                                              152),\n                                                  margin: EdgeInsetsDirectional\n                                                      .fromSTEB(20, 16, 0, 20),\n                                                  child: AutoSizeText(\n                                                    AppLocalization.of(context)\n                                                        .encryptPayloadHeader,\n                                                    style: AppStyles\n                                                        .textFieldLabel(\n                                                            context),\n                                                    minFontSize: 8,\n                                                    stepGranularity: 0.1,\n                                                    maxLines: 1,\n                                                  )),\n                                              Container(\n                                                margin: EdgeInsetsDirectional\n                                                    .fromSTEB(4, 16, 30, 18),\n                                                child: Switch(\n                                                  value: _encrypted,\n                                                  onChanged: (bool) {\n                                                    widget.onPayloadChanged(\n                                                        this\n                                                            .payloadController\n                                                            .text,\n                                                        !_encrypted);\n                                                    setState(() {\n                                                      _encrypted = !_encrypted;\n                                                    });\n                                                  },\n                                                  inactiveThumbColor:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .switchKnob,\n                                                  inactiveTrackColor:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .switchTrack,\n                                                  activeColor:\n                                                      StateContainer.of(context)\n                                                          .curTheme\n                                                          .primary,\n                                                ),\n                                              ),\n                                            ],\n                                          )\n                                        : SizedBox(height: 34),\n                                  ],\n                                )),\n                          ],\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            )));\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/pin_screen.dart",
    "content": "import 'dart:math';\n\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/util/haptic_util.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nenum PinOverlayType { NEW_PIN, ENTER_PIN }\n\nclass ShakeCurve extends Curve {\n  @override\n  double transform(double t) {\n    //t from 0.0 to 1.0\n    return sin(t * 3 * pi);\n  }\n}\n\nclass PinScreen extends StatefulWidget {\n  final PinOverlayType type;\n  final String expectedPin;\n  final String description;\n  final Function onSuccess;\n\n  PinScreen(\n      {@required this.type,\n      @required this.onSuccess,\n      this.description = \"\",\n      this.expectedPin = \"\"});\n\n  @override\n  _PinScreenState createState() => _PinScreenState();\n}\n\nclass _PinScreenState extends State<PinScreen>\n    with SingleTickerProviderStateMixin {\n  static const int MAX_ATTEMPTS = 5;\n  static const int PIN_LENGTH = 6;\n\n  String pinEnterTitle = \"\";\n  String pinCreateTitle = \"\";\n\n  // Stateful data\n  List<IconData> _dotStates;\n  String _pin;\n  String _pinConfirmed;\n  bool\n      _awaitingConfirmation; // true if pin has been entered once, false if not entered once\n  String _header;\n  int _failedAttempts = 0;\n\n  // Invalid animation\n  AnimationController _controller;\n  Animation<double> _animation;\n\n  @override\n  void initState() {\n    super.initState();\n    // Initialize list all empty\n    if (widget.type == PinOverlayType.ENTER_PIN) {\n      _header = pinEnterTitle;\n    } else {\n      _header = pinCreateTitle;\n    }\n    _dotStates = List.filled(PIN_LENGTH, FontAwesomeIcons.circle);\n    _awaitingConfirmation = false;\n    _pin = \"\";\n    _pinConfirmed = \"\";\n    // Get adjusted failed attempts\n    sl.get<SharedPrefsUtil>().getLockAttempts().then((attempts) {\n      setState(() {\n        _failedAttempts = attempts % MAX_ATTEMPTS;\n      });\n    });\n    // Set animation\n    _controller = AnimationController(\n        duration: const Duration(milliseconds: 350), vsync: this);\n    final Animation curve =\n        CurvedAnimation(parent: _controller, curve: ShakeCurve());\n    _animation = Tween(begin: 0.0, end: 25.0).animate(curve)\n      ..addStatusListener((status) {\n        if (status == AnimationStatus.completed) {\n          if (widget.type == PinOverlayType.ENTER_PIN) {\n            sl.get<SharedPrefsUtil>().incrementLockAttempts().then((_) {\n              _failedAttempts++;\n              if (_failedAttempts >= MAX_ATTEMPTS) {\n                setState(() {\n                  _controller.value = 0;\n                });\n                sl.get<SharedPrefsUtil>().updateLockDate().then((_) {\n                  Navigator.of(context).pushNamedAndRemoveUntil(\n                      '/lock_screen', (Route<dynamic> route) => false);\n                });\n              } else {\n                setState(() {\n                  _pin = \"\";\n                  _header = AppLocalization.of(context).invalidPINParagraph;\n                  _dotStates = List.filled(PIN_LENGTH, FontAwesomeIcons.circle);\n                  _controller.value = 0;\n                });\n              }\n            });\n          } else {\n            setState(() {\n              _awaitingConfirmation = false;\n              _dotStates = List.filled(PIN_LENGTH, FontAwesomeIcons.circle);\n              _pin = \"\";\n              _pinConfirmed = \"\";\n              _header = AppLocalization.of(context).noMatchPINParagraph;\n              _controller.value = 0;\n            });\n          }\n        }\n      })\n      ..addListener(() {\n        setState(() {\n          // the animation object’s value is the changed state\n        });\n      });\n  }\n\n  /// Set next character in the pin set\n  /// return true if all characters entered\n  bool _setCharacter(String character) {\n    if (_awaitingConfirmation) {\n      setState(() {\n        _pinConfirmed = _pinConfirmed + character;\n      });\n    } else {\n      setState(() {\n        _pin = _pin + character;\n      });\n    }\n    for (int i = 0; i < _dotStates.length; i++) {\n      if (_dotStates[i] == FontAwesomeIcons.circle) {\n        setState(() {\n          _dotStates[i] = FontAwesomeIcons.solidCircle;\n        });\n        break;\n      }\n    }\n    if (_dotStates.last == FontAwesomeIcons.solidCircle) {\n      return true;\n    }\n    return false;\n  }\n\n  void _backSpace() {\n    if (_dotStates[0] != FontAwesomeIcons.circle) {\n      int lastFilledIndex;\n      for (int i = 0; i < _dotStates.length; i++) {\n        if (_dotStates[i] == FontAwesomeIcons.solidCircle) {\n          if (i == _dotStates.length ||\n              _dotStates[i + 1] == FontAwesomeIcons.circle) {\n            lastFilledIndex = i;\n            break;\n          }\n        }\n      }\n      setState(() {\n        _dotStates[lastFilledIndex] = FontAwesomeIcons.circle;\n        if (_awaitingConfirmation) {\n          _pinConfirmed = _pinConfirmed.substring(0, _pinConfirmed.length - 1);\n        } else {\n          _pin = _pin.substring(0, _pin.length - 1);\n        }\n      });\n    }\n  }\n\n  Widget buildPINButton(String text) {\n    return Container(\n      width: MediaQuery.of(context).size.width / 4,\n      height: MediaQuery.of(context).size.width / 4,\n      child: text == \"\"\n          ? SizedBox()\n          : InkWell(\n              // Real tap function\n              onTapDown: (details) {\n                if (_controller.status == AnimationStatus.forward ||\n                    _controller.status == AnimationStatus.reverse) {\n                  return;\n                }\n                if (text == \"-\") {\n                  _backSpace();\n                } else {\n                  if (_setCharacter(text)) {\n                    // Mild delay so they can actually see the last dot get filled\n                    Future.delayed(Duration(milliseconds: 50), () {\n                      if (widget.type == PinOverlayType.ENTER_PIN) {\n                        // Pin is not what was expected\n                        if (_pin != widget.expectedPin) {\n                          HapticUtil.error();\n                          _controller.forward();\n                        } else {\n                          sl\n                              .get<SharedPrefsUtil>()\n                              .resetLockAttempts()\n                              .then((_) {\n                            widget.onSuccess(_pin);\n                          });\n                        }\n                      } else {\n                        if (!_awaitingConfirmation) {\n                          // Switch to confirm pin\n                          setState(() {\n                            _awaitingConfirmation = true;\n                            _dotStates = List.filled(\n                                PIN_LENGTH, FontAwesomeIcons.circle);\n                            _header =\n                                AppLocalization.of(context).confirmPINParagraph;\n                          });\n                        } else {\n                          // First and second pins match\n                          if (_pin == _pinConfirmed) {\n                            widget.onSuccess(_pin);\n                          } else {\n                            HapticUtil.error();\n                            _controller.forward();\n                          }\n                        }\n                      }\n                    });\n                  }\n                }\n              },\n              // For the splash effect\n              onTap: () {},\n              borderRadius:\n                  BorderRadius.circular(MediaQuery.of(context).size.width / 8),\n              child: Center(\n                child: text == \"-\"\n                    ? Icon(\n                        Icons.backspace,\n                        color: StateContainer.of(context).curTheme.primary,\n                      )\n                    : Text(\n                        text,\n                        style: AppStyles.pinNumberPad(context),\n                      ),\n              ),\n            ),\n    );\n  }\n\n  List<Widget> buildPINScreenDots() {\n    List<Widget> ret = List();\n    for (int i = 0; i < PIN_LENGTH; i++) {\n      ret.add(\n        Container(\n          margin: EdgeInsetsDirectional.fromSTEB(4, 0, 4, 0),\n          child: Icon(_dotStates[i],\n              size: 18,\n              color: StateContainer.of(context).curTheme.backgroundPrimary),\n        ),\n      );\n    }\n    return ret;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (pinEnterTitle.isEmpty) {\n      setState(() {\n        pinEnterTitle = AppLocalization.of(context).enterPINParagraph;\n        if (widget.type == PinOverlayType.ENTER_PIN) {\n          _header = pinEnterTitle;\n        }\n      });\n    }\n    if (pinCreateTitle.isEmpty) {\n      setState(() {\n        pinCreateTitle = AppLocalization.of(context).createPINParagraph;\n        if (widget.type == PinOverlayType.NEW_PIN) {\n          _header = pinCreateTitle;\n        }\n      });\n    }\n    // Main scaffold that holds everything\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      backgroundColor: StateContainer.of(context).curTheme.backgroundPrimary,\n      // A Stack to achive the overlap between background gradient and number pad\n      body: LayoutBuilder(\n        builder: (context, constraints) => Stack(\n          children: <Widget>[\n            // Pin Text & Dots\n            Container(\n              height: MediaQuery.of(context).size.height -\n                  (MediaQuery.of(context).size.width * 5 / 4),\n              width: double.maxFinite,\n              padding: EdgeInsetsDirectional.fromSTEB(\n                  0,\n                  MediaQuery.of(context).padding.top,\n                  0,\n                  MediaQuery.of(context).padding.top),\n              decoration: BoxDecoration(\n                  gradient:\n                      StateContainer.of(context).curTheme.gradientPrimary),\n              child: Center(\n                child: Column(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: <Widget>[\n                    // PIN header\n                    Container(\n                      margin: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),\n                      child: AutoSizeText(\n                        _header,\n                        style: AppStyles.modalHeader(context),\n                        textAlign: TextAlign.center,\n                        maxLines: 1,\n                        minFontSize: 10,\n                        stepGranularity: 0.1,\n                      ),\n                    ),\n                    // PIN description\n                    widget.description == null\n                        ? Container(\n                            margin:\n                                EdgeInsetsDirectional.fromSTEB(30, 4, 30, 0),\n                            child: AutoSizeText(\n                              widget.description,\n                              textAlign: TextAlign.center,\n                              style: AppStyles.pinDescription(context),\n                              maxLines: 2,\n                              minFontSize: 10,\n                              stepGranularity: 0.1,\n                            ),\n                          )\n                        : SizedBox(),\n                    // Dots\n                    Container(\n                      margin: EdgeInsetsDirectional.only(\n                          start: MediaQuery.of(context).size.width * 0.25 +\n                              _animation.value,\n                          end: MediaQuery.of(context).size.width * 0.25 -\n                              _animation.value,\n                          top: 16),\n                      child: Row(\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: buildPINScreenDots(),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n            // Number Pad\n            Align(\n              alignment: Alignment.bottomCenter,\n              child: Container(\n                height: MediaQuery.of(context).size.width * 5 / 4 + 16,\n                width: double.maxFinite,\n                padding: EdgeInsetsDirectional.fromSTEB(\n                    MediaQuery.of(context).size.width * 0.075,\n                    MediaQuery.of(context).size.width * 0.075,\n                    MediaQuery.of(context).size.width * 0.075,\n                    MediaQuery.of(context).padding.bottom +\n                        MediaQuery.of(context).size.width * 0.075),\n                decoration: BoxDecoration(\n                  color: StateContainer.of(context).curTheme.backgroundPrimary,\n                  borderRadius: BorderRadius.only(\n                    topLeft: Radius.circular(12),\n                    topRight: Radius.circular(12),\n                  ),\n                  boxShadow: [\n                    StateContainer.of(context).curTheme.shadowBottomBar,\n                  ],\n                ),\n                child: Material(\n                  color: Colors.transparent,\n                  child: Center(\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.spaceAround,\n                      children: <Widget>[\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceAround,\n                          children: <Widget>[\n                            buildPINButton(\"1\"),\n                            buildPINButton(\"2\"),\n                            buildPINButton(\"3\"),\n                          ],\n                        ),\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceAround,\n                          children: <Widget>[\n                            buildPINButton(\"4\"),\n                            buildPINButton(\"5\"),\n                            buildPINButton(\"6\"),\n                          ],\n                        ),\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceAround,\n                          children: <Widget>[\n                            buildPINButton(\"7\"),\n                            buildPINButton(\"8\"),\n                            buildPINButton(\"9\"),\n                          ],\n                        ),\n                        Row(\n                          mainAxisAlignment: MainAxisAlignment.spaceAround,\n                          children: <Widget>[\n                            buildPINButton(\"\"),\n                            buildPINButton(\"0\"),\n                            buildPINButton(\"-\"),\n                          ],\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/placeholder_account_card.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\n/// A widget for buttons\nclass PlaceholderAccountCard extends StatefulWidget {\n  _PlaceholderAccountCardState createState() => _PlaceholderAccountCardState();\n}\n\nclass _PlaceholderAccountCardState extends State<PlaceholderAccountCard> {\n  @override\n  Widget build(BuildContext context) {\n    // Account Card\n    return Container(\n      width: double.maxFinite,\n      margin: EdgeInsetsDirectional.fromSTEB(12, 5, 12, 5),\n      height: 70,\n      decoration: BoxDecoration(\n          color: StateContainer.of(context).curTheme.backgroundPrimary,\n          borderRadius: BorderRadius.circular(12),\n          boxShadow: [StateContainer.of(context).curTheme.shadowAccountCard]),\n      child: Stack(\n        children: <Widget>[\n          // Left gradient background\n          Container(\n            height: double.maxFinite,\n            width: MediaQuery.of(context).size.width * 0.47 - 24,\n            decoration: BoxDecoration(\n                gradient: StateContainer.of(context).curTheme.gradientPrimary,\n                borderRadius: BorderRadius.only(\n                    topLeft: Radius.circular(12),\n                    bottomLeft: Radius.circular(12))),\n          ),\n          FlatButton(\n            onPressed: () {\n              return null;\n            },\n            padding: EdgeInsets.all(0),\n            shape: RoundedRectangleBorder(\n              borderRadius: BorderRadius.all(Radius.circular(12)),\n            ),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.spaceBetween,\n              children: <Widget>[\n                // Left part of the card with account name and number\n                Container(\n                  height: double.maxFinite,\n                  width: MediaQuery.of(context).size.width * 0.47 - 24,\n                  padding: EdgeInsetsDirectional.only(start: 16, end: 16),\n                  child: Column(\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: <Widget>[\n                      Container(\n                        margin: EdgeInsetsDirectional.only(bottom: 5),\n                        decoration: BoxDecoration(\n                          color: StateContainer.of(context).curTheme.textLight.withOpacity(0.75),\n                          borderRadius: BorderRadius.circular(100),\n                        ),\n                        child: AutoSizeText(\n                          \"            \",\n                          style: AppStyles.accountCardName(context),\n                          textAlign: TextAlign.left,\n                          stepGranularity: 0.5,\n                          maxLines: 1,\n                          minFontSize: 8,\n                        ),\n                      ),\n                      Container(\n                        decoration: BoxDecoration(\n                          color: StateContainer.of(context).curTheme.textLight.withOpacity(0.75),\n                          borderRadius: BorderRadius.circular(100),\n                        ),\n                        child: AutoSizeText(\n                          \"         \",\n                          style: AppStyles.accountCardAddress(context),\n                          textAlign: TextAlign.left,\n                          stepGranularity: 0.5,\n                          maxLines: 1,\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n                // Right part of the card with balance\n                Container(\n                  height: double.maxFinite,\n                  width: MediaQuery.of(context).size.width * 0.53 - 24,\n                  padding: EdgeInsetsDirectional.only(end: 16),\n                  alignment: Alignment(1, 0),\n                  child: Container(\n                    decoration: BoxDecoration(\n                      color: StateContainer.of(context).curTheme.primary.withOpacity(0.75),\n                      borderRadius: BorderRadius.circular(100),\n                    ),\n                    child: AutoSizeText.rich(\n                      TextSpan(\n                        children: [\n                          TextSpan(\n                              text: \"              \",\n                              style: AppStyles.balanceMedium(context)),\n                        ],\n                      ),\n                      textAlign: TextAlign.end,\n                      maxLines: 1,\n                      minFontSize: 4,\n                      stepGranularity: 1,\n                      style: TextStyle(\n                        fontSize: 18,\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/placeholder_operation_list_item.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\nenum PlaceholderOperationType {\n  Received,\n  Sent,\n  NameChanged,\n  ListedForSale,\n  Welcome\n}\n\n/// A widget for displaying a mnemonic phrase\nclass PlaceholderOperationListItem extends StatefulWidget {\n  final PlaceholderOperationType type;\n\n  PlaceholderOperationListItem({\n    this.type,\n  });\n\n  _PlaceholderOperationListItemState createState() =>\n      _PlaceholderOperationListItemState();\n}\n\nclass _PlaceholderOperationListItemState\n    extends State<PlaceholderOperationListItem> {\n  @override\n  Widget build(BuildContext context) {\n    return Column(children: <Widget>[\n      Container(\n        width: double.maxFinite,\n        height: widget.type == PlaceholderOperationType.Welcome ? null : 74,\n        child: FlatButton(\n          padding: EdgeInsetsDirectional.only(start: 24, end: 24),\n          onPressed: () {\n            return null;\n          },\n          splashColor: StateContainer.of(context).curTheme.primary30,\n          highlightColor: StateContainer.of(context).curTheme.primary15,\n          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)),\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: <Widget>[\n              Column(\n                mainAxisAlignment: MainAxisAlignment.center,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: <Widget>[\n                  // Operation Type\n                  Container(\n                    padding: EdgeInsetsDirectional.fromSTEB(8, 4, 8, 4),\n                    decoration: BoxDecoration(\n                        borderRadius: BorderRadius.circular(100),\n                        color: widget.type == PlaceholderOperationType.Received\n                            ? StateContainer.of(context)\n                                .curTheme\n                                .primary\n                                .withOpacity(0.75)\n                            : widget.type == PlaceholderOperationType.Sent\n                                ? StateContainer.of(context)\n                                    .curTheme\n                                    .textDark\n                                    .withOpacity(0.75)\n                                : StateContainer.of(context)\n                                    .curTheme\n                                    .secondary\n                                    .withOpacity(0.75)),\n                    child: AutoSizeText(\n                      widget.type == PlaceholderOperationType.Received\n                          ? \"              \"\n                          : widget.type == PlaceholderOperationType.Sent\n                              ? \"       \"\n                              : widget.type ==\n                                      PlaceholderOperationType.NameChanged\n                                  ? \"                  \"\n                                  : widget.type ==\n                                          PlaceholderOperationType.ListedForSale\n                                      ? \"                      \"\n                                      : \"           \",\n                      style: AppStyles.operationType(context),\n                    ),\n                  ),\n                  // Amount & Payload indicator or New Account Name\n                  Container(\n                    width: MediaQuery.of(context).size.width / 2 - 72,\n                    margin: EdgeInsetsDirectional.only(top: 4),\n                    child: widget.type == PlaceholderOperationType.Received ||\n                            widget.type == PlaceholderOperationType.Sent ||\n                            widget.type ==\n                                PlaceholderOperationType.NameChanged ||\n                            widget.type ==\n                                PlaceholderOperationType.ListedForSale\n                        ? Align(\n                            alignment: Alignment(-1, 0),\n                            child: Container(\n                              decoration: BoxDecoration(\n                                  color: widget.type ==\n                                          PlaceholderOperationType.Received\n                                      ? StateContainer.of(context)\n                                          .curTheme\n                                          .primary\n                                          .withOpacity(0.5)\n                                      : widget.type ==\n                                              PlaceholderOperationType.Sent\n                                          ? StateContainer.of(context)\n                                              .curTheme\n                                              .textDark\n                                              .withOpacity(0.5)\n                                          : StateContainer.of(context)\n                                              .curTheme\n                                              .secondary\n                                              .withOpacity(0.5),\n                                  borderRadius: BorderRadius.circular(100)),\n                              child: AutoSizeText.rich(\n                                TextSpan(\n                                  children: [\n                                    TextSpan(\n                                        text: \"  \",\n                                        style: AppStyles\n                                            .iconFontTextDarkBalanceSmallPascal(\n                                                context)),\n                                    TextSpan(\n                                        text: \" \",\n                                        style: TextStyle(fontSize: 7)),\n                                    TextSpan(\n                                        text: \"           \",\n                                        style: widget.type ==\n                                                PlaceholderOperationType\n                                                    .Received\n                                            ? AppStyles.balanceSmall(context)\n                                            : widget.type ==\n                                                    PlaceholderOperationType\n                                                        .Sent\n                                                ? AppStyles\n                                                    .balanceSmallTextDark(\n                                                        context)\n                                                : AppStyles\n                                                    .balanceSmallSecondary(\n                                                        context)),\n                                  ],\n                                ),\n                                textAlign: TextAlign.start,\n                                maxLines: 1,\n                                minFontSize: 4,\n                                stepGranularity: 1,\n                                style: TextStyle(\n                                  fontSize: 14,\n                                ),\n                              ),\n                            ),\n                          )\n                        : SizedBox(),\n                  ),\n                ],\n              ),\n              Column(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: <Widget>[\n                  widget.type == PlaceholderOperationType.Received ||\n                          widget.type == PlaceholderOperationType.Sent\n                      ?\n                      // Address\n                      Container(\n                          width: MediaQuery.of(context).size.width / 2 - 72,\n                          alignment: Alignment(1, 0),\n                          child: Container(\n                            decoration: BoxDecoration(\n                              color: StateContainer.of(context)\n                                  .curTheme\n                                  .textDark\n                                  .withOpacity(0.25),\n                              borderRadius: BorderRadius.circular(100),\n                            ),\n                            child: AutoSizeText(\n                              \"          \",\n                              style: AppStyles.contactsItemAddress(context),\n                              maxLines: 1,\n                              stepGranularity: 0.1,\n                              textAlign: TextAlign.end,\n                            ),\n                          ))\n                      : SizedBox(),\n                  // Date\n                  Container(\n                    width: MediaQuery.of(context).size.width / 2 - 72,\n                    margin: EdgeInsetsDirectional.only(top: 4),\n                    alignment: Alignment(1, 0),\n                    child: Container(\n                      decoration: BoxDecoration(\n                        color: StateContainer.of(context)\n                            .curTheme\n                            .textDark\n                            .withOpacity(0.125),\n                        borderRadius: BorderRadius.circular(100),\n                      ),\n                      child: AutoSizeText(\n                        \"                 \",\n                        style: AppStyles.operationDate(context),\n                        maxLines: 1,\n                        stepGranularity: 0.1,\n                        textAlign: TextAlign.end,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ],\n          ),\n        ),\n      ),\n      Container(\n        width: double.maxFinite,\n        height: 1,\n        color: StateContainer.of(context).curTheme.textDark10,\n      )\n    ]);\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/reactive_refresh.dart",
    "content": "// Copyright 2016 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:math' as math;\n\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\n\n// The over-scroll distance that moves the indicator to its maximum\n// displacement, as a percentage of the scrollable's container extent.\nconst double _kDragContainerExtentPercentage = 0.25;\n\n// How much the scroll's drag gesture can overshoot the RefreshIndicator's\n// displacement; max displacement = _kDragSizeFactorLimit * displacement.\nconst double _kDragSizeFactorLimit = 1.5;\n\n// When the scroll ends, the duration of the refresh indicator's animation\n// to the RefreshIndicator's displacement.\nconst Duration _kIndicatorSnapDuration = Duration(milliseconds: 150);\n\n// The duration of the ScaleTransition that starts when the refresh action\n// has completed.\nconst Duration _kIndicatorScaleDuration = Duration(milliseconds: 200);\n\n/// The signature for a function that's called when the user has dragged a\n/// [RefreshIndicator] far enough to demonstrate that they want the app to\n/// refresh. The returned [Future] must complete when the refresh operation is\n/// finished.\n///\n/// Used by [RefreshIndicator.onRefresh].\ntypedef RefreshCallback = Future<void> Function();\n\n// The state machine moves through these modes only when the scrollable\n// identified by scrollableKey has been scrolled to its min or max limit.\nenum _RefreshIndicatorMode {\n  drag,     // Pointer is down.\n  armed,    // Dragged far enough that an up event will run the onRefresh callback.\n  snap,     // Animating to the indicator's final \"displacement\".\n  refresh,  // Running the refresh callback.\n  done,     // Animating the indicator's fade-out after refreshing.\n  canceled, // Animating the indicator's fade-out after not arming.\n}\n\n/// A widget that supports the Material \"swipe to refresh\" idiom.\n///\n/// When the child's [Scrollable] descendant overscrolls, an animated circular\n/// progress indicator is faded into view. When the scroll ends, if the\n/// indicator has been dragged far enough for it to become completely opaque,\n/// the [onRefresh] callback is called. The callback is expected to update the\n/// scrollable's contents and then complete the [Future] it returns. The refresh\n/// indicator disappears after the callback's [Future] has completed.\n///\n/// If the [Scrollable] might not have enough content to overscroll, consider\n/// settings its `physics` property to [AlwaysScrollableScrollPhysics]:\n///\n/// ```dart\n/// ListView(\n///   physics: const AlwaysScrollableScrollPhysics(),\n///   children: ...\n//  )\n/// ```\n///\n/// Using [AlwaysScrollableScrollPhysics] will ensure that the scroll view is\n/// always scrollable and, therefore, can trigger the [RefreshIndicator].\n///\n/// A [RefreshIndicator] can only be used with a vertical scroll view.\n///\n/// See also:\n///\n///  * <https://material.google.com/patterns/swipe-to-refresh.html>\n///  * [RefreshIndicatorState], can be used to programmatically show the refresh indicator.\n///  * [RefreshProgressIndicator], widget used by [RefreshIndicator] to show\n///    the inner circular progress spinner during refreshes.\n///  * [CupertinoSliverRefreshControl], an iOS equivalent of the pull-to-refresh pattern.\n///    Must be used as a sliver inside a [CustomScrollView] instead of wrapping\n///    around a [ScrollView] because it's a part of the scrollable instead of\n///    being overlaid on top of it.\nclass ReactiveRefreshIndicator extends StatefulWidget {\n  /// Creates a refresh indicator.\n  ///\n  /// The [onRefresh], [child], and [notificationPredicate] arguments must be\n  /// non-null. The default\n  /// [displacement] is 40.0 logical pixels.\n  ///\n  /// The [semanticsLabel] is used to specify an accessibility label for this widget.\n  /// If it is null, it will be defaulted to [MaterialLocalizations.refreshIndicatorSemanticLabel].\n  /// An empty string may be passed to avoid having anything read by screen reading software.\n  /// The [semanticsValue] may be used to specify progress on the widget. The\n  const ReactiveRefreshIndicator({\n    Key key,\n    @required this.child,\n    this.displacement = 40.0,\n    @required this.onRefresh,\n    @required this.isRefreshing,\n    this.color,\n    this.backgroundColor,\n    this.notificationPredicate = defaultScrollNotificationPredicate,\n    this.semanticsLabel,\n    this.semanticsValue,\n  }) : assert(child != null),\n       assert(onRefresh != null),\n       assert(isRefreshing != null),\n       assert(notificationPredicate != null),\n       super(key: key);\n\n  /// The widget below this widget in the tree.\n  ///\n  /// The refresh indicator will be stacked on top of this child. The indicator\n  /// will appear when child's Scrollable descendant is over-scrolled.\n  ///\n  /// Typically a [ListView] or [CustomScrollView].\n  final Widget child;\n\n  /// The distance from the child's top or bottom edge to where the refresh\n  /// indicator will settle. During the drag that exposes the refresh indicator,\n  /// its actual displacement may significantly exceed this value.\n  final double displacement;\n\n  /// A function that's called when the user has dragged the refresh indicator\n  /// far enough to demonstrate that they want the app to refresh. The returned\n  /// [Future] must complete when the refresh operation is finished.\n  final RefreshCallback onRefresh;\n\n  /// The progress indicator's foreground color. The current theme's\n  /// [ThemeData.accentColor] by default.\n  final Color color;\n\n  /// The progress indicator's background color. The current theme's\n  /// [ThemeData.canvasColor] by default.\n  final Color backgroundColor;\n\n  /// A check that specifies whether a [ScrollNotification] should be\n  /// handled by this widget.\n  ///\n  /// By default, checks whether `notification.depth == 0`. Set it to something\n  /// else for more complicated layouts.\n  final ScrollNotificationPredicate notificationPredicate;\n\n  /// {@macro flutter.material.progressIndicator.semanticsLabel}\n  ///\n  /// This will be defaulted to [MaterialLocalizations.refreshIndicatorSemanticLabel]\n  /// if it is null.\n  final String semanticsLabel;\n\n  /// {@macro flutter.material.progressIndicator.semanticsValue}\n  final String semanticsValue;\n\n  final bool isRefreshing;\n\n  @override\n  ReactiveRefreshIndicatorState createState() => ReactiveRefreshIndicatorState();\n}\n\n/// Contains the state for a [RefreshIndicator]. This class can be used to\n/// programmatically show the refresh indicator, see the [show] method.\nclass ReactiveRefreshIndicatorState extends State<ReactiveRefreshIndicator> with TickerProviderStateMixin<ReactiveRefreshIndicator> {\n  AnimationController _positionController;\n  AnimationController _scaleController;\n  Animation<double> _positionFactor;\n  Animation<double> _scaleFactor;\n  Animation<double> _value;\n  Animation<Color> _valueColor;\n\n  _RefreshIndicatorMode _mode;\n  Future<void> _pendingRefreshFuture;\n  bool _isIndicatorAtTop;\n  double _dragOffset;\n\n  static final Animatable<double> _threeQuarterTween = Tween<double>(begin: 0.0, end: 0.75);\n  static final Animatable<double> _kDragSizeFactorLimitTween = Tween<double>(begin: 0.0, end: _kDragSizeFactorLimit);\n  static final Animatable<double> _oneToZeroTween = Tween<double>(begin: 1.0, end: 0.0);\n\n  @override\n  void initState() {\n    super.initState();\n    _positionController = AnimationController(vsync: this);\n    _positionFactor = _positionController.drive(_kDragSizeFactorLimitTween);\n    _value = _positionController.drive(_threeQuarterTween); // The \"value\" of the circular progress indicator during a drag.\n\n    _scaleController = AnimationController(vsync: this);\n    _scaleFactor = _scaleController.drive(_oneToZeroTween);\n  }\n\n  @override\n  void didChangeDependencies() {\n    final ThemeData theme = Theme.of(context);\n    _valueColor = _positionController.drive(\n      ColorTween(\n        begin: (widget.color ?? theme.accentColor).withOpacity(0.0),\n        end: (widget.color ?? theme.accentColor).withOpacity(1.0)\n      ).chain(CurveTween(\n        curve: const Interval(0.0, 1.0 / _kDragSizeFactorLimit)\n      )),\n    );\n    super.didChangeDependencies();\n  }\n\n  @override\n  void dispose() {\n    _positionController.dispose();\n    _scaleController.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(ReactiveRefreshIndicator oldWidget) {\n    if (!widget.isRefreshing && oldWidget.isRefreshing) {\n      if (_mode != null && _mode != _RefreshIndicatorMode.done) {\n        _dismiss(_RefreshIndicatorMode.done);\n      }\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  bool _handleScrollNotification(ScrollNotification notification) {\n    if (!widget.notificationPredicate(notification))\n      return false;\n    if (notification is ScrollStartNotification && notification.metrics.extentBefore == 0.0 &&\n        _mode == null && _start(notification.metrics.axisDirection)) {\n      setState(() {\n        _mode = _RefreshIndicatorMode.drag;\n      });\n      return false;\n    }\n    bool indicatorAtTopNow;\n    switch (notification.metrics.axisDirection) {\n      case AxisDirection.down:\n        indicatorAtTopNow = true;\n        break;\n      case AxisDirection.up:\n        indicatorAtTopNow = false;\n        break;\n      case AxisDirection.left:\n      case AxisDirection.right:\n        indicatorAtTopNow = null;\n        break;\n    }\n    if (indicatorAtTopNow != _isIndicatorAtTop) {\n      if (_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed)\n        _dismiss(_RefreshIndicatorMode.canceled);\n    } else if (notification is ScrollUpdateNotification) {\n      if (_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed) {\n        if (notification.metrics.extentBefore > 0.0) {\n          _dismiss(_RefreshIndicatorMode.canceled);\n        } else {\n          _dragOffset -= notification.scrollDelta;\n          _checkDragOffset(notification.metrics.viewportDimension);\n        }\n      }\n      if (_mode == _RefreshIndicatorMode.armed && notification.dragDetails == null) {\n        // On iOS start the refresh when the Scrollable bounces back from the\n        // overscroll (ScrollNotification indicating this don't have dragDetails\n        // because the scroll activity is not directly triggered by a drag).\n        _show();\n      }\n    } else if (notification is OverscrollNotification) {\n      if (_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed) {\n        _dragOffset -= notification.overscroll / 2.0;\n        _checkDragOffset(notification.metrics.viewportDimension);\n      }\n    } else if (notification is ScrollEndNotification) {\n      switch (_mode) {\n        case _RefreshIndicatorMode.drag:\n          _dismiss(_RefreshIndicatorMode.canceled);\n          break;\n        default:\n          // do nothing\n          break;\n      }\n    }\n    return false;\n  }\n\n  bool _handleGlowNotification(OverscrollIndicatorNotification notification) {\n    if (notification.depth != 0 || !notification.leading)\n      return false;\n    if (_mode == _RefreshIndicatorMode.drag) {\n      notification.disallowGlow();\n      return true;\n    }\n    return false;\n  }\n\n  bool _start(AxisDirection direction) {\n    assert(_mode == null);\n    assert(_isIndicatorAtTop == null);\n    assert(_dragOffset == null);\n    switch (direction) {\n      case AxisDirection.down:\n        _isIndicatorAtTop = true;\n        break;\n      case AxisDirection.up:\n        _isIndicatorAtTop = false;\n        break;\n      case AxisDirection.left:\n      case AxisDirection.right:\n        _isIndicatorAtTop = null;\n        // we do not support horizontal scroll views.\n        return false;\n    }\n    _dragOffset = 0.0;\n    _scaleController.value = 0.0;\n    _positionController.value = 0.0;\n    return true;\n  }\n\n  void _checkDragOffset(double containerExtent) {\n    assert(_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed);\n    double newValue = _dragOffset / (containerExtent * _kDragContainerExtentPercentage);\n    if (_mode == _RefreshIndicatorMode.armed)\n      newValue = math.max(newValue, 1.0 / _kDragSizeFactorLimit);\n    _positionController.value = newValue.clamp(0.0, 1.0); // this triggers various rebuilds\n    if (_mode == _RefreshIndicatorMode.drag && newValue >= 1.0 / _kDragSizeFactorLimit)\n      //_mode = _RefreshIndicatorMode.armed;\n      _show();\n  }\n\n  // Stop showing the refresh indicator.\n  Future<void> _dismiss(_RefreshIndicatorMode newMode) async {\n    await Future<void>.value();\n    // This can only be called from _show() when refreshing and\n    // _handleScrollNotification in response to a ScrollEndNotification or\n    // direction change.\n    assert(newMode == _RefreshIndicatorMode.canceled || newMode == _RefreshIndicatorMode.done);\n    setState(() {\n      _mode = newMode;\n    });\n    switch (_mode) {\n      case _RefreshIndicatorMode.done:\n        await _scaleController.animateTo(1.0, duration: _kIndicatorScaleDuration);\n        break;\n      case _RefreshIndicatorMode.canceled:\n        await _positionController.animateTo(0.0, duration: _kIndicatorScaleDuration);\n        break;\n      default:\n        assert(false);\n    }\n    if (mounted && _mode == newMode) {\n      _dragOffset = null;\n      _isIndicatorAtTop = null;\n      setState(() {\n        _mode = null;\n      });\n    }\n  }\n\n  void _show() {\n    assert(_mode != _RefreshIndicatorMode.refresh);\n    assert(_mode != _RefreshIndicatorMode.snap);\n\n    _mode = _RefreshIndicatorMode.snap;\n    _positionController\n      .animateTo(1.0 / _kDragSizeFactorLimit, duration: _kIndicatorSnapDuration)\n      .then<void>((void value) {\n        if (mounted && _mode == _RefreshIndicatorMode.snap) {\n          assert(widget.onRefresh != null);\n          setState(() {\n            // Show the indeterminate progress indicator.\n            _mode =  _RefreshIndicatorMode.refresh;\n          });\n\n          widget.onRefresh();\n        }\n      });\n  }\n\n  /// Show the refresh indicator and run the refresh callback as if it had\n  /// been started interactively. If this method is called while the refresh\n  /// callback is running, it quietly does nothing.\n  ///\n  /// Creating the [RefreshIndicator] with a [GlobalKey<RefreshIndicatorState>]\n  /// makes it possible to refer to the [RefreshIndicatorState].\n  ///\n  /// The future returned from this method completes when the\n  /// [RefreshIndicator.onRefresh] callback's future completes.\n  ///\n  /// If you await the future returned by this function from a [State], you\n  /// should check that the state is still [mounted] before calling [setState].\n  ///\n  /// When initiated in this manner, the refresh indicator is independent of any\n  /// actual scroll view. It defaults to showing the indicator at the top. To\n  /// show it at the bottom, set `atTop` to false.\n  Future<void> show({ bool atTop = true }) {\n    if (_mode != _RefreshIndicatorMode.refresh &&\n        _mode != _RefreshIndicatorMode.snap) {\n      if (_mode == null)\n        _start(atTop ? AxisDirection.down : AxisDirection.up);\n      _show();\n    }\n    return _pendingRefreshFuture;\n  }\n\n  void stopRefreshing() {\n    if (_mode != null && _mode != _RefreshIndicatorMode.done) {\n      _dismiss(_RefreshIndicatorMode.done);\n    }\n  }\n\n  final GlobalKey _key = GlobalKey();\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterialLocalizations(context));\n    final Widget child = NotificationListener<ScrollNotification>(\n      key: _key,\n      onNotification: _handleScrollNotification,\n      child: NotificationListener<OverscrollIndicatorNotification>(\n        onNotification: _handleGlowNotification,\n        child: widget.child,\n      ),\n    );\n    if (_mode == null) {\n      assert(_dragOffset == null);\n      assert(_isIndicatorAtTop == null);\n      return child;\n    }\n    assert(_dragOffset != null);\n    assert(_isIndicatorAtTop != null);\n\n    final bool showIndeterminateIndicator =\n      _mode == _RefreshIndicatorMode.refresh || _mode == _RefreshIndicatorMode.done;\n\n    return Stack(\n      children: <Widget>[\n        child,\n        Positioned(\n          top: _isIndicatorAtTop ? 0.0 : null,\n          bottom: !_isIndicatorAtTop ? 0.0 : null,\n          left: 0.0,\n          right: 0.0,\n          child: SizeTransition(\n            axisAlignment: _isIndicatorAtTop ? 1.0 : -1.0,\n            sizeFactor: _positionFactor, // this is what brings it down\n            child: Container(\n              padding: _isIndicatorAtTop\n                ? EdgeInsets.only(top: widget.displacement)\n                : EdgeInsets.only(bottom: widget.displacement),\n              alignment: _isIndicatorAtTop\n                ? Alignment.topCenter\n                : Alignment.bottomCenter,\n              child: ScaleTransition(\n                scale: _scaleFactor,\n                child: AnimatedBuilder(\n                  animation: _positionController,\n                  builder: (BuildContext context, Widget child) {\n                    return RefreshProgressIndicator(\n                      semanticsLabel: widget.semanticsLabel ?? MaterialLocalizations.of(context).refreshIndicatorSemanticLabel,\n                      semanticsValue: widget.semanticsValue,\n                      value: showIndeterminateIndicator ? null : _value.value,\n                      valueColor: _valueColor,\n                      backgroundColor: widget.backgroundColor,\n                    );\n                  },\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}"
  },
  {
    "path": "lib/ui/widgets/settings_list_item.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:flutter/material.dart';\n\n/// A widget for displaying a mnemonic phrase\nclass SettingsListItem extends StatefulWidget {\n  final String header;\n  final String subheader;\n  final String contactName;\n  final String contactAddress;\n  final IconData icon;\n  final Function onPressed;\n  final bool contact;\n  final bool disabled;\n\n  SettingsListItem({\n    this.header,\n    this.subheader,\n    this.icon,\n    this.contactName,\n    this.contactAddress,\n    this.onPressed,\n    this.disabled = false,\n    this.contact = false,\n  });\n\n  _SettingsListItemState createState() => _SettingsListItemState();\n}\n\nclass _SettingsListItemState extends State<SettingsListItem> {\n  @override\n  Widget build(BuildContext context) {\n    return  Column(\n      children: <Widget>[\n        Container(\n          width: double.maxFinite,\n          height: 70,\n          child: FlatButton(\n            padding: EdgeInsetsDirectional.only(start: 24, end: 24),\n            onPressed: () {\n              if (widget.onPressed != null && !widget.disabled) {\n                widget.onPressed();\n              }\n              return;\n            },\n            splashColor: widget.disabled ? Colors.transparent : StateContainer.of(context).curTheme.primary30,\n            highlightColor: widget.disabled ? Colors.transparent : StateContainer.of(context).curTheme.primary15,\n            shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(0)),\n            child: widget.contact\n                ? Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: <Widget>[\n                      Container(\n                        width: MediaQuery.of(context).size.width / 2,\n                        child: AutoSizeText.rich(\n                          TextSpan(children: [\n                            TextSpan(\n                              text: \" \",\n                              style: AppStyles.iconFontPrimarySmall(context),\n                            ),\n                            TextSpan(\n                              text: widget.contactName,\n                              style: AppStyles.contactsItemName(context),\n                            ),\n                          ]),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                          style: TextStyle(fontSize: 14),\n                        ),\n                      ),\n                      Container(\n                        width: MediaQuery.of(context).size.width / 2 - 80,\n                        alignment: Alignment(1, 0),\n                        child: AutoSizeText(\n                          widget.contactAddress,\n                          style: AppStyles.contactsItemAddress(context),\n                          maxLines: 1,\n                          stepGranularity: 0.1,\n                        ),\n                      ),\n                    ],\n                  )\n                : Row(\n                    mainAxisAlignment: MainAxisAlignment.start,\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: <Widget>[\n                      Container(\n                        child: Icon(widget.icon,\n                            size: 24,\n                            color: widget.disabled ? StateContainer.of(context).curTheme.primary60 : StateContainer.of(context).curTheme.primary),\n                      ),\n                      Container(\n                        margin: EdgeInsetsDirectional.only(start: 16),\n                        child: Column(\n                          mainAxisAlignment: MainAxisAlignment.center,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: <Widget>[\n                            Container(\n                              width: MediaQuery.of(context).size.width - 130,\n                              child: AutoSizeText(\n                                widget.header,\n                                style: widget.disabled ? AppStyles.settingsItemHeaderDisabled(context) : AppStyles.settingsItemHeader(context),\n                                maxLines: 1,\n                                stepGranularity: 0.1,\n                              ),\n                            ),\n                            widget.subheader == null\n                                ? SizedBox()\n                                : Container(\n                                    width: MediaQuery.of(context).size.width - 130,\n                                    child: AutoSizeText(\n                                      widget.subheader,\n                                      style:\n                                          widget.disabled ? AppStyles.settingsItemSubHeaderDisabled(context) : AppStyles.settingsItemSubHeader(context),\n                                      maxLines: 1,\n                                      stepGranularity: 0.1,\n                                    ),\n                                  ),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n          ),\n        ),\n        Container(\n          width: double.maxFinite,\n          height: 1,\n          color: StateContainer.of(context)\n              .curTheme\n              .textDark10,\n        ),\n      ]\n    );\n  }\n}\n"
  },
  {
    "path": "lib/ui/widgets/sheets.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:flutter/material.dart';\n\nclass AppSheets {\n  //App Ninty Height Sheet\n  static Future<T> showBottomSheet<T>(\n      {@required BuildContext context,\n      @required Widget widget,\n      Color color,\n      Color bgColor,\n      bool noBlur = false,\n      int animationDurationMs = 250,\n      bool closeOnTap = false,\n      Function onDisposed}) {\n    if (color == null) {\n      color = StateContainer.of(context).curTheme.backgroundPrimary;\n    }\n    if (bgColor == null) {\n      bgColor = StateContainer.of(context).curTheme.overlay20;\n    }\n    var route = _AppBottomSheetModalRoute<T>(\n        builder: (BuildContext context) {\n          return widget;\n        },\n        color: color,\n        noBlur: noBlur,\n        barrierLabel:\n            MaterialLocalizations.of(context).modalBarrierDismissLabel,\n        bgColor: bgColor,\n        animationDurationMs: animationDurationMs,\n        closeOnTap: closeOnTap,\n        onDisposed: onDisposed);\n    return Navigator.push<T>(context, route);\n  }\n}\n\n/// The constraints of this sheet\nclass _AppBottomSheetLayout extends SingleChildLayoutDelegate {\n  _AppBottomSheetLayout(this.progress);\n  final double progress;\n\n  @override\n  BoxConstraints getConstraintsForChild(BoxConstraints constraints) {\n    if (constraints.maxHeight < 667)\n      return BoxConstraints(\n          minWidth: constraints.maxWidth,\n          maxWidth: constraints.maxWidth,\n          minHeight: 0.0,\n          maxHeight: constraints.maxHeight * 0.95);\n    if ((constraints.maxHeight / constraints.maxWidth > 2.1 &&\n            Platform.isAndroid) ||\n        constraints.maxHeight > 812)\n      return BoxConstraints(\n          minWidth: constraints.maxWidth,\n          maxWidth: constraints.maxWidth,\n          minHeight: 0.0,\n          maxHeight: constraints.maxHeight * 0.8);\n    else\n      return BoxConstraints(\n          minWidth: constraints.maxWidth,\n          maxWidth: constraints.maxWidth,\n          minHeight: 0.0,\n          maxHeight: constraints.maxHeight * 0.9);\n  }\n\n  @override\n  Offset getPositionForChild(Size size, Size childSize) {\n    return Offset(0.0, size.height - childSize.height * progress);\n  }\n\n  @override\n  bool shouldRelayout(_AppBottomSheetLayout oldDelegate) {\n    return progress != oldDelegate.progress;\n  }\n}\n\nclass _AppBottomSheetModalRoute<T> extends PopupRoute<T> {\n  _AppBottomSheetModalRoute(\n      {this.builder,\n      this.barrierLabel,\n      this.color,\n      RouteSettings settings,\n      this.bgColor,\n      this.animationDurationMs,\n      this.closeOnTap,\n      this.noBlur,\n      this.onDisposed})\n      : super(settings: settings);\n\n  final WidgetBuilder builder;\n  final Color color;\n  final bool noBlur;\n  final Color bgColor;\n  final int animationDurationMs;\n  final bool closeOnTap;\n  final Function onDisposed;\n\n  @override\n  Color get barrierColor => bgColor;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String barrierLabel;\n\n  @override\n  void didComplete(T result) {\n    if (onDisposed != null) {\n      onDisposed();\n    }\n    super.didComplete(result);\n  }\n\n  AnimationController _animationController;\n  CurvedAnimation appSheetAnimation;\n\n  @override\n  AnimationController createAnimationController() {\n    assert(_animationController == null);\n    _animationController =\n        BottomSheet.createAnimationController(navigator.overlay);\n    _animationController.duration = Duration(milliseconds: animationDurationMs);\n    this.appSheetAnimation = CurvedAnimation(\n      parent: _animationController,\n      curve: Curves.easeOut,\n      reverseCurve: Curves.linear)\n      ..addStatusListener((animationStatus) {\n        if (animationStatus == AnimationStatus.completed) {\n          appSheetAnimation.curve = Curves.linear;\n        }\n      });\n    return _animationController;\n  }\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    return MediaQuery.removePadding(\n      context: context,\n      removeTop: true,\n      child: GestureDetector(\n        onTap: () {\n          if (closeOnTap) {\n            // Close when tapped anywhere\n            Navigator.of(context).pop();\n          }\n        },\n        child: BackdropFilter(\n          filter: ImageFilter.blur(sigmaX: noBlur?0:5, sigmaY: noBlur?0:5),\n          child: Theme(\n            data: Theme.of(context).copyWith(canvasColor: Colors.transparent),\n                      child: AnimatedBuilder(\n              animation: appSheetAnimation,\n              builder: (context, child) => CustomSingleChildLayout(\n                    delegate: _AppBottomSheetLayout(appSheetAnimation.value),\n                    child: BottomSheet(\n                      animationController: _animationController,\n                      onClosing: () => Navigator.of(context).pop(),\n                      builder: (context) => Container(\n                            decoration: BoxDecoration(\n                              color: this.color,\n                              borderRadius: BorderRadius.only(\n                              topLeft: Radius.circular(12),\n                              topRight: Radius.circular(12),\n                            ),\n                            ),\n\n                            child: Builder(builder: this.builder),\n                          ),\n                    ),\n                  ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  bool get maintainState => false;\n\n  @override\n  bool get opaque => false;\n\n  @override\n  Duration get transitionDuration =>\n      Duration(milliseconds: animationDurationMs);\n}\n"
  },
  {
    "path": "lib/ui/widgets/svg_repaint.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\n\nclass SvgRepaintAsset extends StatelessWidget {\n  String asset;\n  double width;\n  double height;\n\n  SvgRepaintAsset({this.asset, this.width, this.height});\n\n  @override\n  Widget build(BuildContext context) {\n    return RepaintBoundary(\n      child: SvgPicture.asset(asset, width: width, height: height,)\n    );\n  }\n}"
  },
  {
    "path": "lib/ui/widgets/tap_outside_unfocus.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// Simple wrapper that will clear focus when a tap is detected outside its boundaries\nclass TapOutsideUnfocus extends StatelessWidget {\n  final Widget child;\n\n  TapOutsideUnfocus({@required this.child});\n\n  @override\n  Widget build(BuildContext context) {\n    return \n      GestureDetector(\n        onTap: () {\n          // Clear focus of our fields when tapped in this empty space\n          FocusScope.of(context).unfocus();\n        },\n        child: this.child\n      );\n}\n}"
  },
  {
    "path": "lib/ui/widgets/webview.dart",
    "content": "import 'dart:io';\n\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_webview_plugin/flutter_webview_plugin.dart';\n\nclass AppWebView {\n  static void showWebView(BuildContext context, String url) {\n    UIUtil.cancelLockEvent();\n    Navigator.push(\n        context,\n        MaterialPageRoute<void>(\n            builder: (BuildContext context) => WebviewScaffold(\n                resizeToAvoidBottomInset: Platform.isAndroid,\n                url: url,\n                appBar: AppBar(\n                    backgroundColor:\n                        StateContainer.of(context).curTheme.primary,\n                    brightness: StateContainer.of(context).curTheme.brightness,\n                    iconTheme: IconThemeData(\n                        color:\n                            StateContainer.of(context).curTheme.textLight)))));\n  }\n}\n"
  },
  {
    "path": "lib/util/authentication.dart",
    "content": "import 'dart:io';\nimport 'package:blaise_wallet_flutter/model/authentication_method.dart';\nimport 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:local_auth/local_auth.dart';\n\nclass AuthUtil {\n  ///\n  /// hasBiometrics()\n  /// \n  /// @returns [true] if device has fingerprint/faceID available and registered, [false] otherwise\n  Future<bool> hasBiometrics() async {\n    LocalAuthentication localAuth = new LocalAuthentication();\n    bool canCheck = await localAuth.canCheckBiometrics;\n    if (canCheck) {\n      List<BiometricType> availableBiometrics = await localAuth.getAvailableBiometrics();\n      if (availableBiometrics.contains(BiometricType.face)) {\n        return true;\n      } else if (availableBiometrics.contains(BiometricType.fingerprint)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  ///\n  /// authenticateWithBiometrics()\n  /// \n  /// @param [message] Message shown to user in FaceID/TouchID popup\n  /// @returns [true] if successfully authenticated, [false] otherwise\n  Future<bool> authenticateWithBiometrics(String message) async {\n    bool hasBiometricsEnrolled = await hasBiometrics();\n    if (hasBiometricsEnrolled) {\n      LocalAuthentication localAuth = new LocalAuthentication();\n      return await localAuth.authenticateWithBiometrics(\n        localizedReason: message,\n        useErrorDialogs: false\n      );\n    }\n    return false;\n  }\n\n  Future<bool> useBiometrics() async {\n    return await hasBiometrics() && (await sl.get<SharedPrefsUtil>().getAuthMethod()).method == AuthMethod.BIOMETRICS;\n  }\n}"
  },
  {
    "path": "lib/util/haptic_util.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/services.dart';\n\nimport 'package:vibrate/vibrate.dart';\nimport 'package:device_info/device_info.dart';\n\n/// Utilities for haptic feedback\nclass HapticUtil {\n  /// Return true if this device supports taptic engine (iPhone 7+)\n  static Future<bool> hasTapicEngine() async {\n    if (!Platform.isIOS) {\n      return false;\n    }\n    IosDeviceInfo deviceInfo = await DeviceInfoPlugin().iosInfo;\n    String deviceIdentifier = deviceInfo.utsname.machine;\n    switch (deviceIdentifier) {\n      case 'iPhone5,1': // iPhone 5\n      case 'iPhone5,2': // iPhone 5\n      case 'iPhone5,3': // iPhone 5C\n      case 'iPhone5,4': // iPhone 5C\n      case 'iPhone6,1': // iPhone 5S\n      case 'iPhone6,2': // iPhone 5S\n      case 'iPhone7,2': // iPhone 6\n      case 'iPhone7,1': // iPhone 6 plus\n      case 'iPhone8,1': // iPhone 6s\n      case 'iPhone8,2': // iPhone 6s plus\n        return false;\n      default:\n        return true;\n    }\n  }\n\n  /// Feedback for error\n  static Future<void> error() async {\n    if (Platform.isIOS) {\n      // If this is simulator or this device doesnt have tapic then we can't use this\n      if (await hasTapicEngine() && await Vibrate.canVibrate) {\n        Vibrate.feedback(FeedbackType.error);\n      } else {\n        HapticFeedback.vibrate();\n      }\n    } else {\n      HapticFeedback.vibrate();\n    }\n  }\n\n  /// Feedback for success\n  static Future<void> success() async {\n    if (Platform.isIOS) {\n      // If this is simulator or this device doesnt have tapic then we can't use this\n      if (await hasTapicEngine() && await Vibrate.canVibrate) {\n        Vibrate.feedback(FeedbackType.medium);\n      } else {\n        HapticFeedback.mediumImpact();\n      }\n    } else {\n      HapticFeedback.mediumImpact();\n    }\n  }\n\n  /// Feedback for fingerprint success\n  /// iOS-only, since Android already gives us feedback on success\n  static Future<void> fingerprintSucess() async {\n    if (Platform.isIOS) {\n      Future.delayed(Duration(milliseconds: 50), () => success());\n    }\n  }\n}"
  },
  {
    "path": "lib/util/number_util.dart",
    "content": "import 'dart:math';\n\nimport 'package:decimal/decimal.dart';\n\nclass NumberUtil {\n  static const int maxDecimalDigits = 4;\n\n  /// Truncate a Decimal to a specific amount of digits\n  ///\n  /// @param input 1.059\n  /// @return double value 1.05\n  ///\n  static double truncateDecimal(Decimal input, {int digits = maxDecimalDigits}) {\n    return (input * Decimal.fromInt(pow(10, digits))).truncateToDouble() / pow(10, digits);\n  }\n\n  /// Sanitize a number as something that can actually\n  /// be parsed. Expects \".\" to be decimal separator\n  /// @param amount $1,512\n  /// @returns 1.512\n  static String sanitizeNumber(String input, {int maxDecimalDigits = maxDecimalDigits}) {\n    String sanitized = \"\";\n    List<String> splitStr = input.split(\".\");\n    if (splitStr.length > 1) {\n      if (splitStr[1].length > maxDecimalDigits) {\n        splitStr[1] = splitStr[1].substring(0, maxDecimalDigits);\n        input = splitStr[0] + \".\" + splitStr[1];\n      }\n    }\n    for (int i=0; i< input.length; i++) {\n      try {\n        if (input[i] == \".\") {\n          sanitized = sanitized + input[i];\n        } else {\n          int.parse(input[i]);\n          sanitized = sanitized + input[i];\n        }\n      } catch (e) { }\n    }\n    return sanitized;\n  }\n}"
  },
  {
    "path": "lib/util/pascal_util.dart",
    "content": "import 'package:pascaldart/pascaldart.dart';\n\n/// A higher-level wrapper for pascaldart functions\nclass PascalUtil {\n  /// Generates a new key pair\n  KeyPair generateKeyPair() {\n    return Keys.generate(curve: Curve.getDefaultCurve());\n  }\n\n  /// Turns a string into a pascal PublicKey object, returns null if invalid\n  PublicKey decipherPublicKey(String publicKey) {\n    try {\n      PublicKey pubKey = PublicKeyCoder().decodeFromBase58(publicKey.trim());\n      return pubKey;\n    } catch (e) {\n      try {\n        PublicKey pubKey = PublicKeyCoder().decodeFromBytes(PDUtil.hexToBytes(publicKey.trim()));\n        return pubKey;\n      } catch (e) {\n        return null;\n      }\n    }\n  }\n}"
  },
  {
    "path": "lib/util/salsa20crypt.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:pointycastle/api.dart' show ParametersWithIV, KeyParameter;\nimport 'package:pointycastle/stream/salsa20.dart';\n\n/**\n * Encryption using Salsa20 from pointycastle\n */\nclass Salsa20Crypt {\n  final String key;\n  final String iv;\n  final ParametersWithIV<KeyParameter> _params;\n  final Salsa20Engine _cipher = Salsa20Engine();\n\n  Salsa20Crypt(this.key, this.iv)\n      : _params = ParametersWithIV<KeyParameter>(\n            KeyParameter(Uint8List.fromList(key.codeUnits)),\n            Uint8List.fromList(iv.codeUnits));\n\n  String encrypt(String plainText) {\n    _cipher\n      ..reset()\n      ..init(true, _params);\n\n    final input = Uint8List.fromList(plainText.codeUnits);\n    final output = _cipher.process(input);\n\n    return PDUtil.byteToHex(output);\n  }\n\n  String decrypt(String cipherText) {\n    _cipher\n      ..reset()\n      ..init(false, _params);\n\n    final input = PDUtil.hexToBytes(cipherText);\n    final output = _cipher.process(input);\n\n    return String.fromCharCodes(output);\n  }\n}"
  },
  {
    "path": "lib/util/sharedprefs_util.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:ui';\n\nimport 'package:blaise_wallet_flutter/constants.dart';\nimport 'package:blaise_wallet_flutter/model/authentication_method.dart';\nimport 'package:blaise_wallet_flutter/model/available_currency.dart';\nimport 'package:blaise_wallet_flutter/model/available_languages.dart';\nimport 'package:blaise_wallet_flutter/model/available_themes.dart';\nimport 'package:blaise_wallet_flutter/model/lock_timeout.dart';\nimport 'package:intl/intl.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\n\n/// Singleton wrapper for shared preferences\nclass SharedPrefsUtil {\n  // Keys\n  static const String first_launch_key = 'pasc_first_launch';\n  static const String privkey_backed_up_key = 'pasc_privkey_backedup';\n  static const String rpc_url_key = 'pasc_rpc_url';\n  static const String cur_theme = 'blaise_cur_theme_key';\n  // For maximum pin attempts\n  static const String pin_attempts = 'blaise_pin_attempts';\n  static const String pin_lock_until = 'blaise_lock_duraton';\n  // Lock screen\n  static const String lock_app = 'app_lock_screen';\n  static const String app_lock_timeout = 'app_lock_timeout';\n  // Using biometrics\n  static const String auth_method = 'blaise_auth_method';\n  // Donation contact has been added\n  static const String firstcontact_added = 'blaise_first_c_added';\n  // Caching price API response\n  static const String price_api_cache = 'price_api_cache_v1';\n  // Local currency\n  static const String cur_currency = 'blaise_currency_pref';\n  // Language setting\n  static const String cur_language = 'blaise_lang_pref';\n  // UUID for our WS subscription\n  static const String app_uuid_key = 'blaise_app_uuid';\n  // Push notifications\n  static const String notification_enabled = 'blaise_notification_on';\n  // Freepasa account before confirmation\n  static const String freepasa_account_pending = 'blaise_fpasa_pending_acct';\n  // For certain keystore incompatible androids\n  static const String use_legacy_storage = 'blaise_legacy_storage';\n\n  // For plain-text data\n  Future<void> set(String key, dynamic value) async {\n    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();\n    if (value is bool) {\n      sharedPreferences.setBool(key, value);\n    } else if (value is String) {\n      sharedPreferences.setString(key, value);\n    } else if (value is double) {\n      sharedPreferences.setDouble(key, value);\n    } else if (value is int) {\n      sharedPreferences.setInt(key, value);\n    }\n  }\n\n  Future<dynamic> get(String key, {dynamic defaultValue}) async {\n    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();\n    return await sharedPreferences.get(key) ?? defaultValue;\n  }\n\n  /// Set a key with an expiry, expiry is in seconds\n  Future<void> setWithExpiry(String key, dynamic value, int expiry) async {\n    DateTime now = DateTime.now().toUtc();\n    DateTime expired = now.add(Duration(seconds: expiry));\n    Map<String, dynamic> msg = {\n      'data':value,\n      'expiry':expired.millisecondsSinceEpoch\n    };\n    String serialized = json.encode(msg);\n    await set(key, serialized);\n  }\n\n  /// Get a key that has an expiry\n  Future<dynamic> getWithExpiry(String key) async {\n    String val = await get(key, defaultValue: null);\n    if (val == null) {\n      return null;\n    }\n    Map<String, dynamic> msg = json.decode(val);\n    DateTime expired = DateTime.fromMillisecondsSinceEpoch(msg['expiry']);\n    if (DateTime.now().toUtc().difference(expired).inMinutes > 0) {\n      await remove(key);\n      return null;\n    }\n    return msg['data'];\n  }\n\n  Future<void> remove(String key) async {\n    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();\n    return await sharedPreferences.remove(key);\n  }\n\n  // Key-specific helpers\n  Future<void> setPrivateKeyBackedUp(bool value) async {\n    return await set(privkey_backed_up_key, value);\n  }\n\n  Future<bool> getPrivateKeyBackedUp() async {\n    return await get(privkey_backed_up_key, defaultValue: false);\n  }\n\n  Future<void> setFirstLaunch() async {\n    return await set(first_launch_key, false);\n  }\n\n  Future<bool> getFirstLaunch() async {\n    return await get(first_launch_key, defaultValue: true);\n  }\n\n  Future<void> setRpcUrl(String rpcUrl) async {\n    return await set(rpc_url_key, rpcUrl);\n  }\n\n  Future<void> resetRpcUrl() async {\n    return await remove(rpc_url_key);\n  }\n\n  Future<String> getRpcUrl() async {\n    return await get(rpc_url_key,\n        defaultValue: AppConstants.DEFAULT_RPC_HTTP_URL);\n  }\n\n  Future<void> setTheme(ThemeSetting theme) async {\n   return await set(cur_theme, theme.getIndex());\n  }\n\n  Future<ThemeSetting> getTheme() async {\n    return ThemeSetting(ThemeOptions.values[await get(cur_theme, defaultValue: ThemeOptions.LIGHT.index)]);\n  }\n\n  Future<void> setLock(bool value) async {\n    return await set(lock_app, value);\n  }\n\n  Future<bool> getLock() async {\n    return await get(lock_app, defaultValue: false);\n  }\n\n  Future<void> setLockTimeout(LockTimeoutSetting setting) async {\n   return await set(app_lock_timeout, setting.getIndex());\n  }\n\n  Future<LockTimeoutSetting> getLockTimeout() async {\n    return LockTimeoutSetting(LockTimeoutOption.values[await get(app_lock_timeout, defaultValue: LockTimeoutOption.ONE.index)]);\n  }\n\n  // Locking out when max pin attempts exceeded\n  Future<int> getLockAttempts() async {\n    return await get(pin_attempts, defaultValue: 0);\n  }\n\n  Future<void> incrementLockAttempts() async {\n    await set(pin_attempts, await getLockAttempts() + 1);\n  }\n\n  Future<void> resetLockAttempts() async {\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    await prefs.remove(pin_attempts);\n    await prefs.remove(pin_lock_until);\n  }\n\n  Future<bool> shouldLock() async {\n    if (await get(pin_lock_until) != null || await getLockAttempts() >= 5) {\n      return true;\n    }\n    return false;\n  }\n\n  Future<void> updateLockDate() async {\n    int attempts = await getLockAttempts();\n    if (attempts >= 20) {\n      // 4+ failed attempts\n      await set(pin_lock_until, DateFormat.yMd().add_jms().format(DateTime.now().toUtc().add(Duration(hours: 24))));\n    } else if (attempts >= 15) {\n      // 3 failed attempts\n      await set(pin_lock_until, DateFormat.yMd().add_jms().format(DateTime.now().toUtc().add(Duration(minutes: 15))));\n    } else if (attempts >= 10) {\n      // 2 failed attempts\n      await set(pin_lock_until, DateFormat.yMd().add_jms().format(DateTime.now().toUtc().add(Duration(minutes: 5))));\n    } else if (attempts >= 5) {\n      await set(pin_lock_until, DateFormat.yMd().add_jms().format(DateTime.now().toUtc().add(Duration(minutes: 1))));\n    }\n  }\n\n  Future<DateTime> getLockDate() async {\n    String lockDateStr = await get(pin_lock_until);\n    if (lockDateStr == null) {\n      return null;\n    }\n    return DateFormat.yMd().add_jms().parseUtc(lockDateStr);\n  }\n\n  Future<void> setAuthMethod(AuthenticationMethod method) async {\n   return await set(auth_method, method.getIndex());\n  }\n\n  Future<AuthenticationMethod> getAuthMethod() async {\n    return AuthenticationMethod(AuthMethod.values[await get(auth_method, defaultValue: AuthMethod.BIOMETRICS.index)]);\n  }\n\n  Future<void> setFirstContactAdded(bool value) async {\n    return await set(firstcontact_added, value);\n  }\n\n  Future<bool> getFirstContactAdded() async {\n    return await get(firstcontact_added, defaultValue: false);\n  }\n\n  Future<String> getPriceAPICache() async {\n    return await get(price_api_cache, defaultValue: null);\n  }\n\n  Future<void> setPriceAPICache(String data) async {\n    await set(price_api_cache, data);\n  }\n\n  Future<void> setCurrency(AvailableCurrency currency) async {\n   return await set(cur_currency, currency.getIndex());\n  }\n\n  Future<AvailableCurrency> getCurrency(Locale deviceLocale) async {\n    return AvailableCurrency(AvailableCurrencyEnum.values[await get(cur_currency, defaultValue: AvailableCurrency.getBestForLocale(deviceLocale).currency.index)]);\n  }\n\n  Future<void> setLanguage(LanguageSetting language) async {\n   return await set(cur_language, language.getId());\n  }\n\n  Future<LanguageSetting> getLanguage() async {\n    String langEnumStr = await get(cur_language, defaultValue: AvailableLanguage.DEFAULT.toString());\n    AvailableLanguage lang;\n    for (AvailableLanguage aLang in AvailableLanguage.values) {\n      if (aLang.toString() == langEnumStr) {\n        lang = aLang;\n        break;\n      }\n    }\n    return LanguageSetting(lang);\n  }\n\n\n  Future<void> setUuid(String uuid) async {\n    return await set(app_uuid_key, uuid);\n  }\n\n  Future<String> getUuid() async {\n    return await get(app_uuid_key);\n  }\n\n  Future<void> setNotificationsOn(bool value) async {\n    return await set(notification_enabled, value);\n  }\n\n  Future<bool> getNotificationsOn() async {\n    // Notifications off by default on iOS, \n    bool defaultValue = Platform.isIOS ? false : true;\n    return await get(notification_enabled, defaultValue: defaultValue);\n  }\n\n  /// If notifications have been set by user/app\n  Future<bool> getNotificationsSet() async {\n    return await get(notification_enabled, defaultValue: null) == null ? false : true;\n  }\n\n  Future<AccountNumber> getFreepasaAccount() async {\n    int acct = await getWithExpiry(freepasa_account_pending);\n    return acct == null ? null : AccountNumber.fromInt(acct);\n  }\n\n  Future<void> setFreepasaAccount(AccountNumber account) async {\n    await setWithExpiry(freepasa_account_pending, account.account, 2000);\n  }\n\n  Future<bool> useLegacyStorage() async {\n    return await get(use_legacy_storage, defaultValue: false);\n  }\n\n  Future<void> setUseLegacyStorage() async {\n    await set(use_legacy_storage, true);\n  }\n\n  // For logging out\n  Future<void> deleteAll({bool firstLaunch = false}) async {\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    if (firstLaunch) {\n      await prefs.clear();\n    } else {\n      await prefs.remove(privkey_backed_up_key);\n      await prefs.remove(rpc_url_key);\n      await prefs.remove(pin_attempts);\n      await prefs.remove(pin_lock_until);\n      await prefs.remove(auth_method);\n      await prefs.remove(app_lock_timeout);\n      await prefs.remove(lock_app);\n      await prefs.remove(cur_currency);\n      await prefs.remove(app_uuid_key);\n      await prefs.remove(use_legacy_storage);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/util/ui_util.dart",
    "content": "import 'dart:async';\n\nimport 'package:blaise_wallet_flutter/appstate_container.dart';\nimport 'package:blaise_wallet_flutter/bus/events.dart';\nimport 'package:blaise_wallet_flutter/localization.dart';\nimport 'package:blaise_wallet_flutter/ui/util/text_styles.dart';\nimport 'package:blaise_wallet_flutter/ui/widgets/overlay_dialog.dart';\nimport 'package:event_taxi/event_taxi.dart';\nimport 'package:intl/intl.dart';\nimport 'package:oktoast/oktoast.dart';\nimport 'package:flutter/material.dart';\n\nclass UIUtil {\n  static bool smallScreen(BuildContext context) {\n    if (MediaQuery.of(context).size.height < 667)\n      return true;\n    else\n      return false;\n  }\n\n  static void showSnackbar(String content, BuildContext context) {\n    showToastWidget(\n      Align(\n        alignment: Alignment.topCenter,\n        child: Container(\n          margin: EdgeInsets.symmetric(\n              vertical: MediaQuery.of(context).size.height * 0.05,\n              horizontal: 14),\n          padding: EdgeInsets.symmetric(vertical: 18, horizontal: 16),\n          width: MediaQuery.of(context).size.width - 30,\n          decoration: BoxDecoration(\n            color: StateContainer.of(context).curTheme.backgroundPrimary,\n            borderRadius: BorderRadius.circular(10),\n            boxShadow: [\n              BoxShadow(\n                  color: StateContainer.of(context).curTheme.overlay20,\n                  offset: Offset(0, 20),\n                  blurRadius: 40,\n                  spreadRadius: -5),\n            ],\n          ),\n          child: Text(\n            content,\n            style: AppStyles.snackBar(context),\n            textAlign: TextAlign.start,\n          ),\n        ),\n      ),\n      dismissOtherToast: true,\n      duration: Duration(milliseconds: 2000),\n    );\n  }\n\n  static String formatDateStr(DateTime dt) {\n    int currentYear = DateTime.now().toLocal().year;\n    DateTime localTime = dt.toLocal();\n    DateFormat df;\n    if (localTime.year != currentYear) {\n      df = DateFormat(\"MMM dd, yyyy • HH:mm\");\n    } else {\n      df = DateFormat(\"MMM dd • HH:mm\");\n    }\n    return df.format(localTime);\n  }\n\n  static String formatDateStrLong(DateTime dt) {\n    //\"Jul 08, 2019 • 13:24:01 (1562592241)\"\n    int secondsSinceEpoch = dt.millisecondsSinceEpoch ~/ 1000;\n    DateTime localTime = dt.toLocal();\n    DateFormat df;\n    df = DateFormat(\"MMM dd, yyyy • HH:mm:ss\");\n    return df.format(localTime) + \"\\n($secondsSinceEpoch)\";\n  }\n\n  /// Show a dialog asking if they want to confirm a fee\n  static void showFeeDialog(\n      {@required BuildContext context, @required Function onConfirm}) {\n    showAppDialog(\n        context: context,\n        builder: (_) => DialogOverlay(\n            title: AppLocalization.of(context).addFeeHeader,\n            feeDialog: true,\n            confirmButtonText:\n                toUppercase(AppLocalization.of(context).confirmButton, context),\n            body: TextSpan(\n              children: [\n                TextSpan(\n                  text: AppLocalization.of(context).feeRequiredParagraph + \"\\n\",\n                  style: AppStyles.paragraph(context),\n                ),\n                TextSpan(\n                  text: AppLocalization.of(context)\n                      .feeConfirmAmountParagraph\n                      .replaceAll(\"%1\", \"0.0001\"),\n                  style: AppStyles.paragraphPrimary(context),\n                ),\n              ],\n            ),\n            onConfirm: () {\n              onConfirm();\n            }));\n  }\n\n  static StreamSubscription<dynamic> _lockDisableSub;\n  static Future<void> cancelLockEvent() async {\n    // Cancel auto-lock event, usually if we are launching another intent\n    if (_lockDisableSub != null) {\n      _lockDisableSub.cancel();\n    }\n    EventTaxiImpl.singleton().fire(DisableLockTimeoutEvent(disable: true));\n    Future<dynamic> delayed = Future.delayed(Duration(seconds: 10));\n    delayed.then((_) {\n      return true;\n    });\n    _lockDisableSub = delayed.asStream().listen((_) {\n      EventTaxiImpl.singleton().fire(DisableLockTimeoutEvent(disable: false));\n    });\n  }\n}\n\nList<TextSpan> formatLocalizedColors(BuildContext context, String input) {\n  List<TextSpan> ret = [];\n  if (!input.contains('<colored>') && !input.contains('</colored>')) {\n    ret.add(TextSpan(text: input, style: AppStyles.paragraph(context)));\n    return ret;\n  }\n  int i = 0;\n  int iEnd = 0;\n  while (input.contains('<colored>') && input.contains('</colored>')) {\n    i = input.indexOf('<colored>');\n    iEnd = input.indexOf('</colored>');\n    ret.add(TextSpan(\n        text: input.substring(0, i), style: AppStyles.paragraph(context)));\n    ret.add(TextSpan(\n        text: input.substring(i + 9, iEnd),\n        style: AppStyles.paragraphPrimary(context)));\n    input = input.substring(iEnd + 10);\n  }\n  if (input.length > 0) {\n    ret.add(TextSpan(text: input, style: AppStyles.paragraph(context)));\n  }\n  return ret;\n}\n\nList<TextSpan> formatLocalizedColorsDanger(BuildContext context, String input) {\n  List<TextSpan> ret = [];\n  if (!input.contains('<colored>') && !input.contains('</colored>')) {\n    ret.add(TextSpan(text: input, style: AppStyles.paragraph(context)));\n    return ret;\n  }\n  int i = 0;\n  int iEnd = 0;\n  while (input.contains('<colored>') && input.contains('</colored>')) {\n    i = input.indexOf('<colored>');\n    iEnd = input.indexOf('</colored>');\n    ret.add(TextSpan(\n        text: input.substring(0, i), style: AppStyles.paragraph(context)));\n    ret.add(TextSpan(\n        text: input.substring(i + 9, iEnd),\n        style: AppStyles.paragraphDanger(context)));\n    input = input.substring(iEnd + 10);\n  }\n  if (input.length > 0) {\n    ret.add(TextSpan(text: input, style: AppStyles.paragraph(context)));\n  }\n  return ret;\n}\n\nString toUppercase(String input, BuildContext context) {\n    Locale locale = Locale(StateContainer.of(context).curLanguage.getLocaleString());\n    if (locale != null && locale.languageCode == 'tr') {\n      input = input.replaceAll(\"i\", \"İ\");\n    } else if (locale != null && locale.languageCode == 'de') {\n      input = input.replaceAll(\"ß\", \"SS\");\n    }\n    return input.toUpperCase();\n}"
  },
  {
    "path": "lib/util/user_data_util.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'package:blaise_wallet_flutter/util/ui_util.dart';\nimport 'package:flutter/services.dart';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:quiver/strings.dart';\nimport 'package:validators/validators.dart';\nimport 'package:barcode_scan/barcode_scan.dart';\n\nenum DataType { RAW, ACCOUNT, URL, PUBLIC_KEY }\n\nclass UserDataUtil {\n  static const MethodChannel _channel = const MethodChannel('fappchannel');\n  static StreamSubscription<dynamic> setStream;\n\n  static String _parseData(String data, DataType type) {\n    data = data.trim();\n    if (type == DataType.RAW) {\n      return data;\n    } else if (type == DataType.ACCOUNT) {\n      try {\n        AccountNumber acctNum = AccountNumber(data);\n        return acctNum.toString();\n      } catch (e) {}\n    } else if (type == DataType.URL) {\n      if (isIP(data)) {\n        return data;\n      } else if (isURL(data)) {\n        return data;\n      }\n    } else if (type == DataType.PUBLIC_KEY) {\n      try {\n        PublicKeyCoder()\n            .decodeFromBase58(data);\n        return data;\n      } catch (e) {\n        try {\n          PublicKeyCoder()\n              .decodeFromBytes(\n                  PDUtil.hexToBytes(\n                      data));\n          return data;\n        } catch (e) {}\n      }\n    }\n    return null;\n  }\n\n  static Future<String> getClipboardText(DataType type) async {\n    ClipboardData data = await Clipboard.getData(\"text/plain\");\n    if (data == null || data.text == null) {\n      return null;\n    }\n    return _parseData(data.text, type);\n  }\n\n  static Future<String> getQRData(DataType type, OverlayTheme theme) async {\n    UIUtil.cancelLockEvent();\n    try {\n      String data = await BarcodeScanner.scan(theme);\n      if (isEmpty(data)) {\n        return null;\n      }\n      return _parseData(data, type);\n    } catch (e) {\n      return null;\n    }\n  }\n\n  static Future<void> setSecureClipboardItem(String value) async {\n    if (Platform.isIOS) {\n      final Map<String, dynamic> params = <String, dynamic>{\n        'value': value,\n      };\n      await _channel.invokeMethod(\"setSecureClipboardItem\", params);\n    } else {\n      // Set item in clipboard\n      await Clipboard.setData(new ClipboardData(text: value));\n      // Auto clear it after 2 minutes\n      if (setStream != null) {\n        setStream.cancel();\n      }\n      Future<dynamic> delayed = new Future.delayed(new Duration(minutes: 2));\n      delayed.then((_) {\n        return true;\n      });\n      setStream = delayed.asStream().listen((_) {\n        Clipboard.getData(\"text/plain\").then((data) {\n          if (data != null && data.text != null) {\n            if (privateKeyIsValid(data.text) || privateKeyIsEncrypted(data.text)) {\n              Clipboard.setData(ClipboardData(text: \"\"));\n            }\n          }\n        });\n      });\n    }\n  }\n\n  static bool privateKeyIsValid(String pkText) {\n    try {\n      PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(pkText));\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  static bool privateKeyIsEncrypted(String pkText, {bool lengthCheck = true}) {\n    int minLength = lengthCheck ? 100 : 8;\n    if (pkText == null || pkText.length < minLength) {\n      return false;\n    }\n    try {\n      String salted =\n          PDUtil.bytesToUtf8String(PDUtil.hexToBytes(pkText.substring(0, 16)));\n      if (salted == \"Salted__\") {\n        return true;\n      }\n      return false;\n    } catch (e) {\n      return false;\n    }\n  }\n}"
  },
  {
    "path": "lib/util/vault.dart",
    "content": "import 'package:blaise_wallet_flutter/service_locator.dart';\nimport 'package:blaise_wallet_flutter/util/salsa20crypt.dart';\nimport 'package:blaise_wallet_flutter/util/sharedprefs_util.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_secure_storage/flutter_secure_storage.dart';\nimport 'package:pascaldart/common.dart';\nimport 'package:shared_preferences/shared_preferences.dart';\n\n/// Secure store implementation that stores sensitive data\nclass Vault {\n  static const String PRIVATEKEY_KEY = 'pascal_privatekey';\n  static const String PIN_KEY = 'blaise_pin';\n\n  FlutterSecureStorage _secureStorage;\n  PrivateKeyCoder _privateKeyCoder;\n\n  Future<bool> legacy() async {\n    return await sl.get<SharedPrefsUtil>().useLegacyStorage();\n  }\n\n  Vault() {\n    this._secureStorage = FlutterSecureStorage();\n    this._privateKeyCoder = PrivateKeyCoder();\n  }\n\n  // Generic write/read\n  Future<String> _write(String key, String value) async {\n    if (await legacy()) {\n      await setEncrypted(key, value);\n    } else {\n      await _secureStorage.write(key:key, value:value);\n    }\n    return value;\n  }\n\n  Future<String> _read(String key, {String defaultValue}) async {\n    if (await legacy()) {\n      return await getEncrypted(key);\n    }\n    return await _secureStorage.read(key:key) ?? defaultValue;\n  }\n\n  // Private key\n  Future<String> getPrivateKey() async {\n    return await _read(PRIVATEKEY_KEY);\n  }\n\n  Future<String> setPrivateKey(PrivateKey privateKey) async {\n    return await _write(PRIVATEKEY_KEY,  _privateKeyCoder.encodeToHex(privateKey));\n  }\n\n  // Pin\n  Future<String> getPin() async {\n    return await _read(PIN_KEY);\n  }\n\n  Future<String> setPin(String pin) async {\n    return await _write(PIN_KEY, pin);\n  }\n\n  Future<void> deleteAll() async {\n    if (await legacy()) {\n      SharedPreferences prefs = await SharedPreferences.getInstance();\n      await prefs.remove(PIN_KEY);\n      await prefs.remove(PRIVATEKEY_KEY);\n      return;\n    }\n    await _secureStorage.deleteAll();\n  }\n\n  // For encrypted data\n  Future<void> setEncrypted(String key, String value) async {\n    String secret = await getSecret();\n    if (secret == null) return null;\n    // Decrypt and return\n    Salsa20Crypt encrypter = Salsa20Crypt(secret.substring(0, secret.length - 8), secret.substring(secret.length - 8));\n    // Encrypt and save\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    prefs.setString(key, encrypter.encrypt(value));\n  }\n\n  Future<String> getEncrypted(String key) async {\n    String secret = await getSecret();\n    if (secret == null) return null;\n    // Decrypt and return\n    Salsa20Crypt encrypter = Salsa20Crypt(secret.substring(0, secret.length - 8), secret.substring(secret.length - 8));\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    String encrypted = prefs.get(key);\n    if (encrypted == null) return null;\n    return encrypter.decrypt(encrypted);\n  }\n\n  static const _channel = const MethodChannel('fappchannel');\n\n  static Future<String> getSecret() async {\n    return await _channel.invokeMethod('getSecret');\n  }\n}"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: blaise_wallet_flutter\ndescription: A new Flutter project.\n\nversion: 1.1.3+24\n\nenvironment:\n  sdk: \">=2.11.99 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n\n  # PascalCoin signing/rpc/etc.\n  pascaldart: ^2.0.0\n\n  # Localization\n  intl: ^0.17.0\n\n  # AutoSizeText widget\n  auto_size_text: ^2.1.0\n\n  # Flare for animations\n  flare_flutter: ^2.0.6\n\n  # SVG\n  flutter_svg: ^0.22.0\n\n  # Font awesome\n  font_awesome_flutter: ^8.8.1\n\n  # Share files\n  share:\n    git:\n      url: https://github.com/bbedward/plugins.git\n      path: packages/share\n      ref: master\n  \n  # Slidable\n  flutter_slidable: ^0.5.7\n\n  # QR Code Generator\n  qr_flutter: ^3.0.1\n\n  # Banner style alerts\n  oktoast: ^3.0.0\n\n  # Service locator\n  get_it: ^6.0.0\n\n  # To avoid keyboard overlap\n  keyboard_avoider: ^0.1.2\n\n  # KeyStore/keychain\n  flutter_secure_storage: ^5.0.2\n\n  # shared prefs\n  shared_preferences: ^2.0.8\n\n  # Biometrics\n  local_auth: ^1.0.0-nullsafety.3\n\n  # mobx for state\n  mobx: ^2.0.0-nullsafety.3\n  flutter_mobx: ^2.0.0-nullsafety.0\n\n  # Nicer logging\n  logger: ^1.0.0\n\n  # quiver - various Dart utilities\n  quiver: ^3.0.1+1\n\n  # big decimal\n  decimal: ^1.3.0\n\n  # Event Bus\n  event_taxi: ^1.0.0\n\n  # Vibrate\n  vibrate:\n    git:\n      url: https://github.com/bbedward/flutter_vibrate.git\n      ref: master\n\n  # Device-specific info\n  device_info: ^2.0.3\n\n  # App build info\n  package_info: ^2.0.2\n\n  # Serialization\n  json_annotation: ^4.3.0\n\n  # SQLite\n  sqflite: ^2.0.0+4\n\n  # OS Path Info\n  path_provider: ^2.0.1\n\n  # Native file chooser\n  file_picker: ^3.0.0-nullsafety.0\n\n  # Various string validations\n  validators: 2.0.0\n\n  # Webview\n  flutter_webview_plugin: ^0.4.0\n\n  # QR scanning\n  barcode_scan:\n    git:\n      url: https://github.com/bbedward/flutter_barcode_reader.git\n      ref: master\n\n  # Push notifications\n  firebase_messaging: ^11.1.0\n  firebase_core: ^1.10.0\n\ndependency_overrides:\n  analyzer: ^2.7.0\n  dart_style: ^2.0.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  build_runner: ^2.1.5\n  mobx_codegen: ^2.0.0-nullsafety.1\n  json_serializable: ^6.0.1\n  intl_translation:\n    git:\n      url: https://github.com/bbedward/intl_translation.git\n      ref: master\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n  fonts:\n    - family: Metropolis\n      fonts:\n        - asset: fonts/Metropolis-Black.ttf\n          weight: 900\n        - asset: fonts/Metropolis-ExtraBold.ttf\n          weight: 800\n        - asset: fonts/Metropolis-Bold.ttf\n          weight: 700\n        - asset: fonts/Metropolis-SemiBold.ttf\n          weight: 600\n        - asset: fonts/Metropolis-Medium.ttf\n          weight: 500\n        - asset: fonts/Metropolis-Regular.ttf\n          weight: 400\n        - asset: fonts/Metropolis-Light.ttf\n          weight: 300\n        - asset: fonts/Metropolis-ExtraLight.ttf\n          weight: 200\n        - asset: fonts/Metropolis-Thin.ttf\n          weight: 100\n    - family: RobotoRegular\n      fonts:\n        - asset: fonts/Roboto-Regular.ttf\n    - family: SourceCodePro\n      fonts:\n        - asset: fonts/SourceCodePro-Black.ttf\n          weight: 900\n        - asset: fonts/SourceCodePro-Bold.ttf\n          weight: 700\n        - asset: fonts/SourceCodePro-Semibold.ttf\n          weight: 600\n        - asset: fonts/SourceCodePro-Medium.ttf\n          weight: 500\n        - asset: fonts/SourceCodePro-Regular.ttf\n          weight: 400\n        - asset: fonts/SourceCodePro-Light.ttf\n          weight: 300\n        - asset: fonts/SourceCodePro-ExtraLight.ttf\n          weight: 200\n    - family: AppIcons\n      fonts:\n        - asset: fonts/AppIcons.ttf\n          weight: 600\n  assets:\n    - assets/animation_welcome.flr\n    - assets/animation_welcome_copper.flr\n    - assets/animation_welcome_dark.flr\n    - assets/animation_send.flr\n    - assets/animation_send_copper.flr\n    - assets/animation_send_dark.flr\n    - assets/animation_name_change.flr\n    - assets/animation_name_change_copper.flr\n    - assets/animation_name_change_dark.flr\n    - assets/animation_sale.flr\n    - assets/animation_sale_copper.flr\n    - assets/animation_sale_dark.flr\n    - assets/animation_transfer.flr\n    - assets/animation_transfer_copper.flr\n    - assets/animation_transfer_dark.flr\n    - assets/animation_get_account.flr\n    - assets/animation_get_account_copper.flr\n    - assets/animation_get_account_dark.flr\n    - assets/animation_search.flr\n    - assets/illustration_backup.svg\n    - assets/illustration_new_wallet.svg\n    - assets/illustration_two_options.svg\n    - assets/illustration_borrowed.svg\n    - assets/illustration_security.svg\n    - assets/illustration_backup_dark.svg\n    - assets/illustration_new_wallet_dark.svg\n    - assets/illustration_two_options_dark.svg\n    - assets/illustration_borrowed_dark.svg\n    - assets/illustration_security_dark.svg\n    - assets/illustration_backup_copper.svg\n    - assets/illustration_new_wallet_copper.svg\n    - assets/illustration_two_options_copper.svg\n    - assets/illustration_borrowed_copper.svg\n    - assets/illustration_security_copper.svg\n    - assets/country_phone_map.json\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\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  # example:\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/common/base58_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('Common.Base58', () {\n    List<List<String>> testData;\n\n    setUp(() {\n      testData = [\n        [\"\", \"\"],\n        [\"61\", \"2g\"],\n        [\"626262\", \"a3gV\"],\n        [\"636363\", \"aPEr\"],\n        [\n          \"73696d706c792061206c6f6e6720737472696e67\",\n          \"2cFupjhnEsSn59qHXstmK2ffpLv2\"\n        ],\n        [\n          \"00eb15231dfceb60925886b67d065299925915aeb172c06647\",\n          \"1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L\"\n        ],\n        [\"516b6fcd0f\", \"ABnLTmg\"],\n        [\"bf4f89001e670274dd\", \"3SEo3LWLoPntC\"],\n        [\"572e4794\", \"3EFU7m\"],\n        [\"ecac89cad93923c02321\", \"EJDM8drfXA6uyA\"],\n        [\"10c8511e\", \"Rt5zm\"],\n        [\"00000000000000000000\", \"1111111111\"],\n        [\n          \"000111d38e5fc9071ffcd20b4a763cc9ae4f252bb4e48fd66a835e252ada93ff480d6dd43dc62a641155a5\",\n          \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n        ],\n        [\n          \"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\",\n          \"1cWB5HCBdLjAuqGGReWE3R3CguuwSjw6RHn39s2yuDRTS5NsBgNiFpWgAnEx6VQi8csexkgYw3mdYrMHr8x9i7aEwP8kZ7vccXWqKDvGv3u1GxFKPuAkn8JCPPGDMf3vMMnbzm6Nh9zh1gcNsMvH3ZNLmP5fSG6DGbbi2tuwMWPthr4boWwCxf7ewSgNQeacyozhKDDQQ1qL5fQFUW52QKUZDZ5fw3KXNQJMcNTcaB723LchjeKun7MuGW5qyCBZYzA1KjofN1gYBV3NqyhQJ3Ns746GNuf9N2pQPmHz4xpnSrrfCvy6TVVz5d4PdrjeshsWQwpZsZGzvbdAdN8MKV5QsBDY\"\n        ]\n      ];\n    });\n\n    test('Encode Base58', () {\n      testData.forEach((v) {\n        expect(Base58.encode(PDUtil.hexToBytes(v[0])), v[1]);\n      });\n    });\n\n    test('Decode Base58', () {\n      testData.forEach((v) {\n        expect(PDUtil.byteToHex(Base58.decode(v[1])), v[0].toUpperCase());\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/accountname_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.coding.pascal.accountNameCoder', () {\n    AccountNameCoder coderBS2;\n    AccountNameCoder coderBS1;\n    setUp(() {\n      coderBS2 = AccountNameCoder();\n      coderBS1 = AccountNameCoder(byteSize: 1);\n    });\n    test('can decode a pascalcoin account name', () {\n      expect(\n          coderBS2\n              .decodeFromBytes(PDUtil.hexToBytes('040074657374'))\n              .toString(),\n          'test');\n      expect(\n          coderBS2.decodeFromBytes(PDUtil.hexToBytes('040074657374'))\n              is AccountName,\n          true);\n      expect(\n          coderBS1.decodeFromBytes(PDUtil.hexToBytes('0474657374')).toString(),\n          'test');\n      expect(\n          coderBS1.decodeFromBytes(PDUtil.hexToBytes('0474657374'))\n              is AccountName,\n          true);\n    });\n    test('can encode a pascalcoin account name', () {\n      expect(PDUtil.byteToHex(coderBS2.encodeToBytes(AccountName('test'))),\n          '040074657374');\n      expect(PDUtil.byteToHex(coderBS1.encodeToBytes(AccountName('test'))),\n          '0474657374');\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/accountnumber_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.coding.pascal.AccountNumberCoder', () {\n    AccountNumberCoder coder;\n    setUp(() {\n      coder = AccountNumberCoder();\n    });\n    test('can decode a pascalcoin account number', () {\n      expect(\n          coder.decodeFromBytes(PDUtil.hexToBytes('EAFA1500')) is AccountNumber,\n          true);\n      expect(coder.decodeFromBytes(PDUtil.hexToBytes('EAFA1500')).toString(),\n          '1440490-43');\n    });\n    test('can encode a pascalcoin account number', () {\n      expect(\n          PDUtil.byteToHex(coder.encodeToBytes(AccountNumber.fromInt(1440490))),\n          'EAFA1500');\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/currency_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.coding.pascal.CurrencyCoder', () {\n    CurrencyCoder coder;\n    setUp(() {\n      coder = CurrencyCoder();\n    });\n    test('can encode a pascalcoin currency', () {\n      expect(PDUtil.byteToHex(coder.encodeToBytes(Currency('0.0015'))),\n          '0F00000000000000');\n    });\n    test('can decode a pascalcoin currency', () {\n      expect(\n          coder\n              .decodeFromBytes(PDUtil.hexToBytes('0F00000000000000'))\n              .toString(),\n          '0.0015');\n      expect(\n          coder.decodeFromBytes(\n              PDUtil.hexToBytes('0474657374'.padRight(16, '0'))) is Currency,\n          true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/keys/curve_coder_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.coding.pascal.keys.CurveCoder', () {\n    CurveCoder curveCoder;\n    setUp(() {\n      curveCoder = CurveCoder();\n    });\n    test('can encode a pascalcoin key curve', () {\n      Uint8List encoded =\n          curveCoder.encodeToBytes(Curve.fromString(Curve.CN_SECP256K1).id);\n      expect(PDUtil.byteToHex(encoded), 'CA02');\n    });\n    test('can decode a pascalcoin key curve', () {\n      expect(\n          curveCoder.decodeFromBytes(PDUtil.hexToBytes('CA02')) is Curve, true);\n      expect(curveCoder.decodeFromBytes(PDUtil.hexToBytes('CA02')).id, 714);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/keys/privatekey_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../../fixtures/privatekey.dart';\n\nvoid main() {\n  group('common.coding.pascal.keys.PrivateKeyCoder', () {\n    PrivateKeyCoder coder;\n    PrivateKeyFixtures fixtures;\n\n    setUp(() {\n      coder = PrivateKeyCoder();\n      fixtures = PrivateKeyFixtures();\n    });\n    test('can decode a pascalcoin private key', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(pk.curve.id, 714);\n      });\n      fixtures.curve715.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(pk.curve.id, 715);\n      });\n      fixtures.curve716.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(pk.curve.id, 716);\n      });\n      fixtures.curve729.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(pk.curve.id, 729);\n      });\n    });\n    test('can encode a pascalcoin private key', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(coder.encodeToHex(pk), c['enc_privkey']);\n        expect(PDUtil.byteToHex(coder.encodeToBytes(pk)), c['enc_privkey']);\n      });\n      fixtures.curve715.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(coder.encodeToHex(pk), c['enc_privkey']);\n        expect(PDUtil.byteToHex(coder.encodeToBytes(pk)), c['enc_privkey']);\n      });\n      fixtures.curve716.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(coder.encodeToHex(pk), c['enc_privkey']);\n        expect(PDUtil.byteToHex(coder.encodeToBytes(pk)), c['enc_privkey']);\n      });\n      fixtures.curve729.forEach((c) {\n        PrivateKey pk =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(coder.encodeToHex(pk), c['enc_privkey']);\n        expect(PDUtil.byteToHex(coder.encodeToBytes(pk)), c['enc_privkey']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/keys/publickey_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../../fixtures/publickey.dart';\n\nvoid main() {\n  group('common.coding.pascal.keys.PublicKeyCoder', () {\n    PublicKeyCoder coder;\n    PublicKeyFixtures fixtures;\n\n    setUp(() {\n      coder = PublicKeyCoder();\n      fixtures = PublicKeyFixtures();\n    });\n    test('can decode a pascalcoin pubkey', () {\n      fixtures.curve714.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve715.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve716.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve729.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n    });\n    test('can decode a pascalcoin pubkey from base58', () {\n      fixtures.curve714.forEach((c) {\n        PublicKey key = coder.decodeFromBase58(c['b58_pubkey']);\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve715.forEach((c) {\n        PublicKey key = coder.decodeFromBase58(c['b58_pubkey']);\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve716.forEach((c) {\n        PublicKey key = coder.decodeFromBase58(c['b58_pubkey']);\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n      fixtures.curve729.forEach((c) {\n        PublicKey key = coder.decodeFromBase58(c['b58_pubkey']);\n        expect(PDUtil.byteToHex(key.x), c['x']);\n        expect(PDUtil.byteToHex(key.y), c['y']);\n        expect(key.curve.id, c['ec_nid']);\n      });\n    });\n    test('can encode a pascalcoin pubkey', () {\n      fixtures.curve714.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(coder.encodeToBytes(key)), c['enc_pubkey']);\n      });\n      fixtures.curve715.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(PDUtil.byteToHex(coder.encodeToBytes(key)), c['enc_pubkey']);\n      });\n      fixtures.curve716.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(PDUtil.byteToHex(coder.encodeToBytes(key)), c['enc_pubkey']);\n      });\n      fixtures.curve729.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(PDUtil.byteToHex(coder.encodeToBytes(key)), c['enc_pubkey']);\n      });\n    });\n    test('can encode a pascalcoin pubkey to base58', () {\n      fixtures.curve714.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(coder.encodeToBase58(key), c['b58_pubkey']);\n      });\n      fixtures.curve715.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(coder.encodeToBase58(key), c['b58_pubkey']);\n      });\n      fixtures.curve716.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(coder.encodeToBase58(key), c['b58_pubkey']);\n      });\n      fixtures.curve729.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n\n        expect(coder.encodeToBase58(key), c['b58_pubkey']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/ophash_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/operation_hash.dart';\n\nvoid main() {\n  group('common.coding.pascal.OperationHashCoder', () {\n    OperationHashFixtures fixture;\n\n    setUp(() {\n      fixture = OperationHashFixtures();\n    });\n    test('can decode a pascalcoin Operationhash', () {\n      fixture.hashes.forEach((hashData) {\n        OperationHash oph = OperationHashCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(hashData['ophash']));\n\n        expect(oph.block, hashData['block']);\n        expect(oph.account.account, hashData['account']);\n        expect(oph.nOperation, hashData['n_operation']);\n        expect(\n            PDUtil.byteToHex(oph.md160),\n            hashData['ophash'].substring(\n                hashData['ophash'].length - 40, hashData['ophash'].length));\n      });\n    });\n    test('can encode a pascalcoin Operationhash', () {\n      fixture.hashes.forEach((hashData) {\n        OperationHash opHash = OperationHash(\n            hashData['block'],\n            hashData['account'],\n            hashData['n_operation'],\n            PDUtil.hexToBytes(hashData['ophash'].substring(\n                hashData['ophash'].length - 40, hashData['ophash'].length)));\n        String hex =\n            PDUtil.byteToHex(OperationHashCoder().encodeToBytes(opHash));\n\n        expect(hex, hashData['ophash']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/coding/pascal/optype_coder_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.coding.pascal.OpTypeCoder', () {\n    test('can encode a pascalcoin opType in int8', () {\n      expect(PDUtil.byteToHex(OpTypeCoder(1).encodeToBytes(9)), '09');\n    });\n    test('can decode a pascalcoin opType to int8', () {\n      expect(OpTypeCoder(1).decodeFromBytes(PDUtil.hexToBytes('09')), 9);\n    });\n    test('can encode a pascalcoin opType in int16', () {\n      expect(PDUtil.byteToHex(OpTypeCoder(2).encodeToBytes(9)), '0900');\n    });\n    test('can decode a pascalcoin opType to int16', () {\n      expect(OpTypeCoder(2).decodeFromBytes(PDUtil.hexToBytes('0900')), 9);\n    });\n    test('can encode a pascalcoin opType in int32', () {\n      expect(PDUtil.byteToHex(OpTypeCoder(4).encodeToBytes(9)), '09000000');\n    });\n    test('can decode a pascalcoin opType to int32', () {\n      expect(OpTypeCoder(4).decodeFromBytes(PDUtil.hexToBytes('09000000')), 9);\n    });\n    test('cannot handle a wrong bytesize', () {\n      expect(() => OpTypeCoder(100), throwsException);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/fixtures/operation_hash.dart",
    "content": "class OperationHashFixtures {\n  List<Map<String, dynamic>> hashes;\n\n  OperationHashFixtures() {\n    hashes = [\n      {\n        \"block\": 145184,\n        \"account\": 725390,\n        \"ophash\":\n            \"203702008E110B0001000000CED0FF597661A01924931D1DD59AC782E7148C35\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 133249,\n        \"account\": 318389,\n        \"ophash\":\n            \"81080200B5DB040006000000AF4532D33332CF689358A29466B52B7AEB07ED93\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 97136,\n        \"account\": 285630,\n        \"ophash\":\n            \"707B0100BE5B04004BEB0A00FA8C64AE68E9C3EDACD37CC57AB5EE8610A34759\",\n        \"n_operation\": 715595\n      },\n      {\n        \"block\": 112779,\n        \"account\": 285630,\n        \"ophash\":\n            \"8BB80100BE5B0400DDFD1100680B88CC8FF6D6B55E3B219622C23EDDB2940989\",\n        \"n_operation\": 1179101\n      },\n      {\n        \"block\": 132437,\n        \"account\": 661655,\n        \"ophash\":\n            \"5505020097180A00010000001384388202AEBD17C94FFE2D9623B76D3C31A5FD\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 222078,\n        \"account\": 1109845,\n        \"ophash\":\n            \"7E63030055EF1000010000006DE6B899C400C124196E20A45C18E9080A637E6A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 88803,\n        \"account\": 285630,\n        \"ophash\":\n            \"E35A0100BE5B0400155C0800A72B9C62D9C6331A8D535B25B5CD8D33365336C4\",\n        \"n_operation\": 547861\n      },\n      {\n        \"block\": 194180,\n        \"account\": 274656,\n        \"ophash\":\n            \"84F60200E03004000B0000000B209F2233318B7A58F79C494D52D106A182C21C\",\n        \"n_operation\": 11\n      },\n      {\n        \"block\": 71450,\n        \"account\": 168573,\n        \"ophash\":\n            \"1A1701007D92020083000000E5AE8191B66E542D3D531B48FBB09F608499D8E1\",\n        \"n_operation\": 131\n      },\n      {\n        \"block\": 94190,\n        \"account\": 285630,\n        \"ophash\":\n            \"EE6F0100BE5B040000F909009F899DF6688380CBB19A95F49FABB067E1920EF1\",\n        \"n_operation\": 653568\n      },\n      {\n        \"block\": 96263,\n        \"account\": 285630,\n        \"ophash\":\n            \"07780100BE5B040013A70A007AB02F4EAD46C8C2998D00F753DE2BFBBCF1435E\",\n        \"n_operation\": 698131\n      },\n      {\n        \"block\": 170823,\n        \"account\": 853585,\n        \"ophash\":\n            \"479B020051060D000100000034541D38FD23A54CF3A15C29EE1A4A10DFE6B07D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 252072,\n        \"account\": 1259770,\n        \"ophash\":\n            \"A8D80300FA38130001000000DA08B38FC8F811EC48784BBE7EFE97D40090460D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 123430,\n        \"account\": 86646,\n        \"ophash\":\n            \"26E20100765201009206000010984FE6B1C3E6FAB370A696BA8A2CBCBF00C600\",\n        \"n_operation\": 1682\n      },\n      {\n        \"block\": 52225,\n        \"account\": 250000,\n        \"ophash\":\n            \"01CC000090D00300060000008A9870CB2E5E5619A42FD1EC7A636C19C08063F1\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 99563,\n        \"account\": 285630,\n        \"ophash\":\n            \"EB840100BE5B04003FC20B00666AAA11EBF1CEB03E45B6BDA1653914220A2ED8\",\n        \"n_operation\": 770623\n      },\n      {\n        \"block\": 141094,\n        \"account\": 285630,\n        \"ophash\":\n            \"26270200BE5B040030712400DCE7F78F488F48A9CA9BF20B20D490C7B05B246C\",\n        \"n_operation\": 2388272\n      },\n      {\n        \"block\": 21520,\n        \"account\": 106250,\n        \"ophash\":\n            \"105400000A9F01000100000044538FB5969E4408F4FD4DB4EF364A05C32DF749\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 71723,\n        \"account\": 290760,\n        \"ophash\":\n            \"2B180100C86F0400647900009624C9123D8AD699D3541C24B9917E9B24634DA5\",\n        \"n_operation\": 31076\n      },\n      {\n        \"block\": 197456,\n        \"account\": 986755,\n        \"ophash\":\n            \"50030300830E0F000100000046BFA7E2D38C33F9FCE2EDF40802566E9704AADE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 281842,\n        \"account\": 1408660,\n        \"ophash\":\n            \"F24C0400947E1500010000003C13E0389D971B1A96093CDC6885BE73C2EEB928\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 171733,\n        \"account\": 285630,\n        \"ophash\":\n            \"D59E0200BE5B04008FF5340017C8C199677E96C72BC407E03962879EAE23CE32\",\n        \"n_operation\": 3470735\n      },\n      {\n        \"block\": 65352,\n        \"account\": 285630,\n        \"ophash\":\n            \"48FF0000BE5B0400995E01004092B10D2FACED75757E4B7EC1D572672554FF4B\",\n        \"n_operation\": 89753\n      },\n      {\n        \"block\": 107122,\n        \"account\": 285630,\n        \"ophash\":\n            \"72A20100BE5B0400E9E20E0030E01EB1863C85116880B6FB78ECF02CC8AB661A\",\n        \"n_operation\": 975593\n      },\n      {\n        \"block\": 188221,\n        \"account\": 571630,\n        \"ophash\":\n            \"3DDF0200EEB80800DB16000076206AA5E8CE273243735E5125F5B9B8529BA389\",\n        \"n_operation\": 5851\n      },\n      {\n        \"block\": 207716,\n        \"account\": 571630,\n        \"ophash\":\n            \"642B0300EEB80800FD270000870874F538EAF1955AC165D4E49A6CED2F80E4D8\",\n        \"n_operation\": 10237\n      },\n      {\n        \"block\": 127859,\n        \"account\": 86646,\n        \"ophash\":\n            \"73F30100765201000E0700004A7B2F31D45DE9431CE3AF944B435B7DA2A457A7\",\n        \"n_operation\": 1806\n      },\n      {\n        \"block\": 140580,\n        \"account\": 453213,\n        \"ophash\":\n            \"242502005DEA06000200000086D2657961CD22C31D1896115D5717E159A8F763\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 163390,\n        \"account\": 647858,\n        \"ophash\":\n            \"3E7E0200B2E20900050000003EFE45958DDADD8FAE6F2C7F22641516590749F5\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 162887,\n        \"account\": 813900,\n        \"ophash\":\n            \"477C02004C6B0C00010000003B8FFAA508950218CC49287A7F289C0CCA00FB28\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 250717,\n        \"account\": 285630,\n        \"ophash\":\n            \"5DD30300BE5B0400A9124B005A9B9B5CBE40DBBEB596EEC47F22B055E1908245\",\n        \"n_operation\": 4919977\n      },\n      {\n        \"block\": 137307,\n        \"account\": 686010,\n        \"ophash\":\n            \"5B180200BA770A0001000000C4D4ADF655617BD5055A2B9B933D2608E8219621\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 76273,\n        \"account\": 285630,\n        \"ophash\":\n            \"F1290100BE5B0400ECBA0400BA72424704CE3E70263CB2A44EC74D6A8BD901AC\",\n        \"n_operation\": 309996\n      },\n      {\n        \"block\": 124621,\n        \"account\": 143351,\n        \"ophash\":\n            \"CDE60100F72F020079040000C3061A7A8FFCC4A7602A32897BCCF2C945F79E3F\",\n        \"n_operation\": 1145\n      },\n      {\n        \"block\": 169233,\n        \"account\": 845605,\n        \"ophash\":\n            \"1195020025E70C0001000000249A2E8BEFA352052D2FABDF6809169EE13B9708\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 90199,\n        \"account\": 285630,\n        \"ophash\":\n            \"57600100BE5B040033BD08004A73B040F5B59DEA48AB3AEAC082242425C1CEA1\",\n        \"n_operation\": 572723\n      },\n      {\n        \"block\": 71448,\n        \"account\": 285630,\n        \"ophash\":\n            \"18170100BE5B0400522E03001F425F1357D8E7A920A4CE58FB95EA7613302BEA\",\n        \"n_operation\": 208466\n      },\n      {\n        \"block\": 112431,\n        \"account\": 561565,\n        \"ophash\":\n            \"2FB701009D910800010000001C80B1D02CA82F311BF317301B853FA5401CFAB4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 192382,\n        \"account\": 961340,\n        \"ophash\":\n            \"7EEF02003CAB0E00010000004EBBACA38A5C4D0B17F01D353CE218521816C7CC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 70858,\n        \"account\": 168537,\n        \"ophash\":\n            \"CA140100599202001F0000004E8124E483506D7DEFF310B411E1B9429172F35C\",\n        \"n_operation\": 31\n      },\n      {\n        \"block\": 261001,\n        \"account\": 1301680,\n        \"ophash\":\n            \"89FB0300B0DC130001000000405368C194DCCF9006574E0795021587BB69B6C5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 174259,\n        \"account\": 285630,\n        \"ophash\":\n            \"B3A80200BE5B0400E673360022E36363D1D9EC9D7E79F098B5AA61D1B9B41CBA\",\n        \"n_operation\": 3568614\n      },\n      {\n        \"block\": 279728,\n        \"account\": 34500,\n        \"ophash\":\n            \"B0440400C4860000AC1F0000A5FAC040AC20F75B12CB9CD4D470C88A3FD5D10E\",\n        \"n_operation\": 8108\n      },\n      {\n        \"block\": 110956,\n        \"account\": 285630,\n        \"ophash\":\n            \"6CB10100BE5B0400ECF51000B13946F2DEE508C1D112E28F3A214C0995BBF3C0\",\n        \"n_operation\": 1111532\n      },\n      {\n        \"block\": 293348,\n        \"account\": 819598,\n        \"ophash\":\n            \"E47904008E810C00100000007330C3F25C4C112E3AC83B5D57699E7D70DCC3B4\",\n        \"n_operation\": 16\n      },\n      {\n        \"block\": 176329,\n        \"account\": 831690,\n        \"ophash\":\n            \"C9B00200CAB00C001D000000698A367C0D85BC0C66322E3186A0E8057C5DF1E3\",\n        \"n_operation\": 29\n      },\n      {\n        \"block\": 76493,\n        \"account\": 285630,\n        \"ophash\":\n            \"CD2A0100BE5B0400E4CF040016A722271659174361ECF5AE358123CD2220A385\",\n        \"n_operation\": 315364\n      },\n      {\n        \"block\": 228406,\n        \"account\": 1141480,\n        \"ophash\":\n            \"367C0300E86A1100010000005729291FB3BB227B53CD7084B4BF91409433950E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 69298,\n        \"account\": 279500,\n        \"ophash\":\n            \"B20E0100CC4304000A00000098F8611727E6F27484BDC1DD8F4020F6B5194A20\",\n        \"n_operation\": 10\n      },\n      {\n        \"block\": 192904,\n        \"account\": 963960,\n        \"ophash\":\n            \"88F1020078B50E0001000000383AC4DFF56ECEABCAF67A780D992F2182B2D315\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 202057,\n        \"account\": 571630,\n        \"ophash\":\n            \"49150300EEB8080000230000CBD006E8FA86F458189436813CD623F32AADBE42\",\n        \"n_operation\": 8960\n      },\n      {\n        \"block\": 266435,\n        \"account\": 1331640,\n        \"ophash\":\n            \"C3100400B85114000100000017F9F0144F0C0C3F67757D71E52B8EBCD5D0DC90\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 290745,\n        \"account\": 1452690,\n        \"ophash\":\n            \"B96F0400922A160001000000E9B6EC1DCCDEFC21B70743B04F1A455A9F2E0FE2\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 239823,\n        \"account\": 1198570,\n        \"ophash\":\n            \"CFA80300EA49120001000000B1AFE26A2706ADE1B098AFD11FD5AA8A939EDE89\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 175828,\n        \"account\": 571630,\n        \"ophash\":\n            \"D4AE0200EEB808009E0F0000D4670156A28528537B82C6484093C2110645BECF\",\n        \"n_operation\": 3998\n      },\n      {\n        \"block\": 293273,\n        \"account\": 1465830,\n        \"ophash\":\n            \"99790400E65D1600010000006743EFCDB2969DE044F13901CD6F774690399D61\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 221015,\n        \"account\": 300124,\n        \"ophash\":\n            \"575F03005C9404003E310000BCCD047E70495F38AFFF3ADE2B03B3DB280D72D4\",\n        \"n_operation\": 12606\n      },\n      {\n        \"block\": 75191,\n        \"account\": 143351,\n        \"ophash\":\n            \"B7250100F72F0200210300007A4654F2ACBF25A0B0BDD9D3563249ED950D6534\",\n        \"n_operation\": 801\n      },\n      {\n        \"block\": 178365,\n        \"account\": 359614,\n        \"ophash\":\n            \"BDB80200BE7C0500020000005A9E0C4AE386F20CB1D9FF7BBEF70059EA089DB7\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 60105,\n        \"account\": 285630,\n        \"ophash\":\n            \"C9EA0000BE5B0400707D0000CE14549A0A555F5CAA568954C8AABB1B62F01D5C\",\n        \"n_operation\": 32112\n      },\n      {\n        \"block\": 92803,\n        \"account\": 285630,\n        \"ophash\":\n            \"836A0100BE5B0400A57C09004723A6DE0BE9E464CAC1ED03ECB62EAC29629FA8\",\n        \"n_operation\": 621733\n      },\n      {\n        \"block\": 167332,\n        \"account\": 86646,\n        \"ophash\":\n            \"A48D020076520100CB0D00000B71CC945B2211856F7C24DB3E9521E480B35B3D\",\n        \"n_operation\": 3531\n      },\n      {\n        \"block\": 164798,\n        \"account\": 823475,\n        \"ophash\":\n            \"BE830200B3900C0001000000533908EEE6DD2DF06D1D19ABDF53A43DFBDCC032\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 40562,\n        \"account\": 52405,\n        \"ophash\":\n            \"729E0000B5CC000006000000E092C485BDF8F0371127E1B1A83263E5973D3AE5\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 258397,\n        \"account\": 1291395,\n        \"ophash\":\n            \"5DF1030083B4130001000000F43F9D8C32899E6D9319330B377443038287506D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 18928,\n        \"account\": 84585,\n        \"ophash\":\n            \"F0490000694A0100010000002B1F777DFCC789CE3E5962931A136D77A2638188\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 187784,\n        \"account\": 86646,\n        \"ophash\":\n            \"88DD02007652010014130000CCF929C4F624BB0EB1954896CC9888D50A651482\",\n        \"n_operation\": 4884\n      },\n      {\n        \"block\": 194929,\n        \"account\": 974080,\n        \"ophash\":\n            \"71F9020000DD0E0001000000E18CA90D602A67DA3EA12C950D4C75ADB3312BFC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 93775,\n        \"account\": 285630,\n        \"ophash\":\n            \"4F6E0100BE5B040077D5090098C3EC32642DAC2AD38DEA6F59372A4FB39ABA92\",\n        \"n_operation\": 644471\n      },\n      {\n        \"block\": 81932,\n        \"account\": 409125,\n        \"ophash\":\n            \"0C400100253E0600010000003DEEF919CDF79DC6E04E7DEB485F38F1A5C9C28C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 94239,\n        \"account\": 470580,\n        \"ophash\":\n            \"1F700100342E0700010000009DA71AACF49B09796515A8894B7186736BC167E9\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 170212,\n        \"account\": 850485,\n        \"ophash\":\n            \"E498020035FA0C000100000017CFD48AC92E6AC56D3F3EDFF8416F158D4E1E04\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 173527,\n        \"account\": 867105,\n        \"ophash\":\n            \"D7A50200213B0D00010000004D587A8A4BDFC1EE5A85B3EF7DEA48071D6664FC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 201999,\n        \"account\": 86646,\n        \"ophash\":\n            \"0F1503007652010084140000A2D7CDDCD804E4C5B2DFF006CCBB89A8F8B20CAF\",\n        \"n_operation\": 5252\n      },\n      {\n        \"block\": 90868,\n        \"account\": 285630,\n        \"ophash\":\n            \"F4620100BE5B04009AED0800C2C081A29CE007ACFA50F1FDF8102FE6E7A09FA5\",\n        \"n_operation\": 585114\n      },\n      {\n        \"block\": 187134,\n        \"account\": 285630,\n        \"ophash\":\n            \"FEDA0200BE5B04000F9D3D0015A5206A69E0CF38E35FA76DB86926A796EBC282\",\n        \"n_operation\": 4037903\n      },\n      {\n        \"block\": 204281,\n        \"account\": 1020865,\n        \"ophash\":\n            \"F91D0300C1930F00010000007966FFE3C3BA795376C7B29B20BE163F081A2C13\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 86627,\n        \"account\": 285630,\n        \"ophash\":\n            \"63520100BE5B040083C90700D78FD4E7560CE92BFB92563090846F82B5028E79\",\n        \"n_operation\": 510339\n      },\n      {\n        \"block\": 132044,\n        \"account\": 86646,\n        \"ophash\":\n            \"CC0302007652010074070000EB8F75D8380598D9B28A87EED7DC1865CC6C2CD3\",\n        \"n_operation\": 1908\n      },\n      {\n        \"block\": 111237,\n        \"account\": 285630,\n        \"ophash\":\n            \"85B20100BE5B04003E201100ACC1299E4C04EE40A6FE27543220DDDC0F61C52F\",\n        \"n_operation\": 1122366\n      },\n      {\n        \"block\": 147226,\n        \"account\": 86646,\n        \"ophash\":\n            \"1A3F02007652010084080000DE63792BAC08167C024F62FCA2F311DE6217E83A\",\n        \"n_operation\": 2180\n      },\n      {\n        \"block\": 108113,\n        \"account\": 285630,\n        \"ophash\":\n            \"51A60100BE5B0400146C0F00D823419DF299490824AB38CA108B05256B9078AA\",\n        \"n_operation\": 1010708\n      },\n      {\n        \"block\": 244497,\n        \"account\": 571630,\n        \"ophash\":\n            \"11BB0300EEB80800D12F0000A811D71E5523E788C0448A2833F0323A2DD29ACB\",\n        \"n_operation\": 12241\n      },\n      {\n        \"block\": 37919,\n        \"account\": 53275,\n        \"ophash\":\n            \"1F9400001BD0000003000000B223226C31C4193E3D5100FA8C3F65D24986E8F3\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 102163,\n        \"account\": 86646,\n        \"ophash\":\n            \"138F01007652010057030000879342A080B1F5EF084D7EDE8147A86CB468BC11\",\n        \"n_operation\": 855\n      },\n      {\n        \"block\": 251822,\n        \"account\": 1258555,\n        \"ophash\":\n            \"AED703003B34130001000000FAA7CC0063FC040603AA6C2180ACDCCEDA26F6FE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 86280,\n        \"account\": 285630,\n        \"ophash\":\n            \"08510100BE5B0400E5B00700C0F754B00A3CD4A85B4487E10DA9D5806451FAD7\",\n        \"n_operation\": 504037\n      },\n      {\n        \"block\": 97499,\n        \"account\": 285630,\n        \"ophash\":\n            \"DB7C0100BE5B04003E0B0B004A681FB2BEDF5C6140DA518C3037DFE7F627DE9B\",\n        \"n_operation\": 723774\n      },\n      {\n        \"block\": 160692,\n        \"account\": 571630,\n        \"ophash\":\n            \"B4730200EEB80800F8080000FC4D04C70665735EE35009C6A4B2B4A1CE6193FE\",\n        \"n_operation\": 2296\n      },\n      {\n        \"block\": 229189,\n        \"account\": 123023,\n        \"ophash\":\n            \"457F03008FE0010002000000B2B0E2400DEA5986288A4E3085CC14B03275D1B6\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 35168,\n        \"account\": 173055,\n        \"ophash\":\n            \"60890000FFA3020001000000BCE7EDFF83559295EC3970ECC62C117707379E64\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231121,\n        \"account\": 997350,\n        \"ophash\":\n            \"D1860300E6370F00F1040000DDBBD92EAE041C2098F1CB1F3C88ED1C79F9E8DA\",\n        \"n_operation\": 1265\n      },\n      {\n        \"block\": 67055,\n        \"account\": 285630,\n        \"ophash\":\n            \"EF050100BE5B040034B60100D2CA60221142050917078582FA984B99A8747567\",\n        \"n_operation\": 112180\n      },\n      {\n        \"block\": 72983,\n        \"account\": 285630,\n        \"ophash\":\n            \"171D0100BE5B0400C3B20300730AFC1008446B1F90A930F89251AEE3AFC9D57D\",\n        \"n_operation\": 242371\n      },\n      {\n        \"block\": 158892,\n        \"account\": 793940,\n        \"ophash\":\n            \"AC6C0200541D0C000100000088AD60A0BB3F08881D83E41B6191E2E5B118E04F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 266230,\n        \"account\": 1330525,\n        \"ophash\":\n            \"F60F04005D4D1400010000004B7E4500CB6BC0257319DB704737DA8FDA38BC9B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 140840,\n        \"account\": 703685,\n        \"ophash\":\n            \"28260200C5BC0A0001000000E4D3864A81B404F59DDBF9D75EABF5B788BBB5C1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 190862,\n        \"account\": 572489,\n        \"ophash\":\n            \"8EE9020049BC080005000000A726157B53939D13B4C49A2CEF280A6E41BDF6F7\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 94676,\n        \"account\": 285630,\n        \"ophash\":\n            \"D4710100BE5B040035240A0065BB7A9F157C83C699E81306107471FA82C9E16B\",\n        \"n_operation\": 664629\n      },\n      {\n        \"block\": 188212,\n        \"account\": 571630,\n        \"ophash\":\n            \"34DF0200EEB80800DA16000035A561AA5DC3F4F34E37525887DF0CD8B4D5E449\",\n        \"n_operation\": 5850\n      },\n      {\n        \"block\": 61770,\n        \"account\": 285630,\n        \"ophash\":\n            \"4AF10000BE5B0400ECCD0000E07F75D4C4F46D0ABF0737A59E59998B580F5E48\",\n        \"n_operation\": 52716\n      },\n      {\n        \"block\": 58801,\n        \"account\": 285630,\n        \"ophash\":\n            \"B1E50000BE5B04001542000060C3D5550E1A4A488B4AB8142B556D463732CE79\",\n        \"n_operation\": 16917\n      },\n      {\n        \"block\": 208528,\n        \"account\": 571630,\n        \"ophash\":\n            \"902E0300EEB80800932800003F2F5671DE1E92AABFD355978C1D999BF93048A4\",\n        \"n_operation\": 10387\n      },\n      {\n        \"block\": 89217,\n        \"account\": 285630,\n        \"ophash\":\n            \"815C0100BE5B0400E5780800E44532047B0B9212F26C302F0976163349B0B985\",\n        \"n_operation\": 555237\n      },\n      {\n        \"block\": 90111,\n        \"account\": 285630,\n        \"ophash\":\n            \"FF5F0100BE5B04000AB70800B934CBCCE1386D6FCFAC2B80715FD57C0282F527\",\n        \"n_operation\": 571146\n      },\n      {\n        \"block\": 116728,\n        \"account\": 285630,\n        \"ophash\":\n            \"F8C70100BE5B040090651400B57326C2ABE06BFDC3B0AB4E6570DCCA49EF79CA\",\n        \"n_operation\": 1336720\n      },\n      {\n        \"block\": 73665,\n        \"account\": 285630,\n        \"ophash\":\n            \"C11F0100BE5B04009CE30300412D6968BB41DC3F258C828E9692F6C79B9387A7\",\n        \"n_operation\": 254876\n      },\n      {\n        \"block\": 82559,\n        \"account\": 285630,\n        \"ophash\":\n            \"7F420100BE5B040028AE0600203D5B831220417C1753434CB78BD0A6B37A05DD\",\n        \"n_operation\": 437800\n      },\n      {\n        \"block\": 194530,\n        \"account\": 571630,\n        \"ophash\":\n            \"E2F70200EEB80800EB1B0000CDF3BA49E701A45D9E25DD5A621C0CC5CA3901B4\",\n        \"n_operation\": 7147\n      },\n      {\n        \"block\": 209658,\n        \"account\": 571630,\n        \"ophash\":\n            \"FA320300EEB808006029000023CF5E172CA19904C21BB4C3D91B5C2EC7F841A3\",\n        \"n_operation\": 10592\n      },\n      {\n        \"block\": 62783,\n        \"account\": 285630,\n        \"ophash\":\n            \"3FF50000BE5B0400C0FC0000BFB658DD8082E4115AC1B85007AF4281F57A1554\",\n        \"n_operation\": 64704\n      },\n      {\n        \"block\": 74807,\n        \"account\": 285630,\n        \"ophash\":\n            \"37240100BE5B0400783F04003769FC2D41F555965687163DE7E04209FDB0AA87\",\n        \"n_operation\": 278392\n      },\n      {\n        \"block\": 281239,\n        \"account\": 1405660,\n        \"ophash\":\n            \"974A0400DC721500010000005DB200F28EDFC92CF4C9F72E81A7610A499AB653\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 111515,\n        \"account\": 556985,\n        \"ophash\":\n            \"9BB30100B97F0800010000006F465BE5DEC8FCE281575C1C7FDC29587EAAE079\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 263638,\n        \"account\": 629030,\n        \"ophash\":\n            \"D60504002699090013000000016A0C4863B33A6F69F791CACF24CA0A4F19FB26\",\n        \"n_operation\": 19\n      },\n      {\n        \"block\": 274693,\n        \"account\": 86646,\n        \"ophash\":\n            \"05310400765201004318000039188CD9667B9F976B5BF2D5F30BAF90E9476418\",\n        \"n_operation\": 6211\n      },\n      {\n        \"block\": 145877,\n        \"account\": 571630,\n        \"ophash\":\n            \"D5390200EEB808001A0400009116476EBE64A5934AF7E6EE2ACBAF80F4FA62C9\",\n        \"n_operation\": 1050\n      },\n      {\n        \"block\": 232635,\n        \"account\": 1162610,\n        \"ophash\":\n            \"BB8C030072BD11000100000035D826FA47FBEBCC9B69A6339ECA8F289C5B0982\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 114056,\n        \"account\": 285630,\n        \"ophash\":\n            \"88BD0100BE5B0400FEB312005F36CE4BFA2A3512E881233280AFCADCF656628B\",\n        \"n_operation\": 1225726\n      },\n      {\n        \"block\": 157764,\n        \"account\": 788290,\n        \"ophash\":\n            \"4468020042070C0001000000E3FAFAC8D1FBCC58DD6E8E43C3C7C5193E7E5FD1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 263688,\n        \"account\": 571630,\n        \"ophash\":\n            \"08060400EEB808005D3200009772534E6F7709721A0A76837582F1171490EECB\",\n        \"n_operation\": 12893\n      },\n      {\n        \"block\": 292859,\n        \"account\": 1463755,\n        \"ophash\":\n            \"FB770400CB55160001000000DAFD5713EDA956C3F125695A34173D6BB091B8BB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 104942,\n        \"account\": 285630,\n        \"ophash\":\n            \"EE990100BE5B040028C00D00B6EFB26D548C06463EE3A9CB03A7C61595A5E88E\",\n        \"n_operation\": 901160\n      },\n      {\n        \"block\": 61347,\n        \"account\": 285630,\n        \"ophash\":\n            \"A3EF0000BE5B0400B0B700001827E619E75FC0763CFDC8180C6B74F5DFEF8935\",\n        \"n_operation\": 47024\n      },\n      {\n        \"block\": 69560,\n        \"account\": 86646,\n        \"ophash\":\n            \"B80F01007652010032010000738F97EBD7D8FEBAB90C9A2089D065BDF538CDFB\",\n        \"n_operation\": 306\n      },\n      {\n        \"block\": 134178,\n        \"account\": 285630,\n        \"ophash\":\n            \"220C0200BE5B04007636200093F3B5CA5191D3877C4BE69901FAAC5569BA2713\",\n        \"n_operation\": 2111094\n      },\n      {\n        \"block\": 232301,\n        \"account\": 285630,\n        \"ophash\":\n            \"6D8B0300BE5B04005F6A4900351663D952610BDC983F6008AB263C283EEEAA9D\",\n        \"n_operation\": 4811359\n      },\n      {\n        \"block\": 290096,\n        \"account\": 1449960,\n        \"ophash\":\n            \"306D0400E81F160001000000FA7874E1FC3EF638E350ED8B626AB2117D9C133B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 107529,\n        \"account\": 285630,\n        \"ophash\":\n            \"09A40100BE5B04006D1A0F0011D643A9AFCFE0A4A1A80CFB3BB6944F1B659412\",\n        \"n_operation\": 989805\n      },\n      {\n        \"block\": 150808,\n        \"account\": 285630,\n        \"ophash\":\n            \"184D0200BE5B04003BE12900905C9AE5DE3E400C8C6FDAECF69807F72CDF8697\",\n        \"n_operation\": 2744635\n      },\n      {\n        \"block\": 186914,\n        \"account\": 934030,\n        \"ophash\":\n            \"22DA02008E400E00010000005210BF069E762463B42948FE60F7047EDE7D3FEA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 173997,\n        \"account\": 869465,\n        \"ophash\":\n            \"ADA7020059440D0001000000C78DE8ECC0E023C2DF12A4B5810D8165F25F825F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 71162,\n        \"account\": 285630,\n        \"ophash\":\n            \"FA150100BE5B0400D011030058051ECD204AEACCD5BC9BA68ED97964F0F92A53\",\n        \"n_operation\": 201168\n      },\n      {\n        \"block\": 242551,\n        \"account\": 1212205,\n        \"ophash\":\n            \"77B303002D7F12000100000007C0BF59D5CDC341C365E48A2D537EA8054C8B87\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 195974,\n        \"account\": 571630,\n        \"ophash\":\n            \"86FD0200EEB80800321D000058EA507FDE5F08683B412521B31F263AB8676B73\",\n        \"n_operation\": 7474\n      },\n      {\n        \"block\": 109145,\n        \"account\": 285630,\n        \"ophash\":\n            \"59AA0100BE5B040077F70F00CA8BBAEE5E977C95DA4D3882D8F12E4343C8B00D\",\n        \"n_operation\": 1046391\n      },\n      {\n        \"block\": 62303,\n        \"account\": 290760,\n        \"ophash\":\n            \"5FF30000C86F0400EB370000D80724773D1F5F89FB1AE6D9344C8E5F52E7B48E\",\n        \"n_operation\": 14315\n      },\n      {\n        \"block\": 71577,\n        \"account\": 285630,\n        \"ophash\":\n            \"99170100BE5B0400E63A0300CE16145F8908EA85661C40C8A5AC8BDD537AE8F2\",\n        \"n_operation\": 211686\n      },\n      {\n        \"block\": 57774,\n        \"account\": 285275,\n        \"ophash\":\n            \"AEE100005B5A0400010000004412B05D554B42A85E187414EA41080124C07CDB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 117363,\n        \"account\": 586300,\n        \"ophash\":\n            \"73CA01003CF2080001000000B6EAAE86D0F1C147245F73302D02B0941CA60F76\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 169580,\n        \"account\": 285630,\n        \"ophash\":\n            \"6C960200BE5B040021BC330005C7ADFF4859D3C8EC222D6F7CEFADD61E319BFC\",\n        \"n_operation\": 3390497\n      },\n      {\n        \"block\": 102351,\n        \"account\": 285630,\n        \"ophash\":\n            \"CF8F0100BE5B0400F7AE0C005196D77D6665A1601F4A6A428C19CB93F36240CF\",\n        \"n_operation\": 831223\n      },\n      {\n        \"block\": 299368,\n        \"account\": 86646,\n        \"ophash\":\n            \"6891040076520100DE180000800F975D2FE6829F66CA496046CF6174A87AD02B\",\n        \"n_operation\": 6366\n      },\n      {\n        \"block\": 218466,\n        \"account\": 300124,\n        \"ophash\":\n            \"625503005C940400363100009CD22D59DF15BDFA15E2EFEB241ED9C362BD5EB0\",\n        \"n_operation\": 12598\n      },\n      {\n        \"block\": 108165,\n        \"account\": 285630,\n        \"ophash\":\n            \"85A60100BE5B0400FE710F002B1C3A2A502AF7D7E886E73FC921508D0BDBBE12\",\n        \"n_operation\": 1012222\n      },\n      {\n        \"block\": 155239,\n        \"account\": 571630,\n        \"ophash\":\n            \"675E0200EEB80800F606000039DC724377F4183B0DAC4226DAFE4C72ABB52178\",\n        \"n_operation\": 1782\n      },\n      {\n        \"block\": 153795,\n        \"account\": 768465,\n        \"ophash\":\n            \"C3580200D1B90B000100000096EAAA3EA3FBC7AD1612E8D2A6F6E682A11A8477\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 106682,\n        \"account\": 285630,\n        \"ophash\":\n            \"BAA00100BE5B04000EA50E00A133B14F6C2F7FE7AD1EF5C4A0B1C51158CBCA0E\",\n        \"n_operation\": 959758\n      },\n      {\n        \"block\": 260844,\n        \"account\": 491587,\n        \"ophash\":\n            \"ECFA03004380070004000000EFD74506349E2B87492F05DAE0CC709B1A3C5E5B\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 232479,\n        \"account\": 1161855,\n        \"ophash\":\n            \"1F8C03007FBA1100010000000D10A2CC87A3B4C10C1D9CF0864D04A551042E68\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 133133,\n        \"account\": 665135,\n        \"ophash\":\n            \"0D0802002F260A0001000000DB762E45A755AA0484CFFC7E8F9EDAC72B577C1C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 238342,\n        \"account\": 1191135,\n        \"ophash\":\n            \"06A30300DF2C120001000000E42B689A6B237BBF86FAB8E5627E72AA1AB411FB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 106439,\n        \"account\": 285630,\n        \"ophash\":\n            \"C79F0100BE5B0400D08F0E007C26B08B76A233D462201CB27FA954912D22FA3A\",\n        \"n_operation\": 954320\n      },\n      {\n        \"block\": 241799,\n        \"account\": 300124,\n        \"ophash\":\n            \"87B003005C94040098310000717C94CBA92E2947E9C75C4FD6BF9E87BCB35685\",\n        \"n_operation\": 12696\n      },\n      {\n        \"block\": 226298,\n        \"account\": 1130940,\n        \"ophash\":\n            \"FA730300BC41110001000000D862785EC29CB2058DBB437DC8FCB1667384DD4A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 87638,\n        \"account\": 285630,\n        \"ophash\":\n            \"56560100BE5B0400020F0800CA5537DDDBFABD1580A814F4C5AB1898A381B4AD\",\n        \"n_operation\": 528130\n      },\n      {\n        \"block\": 141540,\n        \"account\": 707175,\n        \"ophash\":\n            \"E428020067CA0A0001000000834E56C62C04B3343E9BDBC8E0B91E2608903916\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 149795,\n        \"account\": 748450,\n        \"ophash\":\n            \"23490200A26B0B000100000004886D5E848ED49EEBE94D5F52A4A3C6EE29FB36\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 239296,\n        \"account\": 1195940,\n        \"ophash\":\n            \"C0A60300A43F12000100000038E52E64781A9A880D92A723D152000284239335\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 104019,\n        \"account\": 277710,\n        \"ophash\":\n            \"53960100CE3C040003000000B28572731F7E2987F40082D1A59F7625D78AA261\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 193661,\n        \"account\": 571630,\n        \"ophash\":\n            \"7DF40200EEB80800411B0000069C082E03E69FA45379D79CDE3EC5B03D4C3116\",\n        \"n_operation\": 6977\n      },\n      {\n        \"block\": 278010,\n        \"account\": 1389535,\n        \"ophash\":\n            \"FA3D0400DF3315000100000031D4B65CDD2768A92B3BB4B4CA559FEC55CE568C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 178347,\n        \"account\": 891210,\n        \"ophash\":\n            \"ABB802004A990D0001000000AB7D7113E4B4B0BC2653A8502C015EF0B96CCD2E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 280624,\n        \"account\": 1402580,\n        \"ophash\":\n            \"30480400D466150001000000D343BD349CF3BAB5CBA6DAEF3A5D4C0C6B0C148F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 85457,\n        \"account\": 285630,\n        \"ophash\":\n            \"D14D0100BE5B04001579070043877EA4B35C6DCFBB5D4D84B56BA56918884CD2\",\n        \"n_operation\": 489749\n      },\n      {\n        \"block\": 80255,\n        \"account\": 400725,\n        \"ophash\":\n            \"7F390100551D060001000000A38D6E76745E9B923EEC90328FDE87CB982F6433\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 77342,\n        \"account\": 285630,\n        \"ophash\":\n            \"1E2E0100BE5B0400651005003F7C7988A5B860BAD60BB8CB77409AC41EB37A6A\",\n        \"n_operation\": 331877\n      },\n      {\n        \"block\": 209827,\n        \"account\": 571630,\n        \"ophash\":\n            \"A3330300EEB80800832900005AE3863F315D46D41D5917BC0BC3F68FC876BF53\",\n        \"n_operation\": 10627\n      },\n      {\n        \"block\": 198158,\n        \"account\": 571630,\n        \"ophash\":\n            \"0E060300EEB80800401F00000E55440894AF1582B5D674E615510F4C1A65A313\",\n        \"n_operation\": 8000\n      },\n      {\n        \"block\": 80426,\n        \"account\": 285630,\n        \"ophash\":\n            \"2A3A0100BE5B04000802060044610EBD2D79B7C029F886148FA0E69E0F414A2C\",\n        \"n_operation\": 393736\n      },\n      {\n        \"block\": 238840,\n        \"account\": 1193670,\n        \"ophash\":\n            \"F8A40300C63612000100000014880C77F57226C1F7DE931B20FCF1F90EEEA25C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 68716,\n        \"account\": 285630,\n        \"ophash\":\n            \"6C0C0100BE5B04002831020028619D74B2B9ECEC777012B04859B0944D0047E5\",\n        \"n_operation\": 143656\n      },\n      {\n        \"block\": 292700,\n        \"account\": 1462945,\n        \"ophash\":\n            \"5C770400A152160001000000B5ADA3DF99C505F2A1EB1E09B6405BB0E821E015\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 68986,\n        \"account\": 344395,\n        \"ophash\":\n            \"7A0D01004B4105000100000019CC21892FFCE87A7D234F52CA02743F379F9A5B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 265638,\n        \"account\": 285630,\n        \"ophash\":\n            \"A60D0400BE5B0400F9F34C002EE867782E74FB8C0E8ADAD2F68FB09A33C2E27C\",\n        \"n_operation\": 5043193\n      },\n      {\n        \"block\": 144286,\n        \"account\": 720915,\n        \"ophash\":\n            \"9E33020013000B0001000000FF7F863F765E476B5F682BA7655571FC2B72E915\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 66642,\n        \"account\": 332620,\n        \"ophash\":\n            \"520401004C13050001000000A4DCE7D45C9DA7EEA6E531B410FF33DE5AAA6C5B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 151600,\n        \"account\": 757395,\n        \"ophash\":\n            \"30500200938E0B000100000052B1951288F3A830BA35D7DC9679059139058215\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 153023,\n        \"account\": 86646,\n        \"ophash\":\n            \"BF5502007652010005090000C84FAD5374E640B2988D3382E65C554692248B3E\",\n        \"n_operation\": 2309\n      },\n      {\n        \"block\": 119180,\n        \"account\": 595385,\n        \"ophash\":\n            \"8CD10100B915090001000000D07732F741DDA13C9FE9310C8BDAF9288AA3EE28\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 73918,\n        \"account\": 168536,\n        \"ophash\":\n            \"BE200100589202002C010000EDD9A0C915674CE26733FF8A2701500C7419887D\",\n        \"n_operation\": 300\n      },\n      {\n        \"block\": 59705,\n        \"account\": 290760,\n        \"ophash\":\n            \"39E90000C86F040050190000030BC52C9A23AC0EE0E29D43999D609309DA8B27\",\n        \"n_operation\": 6480\n      },\n      {\n        \"block\": 108305,\n        \"account\": 221465,\n        \"ophash\":\n            \"11A70100196103000400000065D286BE627CBC9F9334A601CFF75C024020442D\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 181038,\n        \"account\": 904620,\n        \"ophash\":\n            \"2EC30200ACCD0D00010000003B32D1FD6CAD511E918328C33BACD8E303146015\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 115615,\n        \"account\": 285630,\n        \"ophash\":\n            \"9FC30100BE5B0400E67C1300FE0C57E6A662324C75141A1A0F011F03DA5B51E4\",\n        \"n_operation\": 1277158\n      },\n      {\n        \"block\": 210997,\n        \"account\": 285630,\n        \"ophash\":\n            \"35380300BE5B0400967C4600737359BD842D7A2E7457DDF771B391A130263080\",\n        \"n_operation\": 4619414\n      },\n      {\n        \"block\": 261690,\n        \"account\": 1307920,\n        \"ophash\":\n            \"3AFE030010F5130001000000BEE212DD8F2D21F441F4FBA5866EB9393F7593D5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 159083,\n        \"account\": 291000,\n        \"ophash\":\n            \"6B6D0200B87004006C000000C492ACC1D624E7A8C57701AC96CB4865D3E8838E\",\n        \"n_operation\": 108\n      },\n      {\n        \"block\": 64051,\n        \"account\": 290760,\n        \"ophash\":\n            \"33FA0000C86F040087480000225345F05F73EF6DC5E45EE3CFC758581D326236\",\n        \"n_operation\": 18567\n      },\n      {\n        \"block\": 296695,\n        \"account\": 1482925,\n        \"ophash\":\n            \"F7860400ADA0160001000000079C0969F77EBDF742CFE3B72514AD8DACC7EA5A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 133963,\n        \"account\": 669290,\n        \"ophash\":\n            \"4B0B02006A360A0001000000C7973826D40C04F6D18F064036F873CBB279D1F3\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 91744,\n        \"account\": 285630,\n        \"ophash\":\n            \"60660100BE5B0400842E0900CC55D13C97A54DA9C6D5713A6ABDCA678B80BD5E\",\n        \"n_operation\": 601732\n      },\n      {\n        \"block\": 100817,\n        \"account\": 285630,\n        \"ophash\":\n            \"D1890100BE5B04008C230C001923A8F9209D16C034C705695EC39694BF2588C9\",\n        \"n_operation\": 795532\n      },\n      {\n        \"block\": 199439,\n        \"account\": 330025,\n        \"ophash\":\n            \"0F0B030029090500993B0000A3519DAAAD1C0E3FDDED205B5D32275E3F7BECF1\",\n        \"n_operation\": 15257\n      },\n      {\n        \"block\": 65986,\n        \"account\": 285630,\n        \"ophash\":\n            \"C2010100BE5B0400B4790100A868312C9C496B59A243853A88AE1FB57F10FD12\",\n        \"n_operation\": 96692\n      },\n      {\n        \"block\": 160219,\n        \"account\": 285630,\n        \"ophash\":\n            \"DB710200BE5B040093932E005A5878DBD5D5DA502FEAC60E4686AEB068B2EEE3\",\n        \"n_operation\": 3052435\n      },\n      {\n        \"block\": 60436,\n        \"account\": 285630,\n        \"ophash\":\n            \"14EC0000BE5B0400568C00001CBB76EE0452B7D7F394AB9ABAE18545F59E1EDD\",\n        \"n_operation\": 35926\n      },\n      {\n        \"block\": 192620,\n        \"account\": 962590,\n        \"ophash\":\n            \"6CF002001EB00E000100000055A952B6F8D3846FE906A3C81C01174EB51D285D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 182223,\n        \"account\": 108004,\n        \"ophash\":\n            \"CFC70200E4A5010005000000F910CB7C86F843477AE30BB1435E2C3CACCAA825\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 285209,\n        \"account\": 760518,\n        \"ophash\":\n            \"195A0400C69A0B0003000000F676409AD52C51B579A0A0A3F05571E1B40C986F\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 142108,\n        \"account\": 571630,\n        \"ophash\":\n            \"1C2B0200EEB80800FE020000B79BAC7485DCE04DA207789E24F0E203D9A4D2DF\",\n        \"n_operation\": 766\n      },\n      {\n        \"block\": 74788,\n        \"account\": 285630,\n        \"ophash\":\n            \"24240100BE5B0400693D0400E7B09877122ABFC1AF0E15B23B5435F53A8272F5\",\n        \"n_operation\": 277865\n      },\n      {\n        \"block\": 61414,\n        \"account\": 290760,\n        \"ophash\":\n            \"E6EF0000C86F04000F2D0000D79AA87310A9AAA0BC48B124B2762A2337BEEB2A\",\n        \"n_operation\": 11535\n      },\n      {\n        \"block\": 97630,\n        \"account\": 285630,\n        \"ophash\":\n            \"5E7D0100BE5B0400D7160B007A50498A5259C3E12A7D28D363451D1E834D95BC\",\n        \"n_operation\": 726743\n      },\n      {\n        \"block\": 111125,\n        \"account\": 285630,\n        \"ophash\":\n            \"15B20100BE5B04007011110054F513E2FD3340625F164B420D02EDF2152B34AD\",\n        \"n_operation\": 1118576\n      },\n      {\n        \"block\": 147689,\n        \"account\": 737900,\n        \"ophash\":\n            \"E94002006C420B00010000008B679215137E561942F85307D323EAC1ABF3DEAA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 269978,\n        \"account\": 486913,\n        \"ophash\":\n            \"9A1E0400016E070008000000DB97F36609F2F7594572BA6F4893B97351D52153\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 127129,\n        \"account\": 635105,\n        \"ophash\":\n            \"99F00100E1B0090001000000291EA616D511D331D33052F79BF5429BF394D911\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 72978,\n        \"account\": 285630,\n        \"ophash\":\n            \"121D0100BE5B0400D4B103007904A0D4A1688623ED6F90D093C56FF99FE85616\",\n        \"n_operation\": 242132\n      },\n      {\n        \"block\": 270708,\n        \"account\": 1352990,\n        \"ophash\":\n            \"742104001EA51400010000009311521B68496FC38F818FEA1585926C0828D1E2\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 135193,\n        \"account\": 285630,\n        \"ophash\":\n            \"19100200BE5B04008ACE200004A62782CB17240963573B0CADF98A12DA45C842\",\n        \"n_operation\": 2150026\n      },\n      {\n        \"block\": 70975,\n        \"account\": 285630,\n        \"ophash\":\n            \"3F150100BE5B04009AFE020038E9EE0011192A780757EBF01223AF3F02E7B5D5\",\n        \"n_operation\": 196250\n      },\n      {\n        \"block\": 78820,\n        \"account\": 285630,\n        \"ophash\":\n            \"E4330100BE5B04008B840500EB31976BBD39522BFBADE4A53F9EB16249D13E7A\",\n        \"n_operation\": 361611\n      },\n      {\n        \"block\": 74357,\n        \"account\": 164080,\n        \"ophash\":\n            \"75220100F0800200A8010000F5678895A31BFE35F9B55104D52302C74C37EB32\",\n        \"n_operation\": 424\n      },\n      {\n        \"block\": 83024,\n        \"account\": 285630,\n        \"ophash\":\n            \"50440100BE5B04002FBD06007830B13DB5E0B3244CAA32910EB26434E08A51DF\",\n        \"n_operation\": 441647\n      },\n      {\n        \"block\": 195775,\n        \"account\": 825070,\n        \"ophash\":\n            \"BFFC0200EE960C0048000000F3724DFE6C38C86AB864C19D294380D06519F3BE\",\n        \"n_operation\": 72\n      },\n      {\n        \"block\": 192640,\n        \"account\": 277924,\n        \"ophash\":\n            \"80F00200A43D040005000000EA24689E5CAAD61985A78551C7963B68ED695D60\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 199528,\n        \"account\": 997090,\n        \"ophash\":\n            \"680B0300E2360F0001000000A3F20E1CD852DC6C5A13B59ACC59080C54442412\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 118128,\n        \"account\": 590120,\n        \"ophash\":\n            \"70CD010028010900010000002E7CD958B815D1C346EA7353BC190927E8BF4FC0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 63818,\n        \"account\": 285630,\n        \"ophash\":\n            \"4AF90000BE5B04005E2A0100FD8B53EC95427D8A140472A3DF0F80969BD26A19\",\n        \"n_operation\": 76382\n      },\n      {\n        \"block\": 175911,\n        \"account\": 879020,\n        \"ophash\":\n            \"27AF0200AC690D00010000006B3012B5398F907C7C0C4F21057C43B9C62594F3\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 62560,\n        \"account\": 285630,\n        \"ophash\":\n            \"60F40000BE5B0400AAF1000049F96C59BE2E0611C611EB3945E213FC1E0C3AD6\",\n        \"n_operation\": 61866\n      },\n      {\n        \"block\": 154255,\n        \"account\": 770745,\n        \"ophash\":\n            \"8F5A0200B9C20B0001000000F6045C22F8BDD3FF69ECD6DF873819A5E5C6B7C0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 141790,\n        \"account\": 708410,\n        \"ophash\":\n            \"DE2902003ACF0A0001000000B7351179FF015A3C23C045BD4DCB249ECE4E3CEA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 129348,\n        \"account\": 285630,\n        \"ophash\":\n            \"44F90100BE5B0400DA3E1D0022B2996A3959FEC1F0EB3A39A76349062650DCF1\",\n        \"n_operation\": 1916634\n      },\n      {\n        \"block\": 186339,\n        \"account\": 931175,\n        \"ophash\":\n            \"E3D7020067350E0001000000BA5F55D3D9F9DC7242F0AED2618F959F47321D57\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 188972,\n        \"account\": 571630,\n        \"ophash\":\n            \"2CE20200EEB80800671700004DB6DE9F3CB9B068D467012BDAEF80B620A93C1C\",\n        \"n_operation\": 5991\n      },\n      {\n        \"block\": 115377,\n        \"account\": 3000,\n        \"ophash\":\n            \"B1C20100B80B00000B000000EED3BDF136A7D2E2622DA5BDF4D2518E2143C4C1\",\n        \"n_operation\": 11\n      },\n      {\n        \"block\": 268965,\n        \"account\": 606554,\n        \"ophash\":\n            \"A51A04005A41090002000000BED47E723749CEC40EBD075E354E12E621F8DEF7\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 88544,\n        \"account\": 285630,\n        \"ophash\":\n            \"E0590100BE5B0400244B0800FA3C3C477EA82F11FC9D0CE2ED348C7277BFCFA6\",\n        \"n_operation\": 543524\n      },\n      {\n        \"block\": 208259,\n        \"account\": 571630,\n        \"ophash\":\n            \"832D0300EEB80800652800009B28B65D634148B65371FCBAFE74122114E79ABD\",\n        \"n_operation\": 10341\n      },\n      {\n        \"block\": 101640,\n        \"account\": 285630,\n        \"ophash\":\n            \"088D0100BE5B0400FD6E0C00C740C9D2E2A54276F11E5DAF54F13C16668B648C\",\n        \"n_operation\": 814845\n      },\n      {\n        \"block\": 121985,\n        \"account\": 285630,\n        \"ophash\":\n            \"81DC0100BE5B04007A3C18005AD65BD739082482F86244FC7DC729DC3F516343\",\n        \"n_operation\": 1588346\n      },\n      {\n        \"block\": 173397,\n        \"account\": 866425,\n        \"ophash\":\n            \"55A5020079380D0001000000C5C6739341E83B27F273810B085198D305988B92\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 126565,\n        \"account\": 632295,\n        \"ophash\":\n            \"65EE0100E7A50900010000007C027B6643F3C6B0BFF291C2AD1CDF55519CDF60\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 154868,\n        \"account\": 288887,\n        \"ophash\":\n            \"F45C0200776804000100000026646F5B9F93C150724522AECD342C438237D951\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 153458,\n        \"account\": 766735,\n        \"ophash\":\n            \"725702000FB30B0001000000FDCEA3DB20BF980BE39EF77906E5A8A24B8ED114\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 162925,\n        \"account\": 86646,\n        \"ophash\":\n            \"6D7C0200765201006B0B00001D799BD966B1E5FCBE16689AA47EF90D17D6CAA1\",\n        \"n_operation\": 2923\n      },\n      {\n        \"block\": 260980,\n        \"account\": 496961,\n        \"ophash\":\n            \"74FB0300419507000600000091D2A0F5B48313B996537006DB86C216D64C6D8B\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 78311,\n        \"account\": 76623,\n        \"ophash\":\n            \"E73101004F2B010003000000D0FD1F5AB2D073A52264E04484ECDD9CE9F39689\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 143628,\n        \"account\": 280240,\n        \"ophash\":\n            \"0C310200B046040003000000A5C8EA1B98E9DAC9D60FD98A412BD6E555CEF45A\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 258737,\n        \"account\": 332699,\n        \"ophash\":\n            \"B1F203009B130500030000008C2EB0A10FFE8D9889F08DBC381AB8EB6F5DE6C6\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 177174,\n        \"account\": 70666,\n        \"ophash\":\n            \"16B402000A140100830000007EE3FE8F35E90E5617C758DFE04625617E2723D1\",\n        \"n_operation\": 131\n      },\n      {\n        \"block\": 62168,\n        \"account\": 290760,\n        \"ophash\":\n            \"D8F20000C86F04004F3600000164E1B59D5FB4A50EADD29609B0B94FAF623B57\",\n        \"n_operation\": 13903\n      },\n      {\n        \"block\": 222586,\n        \"account\": 571630,\n        \"ophash\":\n            \"7A650300EEB80800DC2B00001DF41A07D42C99D6A2434AB6E9FB33CD09372E17\",\n        \"n_operation\": 11228\n      },\n      {\n        \"block\": 16288,\n        \"account\": 80125,\n        \"ophash\":\n            \"A03F0000FD3801000100000084069278A93E2404F22A0392B108CE72D6AD6959\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 87018,\n        \"account\": 434445,\n        \"ophash\":\n            \"EA5301000DA10600010000004B7785333181F52A375C584BA1C7A1AE21C10DE3\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 105851,\n        \"account\": 285630,\n        \"ophash\":\n            \"7B9D0100BE5B040072400E00328AE38086FF9C72903C0BE1C8F34D55E7CE9D5D\",\n        \"n_operation\": 934002\n      },\n      {\n        \"block\": 63415,\n        \"account\": 290760,\n        \"ophash\":\n            \"B7F70000C86F0400D7420000233A397CA4F1098F31C4B09A911F3F17D102602B\",\n        \"n_operation\": 17111\n      },\n      {\n        \"block\": 61140,\n        \"account\": 290760,\n        \"ophash\":\n            \"D4EE0000C86F0400302A00009E395ADECE28BAD24AEAE35ABE98CF797E50D797\",\n        \"n_operation\": 10800\n      },\n      {\n        \"block\": 176694,\n        \"account\": 187687,\n        \"ophash\":\n            \"36B2020027DD0200070000009D9F27E63C413B9493675F96FB6900C5981ACB49\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 68418,\n        \"account\": 290760,\n        \"ophash\":\n            \"420B0100C86F0400CF6A0000A6BA0802126499CAC22A85DA720F28A9E436B0E5\",\n        \"n_operation\": 27343\n      },\n      {\n        \"block\": 87692,\n        \"account\": 285630,\n        \"ophash\":\n            \"8C560100BE5B0400A012080020ACF23642B3F38EF9C4D8A60474461916BE495B\",\n        \"n_operation\": 529056\n      },\n      {\n        \"block\": 116436,\n        \"account\": 285630,\n        \"ophash\":\n            \"D4C60100BE5B0400E13C140020DCAE36BC9BF08E90293ED2B821B41CCB32B998\",\n        \"n_operation\": 1326305\n      },\n      {\n        \"block\": 67196,\n        \"account\": 8777,\n        \"ophash\":\n            \"7C06010049220000020000008195AF37A669F30B23966F56E1A20338674F7214\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 102062,\n        \"account\": 5700,\n        \"ophash\":\n            \"AE8E0100441600000B00000087B3EE2A8F68AFE2BA6C98A61C5367C83CCBA2C6\",\n        \"n_operation\": 11\n      },\n      {\n        \"block\": 192490,\n        \"account\": 274806,\n        \"ophash\":\n            \"EAEF020076310400080000009892C1D63CA78796E521FC4D52B282EDFA990CA4\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 212443,\n        \"account\": 571630,\n        \"ophash\":\n            \"DB3D0300EEB80800462A000097FABA85B9F4502B59FED76F9B18065CC22BB610\",\n        \"n_operation\": 10822\n      },\n      {\n        \"block\": 154862,\n        \"account\": 110027,\n        \"ophash\":\n            \"EE5C0200CBAD010037000000B17AE42708FADA0F019606032068A6032F176BE2\",\n        \"n_operation\": 55\n      },\n      {\n        \"block\": 281001,\n        \"account\": 1404440,\n        \"ophash\":\n            \"A9490400186E1500010000003B8F699EDDD094F83E96628D9136C3F6981F08A8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 278332,\n        \"account\": 1391145,\n        \"ophash\":\n            \"3C3F0400293A1500010000003B1B6FAF0CFDCBF62C36E5B9314C93FE37450A24\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 139716,\n        \"account\": 698065,\n        \"ophash\":\n            \"C4210200D1A60A0001000000D5B0934C694BAF6F97E9833B840D30D8ED88CE5C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 111983,\n        \"account\": 285630,\n        \"ophash\":\n            \"6FB50100BE5B04009D881100B66EA066E986F62EE4B890533D51CFB3DE19CBC3\",\n        \"n_operation\": 1149085\n      },\n      {\n        \"block\": 282275,\n        \"account\": 819528,\n        \"ophash\":\n            \"A34E040048810C0002000000532805B76DD9A990876DD3A8C45A1F8D2896A746\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 133039,\n        \"account\": 664670,\n        \"ophash\":\n            \"AF0702005E240A0001000000AB1FAFA1642BE7581FBB164E8C07416104430B1F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 270592,\n        \"account\": 571630,\n        \"ophash\":\n            \"00210400EEB808000E330000750597722571AF2B0C09C26660032827C0A76DE2\",\n        \"n_operation\": 13070\n      },\n      {\n        \"block\": 203372,\n        \"account\": 1016345,\n        \"ophash\":\n            \"6C1A030019820F0001000000132923B2846980F8A089A0337ED90FE5C3023F1C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 109270,\n        \"account\": 545825,\n        \"ophash\":\n            \"D6AA01002154080001000000747B2FCE52876440DCB0F66E477CE024C5EDDF66\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 238685,\n        \"account\": 1192890,\n        \"ophash\":\n            \"5DA40300BA331200010000004BFA69C13A1E482D6BDFE6AEEA3DEC37CE2E288F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 66953,\n        \"account\": 319055,\n        \"ophash\":\n            \"890501004FDE040002000000055BBB62952AA382C23A187AD5A7202C1032BDE5\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 268621,\n        \"account\": 498985,\n        \"ophash\":\n            \"4D190400299D070003000000FD96CF14F099E78A522A03E943DB03D5F212EE5E\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 199725,\n        \"account\": 998040,\n        \"ophash\":\n            \"2D0C0300983A0F00010000009EBEA6A74E12AF5993822D61C3A9AD65AE131017\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 272716,\n        \"account\": 499126,\n        \"ophash\":\n            \"4C290400B69D0700030000002BF367AA4D35AD52FD79B05FB8D1D8DD0A48A9B0\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 128157,\n        \"account\": 640255,\n        \"ophash\":\n            \"9DF40100FFC40900010000006FA26FD6D1D52BF73AB2679EAD3504D2B1E26DBB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 193219,\n        \"account\": 965545,\n        \"ophash\":\n            \"C3F20200A9BB0E00010000005834FC26E23903935BA5B8136C38053C90B51EE4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 192498,\n        \"account\": 961975,\n        \"ophash\":\n            \"F2EF0200B7AD0E0001000000C5B26D5018E7166B50B9D647D3EBBA162F043248\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 142377,\n        \"account\": 711345,\n        \"ophash\":\n            \"292C0200B1DA0A00010000005236B65489FBA035B1055F9D69DC929C6D614BBE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 115071,\n        \"account\": 273457,\n        \"ophash\":\n            \"7FC10100312C04000800000003958CB6E7DFB84C8177B6709B85025A66B5BE75\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 100755,\n        \"account\": 285630,\n        \"ophash\":\n            \"93890100BE5B04002C1C0C00AFC67A612F9E5A0743722C1A66DD336695CB991C\",\n        \"n_operation\": 793644\n      },\n      {\n        \"block\": 262472,\n        \"account\": 1311815,\n        \"ophash\":\n            \"480104004704140001000000E920C5A6EA14C6272CF6B7227C2D7C4D74A78E7B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 65583,\n        \"account\": 143351,\n        \"ophash\":\n            \"2F000100F72F0200C2020000E1A120FE8294782A53018C22364C855359F88A6C\",\n        \"n_operation\": 706\n      },\n      {\n        \"block\": 191389,\n        \"account\": 86646,\n        \"ophash\":\n            \"9DEB02007652010084130000BEFA71B5B4F679FD8DEA95DD9A7C6A4E812F4BD4\",\n        \"n_operation\": 4996\n      },\n      {\n        \"block\": 209856,\n        \"account\": 1048755,\n        \"ophash\":\n            \"C0330300B30010000100000052161C6F0532D8967A52DABFDC4135D967745027\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 179459,\n        \"account\": 86646,\n        \"ophash\":\n            \"03BD020076520100E9110000584F21A435190ACC982EF4AEF5CFCBC3D64A65BD\",\n        \"n_operation\": 4585\n      },\n      {\n        \"block\": 94882,\n        \"account\": 285630,\n        \"ophash\":\n            \"A2720100BE5B04000F360A001BA089283D45FC711FB95F745E07E7947F5CEC63\",\n        \"n_operation\": 669199\n      },\n      {\n        \"block\": 91212,\n        \"account\": 285630,\n        \"ophash\":\n            \"4C640100BE5B0400E1060900225D77444FA41E3BE05618072F1FE581C2C325EB\",\n        \"n_operation\": 591585\n      },\n      {\n        \"block\": 64008,\n        \"account\": 285630,\n        \"ophash\":\n            \"08FA0000BE5B0400F7310100EC7A451304C18584A764F21AF26C8AAC11E50901\",\n        \"n_operation\": 78327\n      },\n      {\n        \"block\": 224530,\n        \"account\": 381309,\n        \"ophash\":\n            \"126D03007DD1050043000000FAC405D758B00AD17D50D3C00DA3406F45B8AF41\",\n        \"n_operation\": 67\n      },\n      {\n        \"block\": 300641,\n        \"account\": 1502685,\n        \"ophash\":\n            \"61960400DDED16000100000007DEB18409224CDFDB87D6C0ABBC1B6A4D5B743B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 142235,\n        \"account\": 710665,\n        \"ophash\":\n            \"9B2B020009D80A0001000000B0AFBB1C212FE9DFD2685901D1F20E01BD85BDD8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 74887,\n        \"account\": 290760,\n        \"ophash\":\n            \"87240100C86F040090850000BCCDA654BC4FEDF51B4A092262C2E86720008884\",\n        \"n_operation\": 34192\n      },\n      {\n        \"block\": 168152,\n        \"account\": 126651,\n        \"ophash\":\n            \"D8900200BBEE0100070000008E0AC8AA36B3A5813D100390E0DD2C0DA1123E7A\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 130854,\n        \"account\": 86646,\n        \"ophash\":\n            \"26FF0100765201004E0700002A84EFA0509C52B51CEA202429C052DFFC02938D\",\n        \"n_operation\": 1870\n      },\n      {\n        \"block\": 106139,\n        \"account\": 285630,\n        \"ophash\":\n            \"9B9E0100BE5B040089680E005CE5E82B05DBF7EDD4FDA5FD81A413D3A6178465\",\n        \"n_operation\": 944265\n      },\n      {\n        \"block\": 96537,\n        \"account\": 89007,\n        \"ophash\":\n            \"19790100AF5B010014000000BDE0DCA8F813BF5CFE789A1A7183EF4E3D7D7934\",\n        \"n_operation\": 20\n      },\n      {\n        \"block\": 281586,\n        \"account\": 1407400,\n        \"ophash\":\n            \"F24B0400A8791500010000001CF8FF65A6AFE7178CE9FD88D121D2F1DD458069\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 184240,\n        \"account\": 920670,\n        \"ophash\":\n            \"B0CF02005E0C0E0001000000D5734C8DF8E624FCE463B23A3FE9ACEEA556A7CA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 98683,\n        \"account\": 285630,\n        \"ophash\":\n            \"7B810100BE5B0400BD760B006A9BFB5B4F7653551C09DA91CD92AA25BCEDD93D\",\n        \"n_operation\": 751293\n      },\n      {\n        \"block\": 53656,\n        \"account\": 266030,\n        \"ophash\":\n            \"98D100002E0F040001000000932C2A8CD9E8B262EA2D8689EC153A5E97D16DEE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 207520,\n        \"account\": 1037045,\n        \"ophash\":\n            \"A02A0300F5D20F00010000002238E5068DCE2DE5EBEAF0CE3F7AB71A07F7CC38\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 18362,\n        \"account\": 91200,\n        \"ophash\":\n            \"BA470000406401000100000088BA572EBB52A21AC173340DD7C57FE5025CE2A3\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 144684,\n        \"account\": 285630,\n        \"ophash\":\n            \"2C350200BE5B0400F96B2600B4C55F31BF2B6B23738D659A4F630B3D6424FCE8\",\n        \"n_operation\": 2518009\n      },\n      {\n        \"block\": 201046,\n        \"account\": 1004700,\n        \"ophash\":\n            \"561103009C540F000100000082FB2172B4704DD12C05C1F8074B235B7128F132\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 87388,\n        \"account\": 436320,\n        \"ophash\":\n            \"5C55010060A8060001000000EEE2226358311846A794DFF3478D6B06E7BC3DAD\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 242880,\n        \"account\": 1213840,\n        \"ophash\":\n            \"C0B4030090851200010000004D9970D1C9D3E6C2559D042DD069F08DEC7F999D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 96598,\n        \"account\": 285630,\n        \"ophash\":\n            \"56790100BE5B04009BBC0A000D033E80E36C8430977078C2CC5FA5F146538651\",\n        \"n_operation\": 703643\n      },\n      {\n        \"block\": 254900,\n        \"account\": 1273950,\n        \"ophash\":\n            \"B4E303005E70130001000000061020BA3DB9050659AB719EFF4A0B85FE7D5FA7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 114649,\n        \"account\": 572700,\n        \"ophash\":\n            \"D9BF01001CBD080001000000FE26085E50BFC27208A7FD6A2A5BB943111E6313\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 146469,\n        \"account\": 731830,\n        \"ophash\":\n            \"253C0200B62A0B000100000029F0CFC44AAD76DE0BC8077476D1BAD668E6AEC4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 273753,\n        \"account\": 1368220,\n        \"ophash\":\n            \"592D04009CE0140001000000B14A040D25442A5493DE14AB4A9117ED7D7AF2FC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 159573,\n        \"account\": 797340,\n        \"ophash\":\n            \"556F02009C2A0C000100000054DDF024B531F71C7F694E62A5290D2998854569\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 116746,\n        \"account\": 583210,\n        \"ophash\":\n            \"0AC801002AE6080001000000C50B62E84A64E8EE0B4B3AC72D589F1B1DCF9D2C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 252962,\n        \"account\": 1264265,\n        \"ophash\":\n            \"22DC0300894A13000100000091900DA53DDD120E293861C628452142D7197056\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 143633,\n        \"account\": 273374,\n        \"ophash\":\n            \"11310200DE2B040005000000F5848050FAB5557E4C69E92939D712B4386A4D7C\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 96054,\n        \"account\": 285630,\n        \"ophash\":\n            \"36770100BE5B0400B0990A00A48B953E9BFBF28B2CBC92CCDFB9334A38FCB806\",\n        \"n_operation\": 694704\n      },\n      {\n        \"block\": 108636,\n        \"account\": 285630,\n        \"ophash\":\n            \"5CA80100BE5B04006AAE0F00C8C83D301BD2BD709EF663CB7C2B5434253047FA\",\n        \"n_operation\": 1027690\n      },\n      {\n        \"block\": 191259,\n        \"account\": 353958,\n        \"ophash\":\n            \"1BEB0200A666050005000000B04BCDC560A1D335E6674FD3966107FDDCC096A7\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 84274,\n        \"account\": 420805,\n        \"ophash\":\n            \"32490100C56B0600010000004CA17997436AB7943D7A91AACACE4CAD3422FBA6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 66264,\n        \"account\": 330800,\n        \"ophash\":\n            \"D8020100300C0500010000005A2A830E3ECE531282B5523417DF0791810F9386\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 161129,\n        \"account\": 285630,\n        \"ophash\":\n            \"69750200BE5B040005222F000E4C2F29B3BA06DEB710242474499C06661F069C\",\n        \"n_operation\": 3088901\n      },\n      {\n        \"block\": 167653,\n        \"account\": 285630,\n        \"ophash\":\n            \"E58E0200BE5B0400ADBA3200703DF4F140DFB40A1F7233018FA60FF2340B7C10\",\n        \"n_operation\": 3324589\n      },\n      {\n        \"block\": 248791,\n        \"account\": 1243410,\n        \"ophash\":\n            \"D7CB030012F91200010000007F72374C11D166C8A8DDF3EF7960489BF310B973\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 176927,\n        \"account\": 86646,\n        \"ophash\":\n            \"1FB30200765201005E110000D9EB6B29D13ABCBA3A58581FC0C0D83581763852\",\n        \"n_operation\": 4446\n      },\n      {\n        \"block\": 35167,\n        \"account\": 171705,\n        \"ophash\":\n            \"5F890000B99E020001000000D48B7B0CD8C2ECFB19826E05BB1534280FB96A56\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 214507,\n        \"account\": 285630,\n        \"ophash\":\n            \"EB450300BE5B0400972C4700802EB477F4B9CBAB99FAC0F3468CDC6BC3F0207B\",\n        \"n_operation\": 4664471\n      },\n      {\n        \"block\": 166256,\n        \"account\": 86646,\n        \"ophash\":\n            \"7089020076520100160D000094ADA73BAF4C3EFE0FEF79F109727374FC830252\",\n        \"n_operation\": 3350\n      },\n      {\n        \"block\": 279837,\n        \"account\": 571630,\n        \"ophash\":\n            \"1D450400EEB80800C433000031B0011C8F6A9B9AC7ECB325AAE5B0C3F5613A0D\",\n        \"n_operation\": 13252\n      },\n      {\n        \"block\": 59194,\n        \"account\": 285630,\n        \"ophash\":\n            \"3AE70000BE5B0400E6520000C44551ABBE8C26AC05091E2C5AA15384092DCFC4\",\n        \"n_operation\": 21222\n      },\n      {\n        \"block\": 58144,\n        \"account\": 285630,\n        \"ophash\":\n            \"20E30000BE5B04000B260000AD91A5390E2CCF6CCAD06D7BFCE5B712A44FA7A9\",\n        \"n_operation\": 9739\n      },\n      {\n        \"block\": 26078,\n        \"account\": 127190,\n        \"ophash\":\n            \"DE650000D6F0010001000000C4F2818096834B832692D7F97983F7EC5E8C9D82\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 171250,\n        \"account\": 285630,\n        \"ophash\":\n            \"F29C0200BE5B0400E1AE340017663710C7B766A373DE9123DE9EFF7E791F4B09\",\n        \"n_operation\": 3452641\n      },\n      {\n        \"block\": 299487,\n        \"account\": 646070,\n        \"ophash\":\n            \"DF910400B6DB09000D000000256C2B6576FEBC1DA3D2F2061542C7F662C1DF90\",\n        \"n_operation\": 13\n      },\n      {\n        \"block\": 63819,\n        \"account\": 285630,\n        \"ophash\":\n            \"4BF90000BE5B0400622A010075896B6495E7BD67C01B034F5348D5F471CCD6EB\",\n        \"n_operation\": 76386\n      },\n      {\n        \"block\": 81425,\n        \"account\": 285630,\n        \"ophash\":\n            \"113E0100BE5B040056500600D97DDCF8926055FA732ED56CC994ED55745A22B2\",\n        \"n_operation\": 413782\n      },\n      {\n        \"block\": 241388,\n        \"account\": 1206405,\n        \"ophash\":\n            \"ECAE03008568120001000000176DF43B372231B14E9E51E4BBE9E6C43D49B6E7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 184690,\n        \"account\": 548246,\n        \"ophash\":\n            \"72D10200965D080002000000F142231D2C48997802804C59CCDDB41D9CD8F380\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 166748,\n        \"account\": 833180,\n        \"ophash\":\n            \"5C8B02009CB60C0001000000324D269A0A960FCFBAFA3FC320764F4E725A6058\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 279267,\n        \"account\": 1395820,\n        \"ophash\":\n            \"E34204006C4C15000100000013EA80DF4CAE91FA9DB01DA1B0E725CE3C263862\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 82196,\n        \"account\": 143351,\n        \"ophash\":\n            \"14410100F72F02006A03000024A514DD3B662E9E143DA1CE2FB8925A2FF4818C\",\n        \"n_operation\": 874\n      },\n      {\n        \"block\": 175149,\n        \"account\": 523548,\n        \"ophash\":\n            \"2DAC02001CFD070002000000FC73953AFFD16E22867BA8094C2A9DB79DC6D470\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 182400,\n        \"account\": 911465,\n        \"ophash\":\n            \"80C8020069E80D0001000000C513A518C594719979DF6C0E7FB9D272F14D4014\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 109706,\n        \"account\": 285630,\n        \"ophash\":\n            \"8AAC0100BE5B0400CD4410005A70FFE489B5DD0547DBDF3286A8B4E55FAFF4E9\",\n        \"n_operation\": 1066189\n      },\n      {\n        \"block\": 199336,\n        \"account\": 996095,\n        \"ophash\":\n            \"A80A0300FF320F00010000003FAA7CBFEE3A395F4834AEB64AFAD4773FF821CD\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 135797,\n        \"account\": 678465,\n        \"ophash\":\n            \"75120200415A0A00010000003DB061394EC0C53F46BF808077E1DE478AC5E3DF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 63304,\n        \"account\": 285630,\n        \"ophash\":\n            \"48F70000BE5B04007A16010051553F93D91971580DF55E2C49F157B6335EFE04\",\n        \"n_operation\": 71290\n      },\n      {\n        \"block\": 110677,\n        \"account\": 285630,\n        \"ophash\":\n            \"55B00100BE5B04005AD01000F9A9D20F828BACC6C49975B4D5B419D04F357682\",\n        \"n_operation\": 1101914\n      },\n      {\n        \"block\": 56660,\n        \"account\": 282565,\n        \"ophash\":\n            \"54DD0000C54F0400010000004CCEF4C4092648DFF54C8149D7FEFFAB37965E2B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 232091,\n        \"account\": 300124,\n        \"ophash\":\n            \"9B8A03005C9404007331000074A47850FD4E4343D0C692149C62A2C27EBC57C5\",\n        \"n_operation\": 12659\n      },\n      {\n        \"block\": 56175,\n        \"account\": 54280,\n        \"ophash\":\n            \"6FDB000008D400000100000038D155D5E4B317A70D6E8453A9B5ACE095697459\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 285148,\n        \"account\": 1425130,\n        \"ophash\":\n            \"DC590400EABE1500010000002C4ABCC66A354E37F83A0E4B1984203CCC3E679F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 171664,\n        \"account\": 857805,\n        \"ophash\":\n            \"909E0200CD160D000100000060F4D7C990C1CE84BF689E37E108018569A08D12\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 100931,\n        \"account\": 285630,\n        \"ophash\":\n            \"438A0100BE5B0400562F0C000172CD9AE0F2149A5DC81404EE1A39A23FCCDBE4\",\n        \"n_operation\": 798550\n      },\n      {\n        \"block\": 208792,\n        \"account\": 1043440,\n        \"ophash\":\n            \"982F0300F0EB0F0001000000570B39A1F4C59C34A372F0E7D69B6EA1D6905E51\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 42969,\n        \"account\": 205555,\n        \"ophash\":\n            \"D9A70000F322030002000000F5A5C55D4D0C104A71B42CEFB877D117D33FE961\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 61021,\n        \"account\": 285630,\n        \"ophash\":\n            \"5DEE0000BE5B04006FA80000CADF26B5B364C284CD5BCD71786DB920681020C8\",\n        \"n_operation\": 43119\n      },\n      {\n        \"block\": 218392,\n        \"account\": 1091445,\n        \"ophash\":\n            \"1855030075A71000010000006C5071F700911F397FF35AA1BCEE11333D99AAC7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 277861,\n        \"account\": 285630,\n        \"ophash\":\n            \"653D0400BE5B0400CA0E4E00DB77778147D80F1EC2F01CF24FA44BE5DD8F3BAE\",\n        \"n_operation\": 5115594\n      },\n      {\n        \"block\": 107268,\n        \"account\": 285630,\n        \"ophash\":\n            \"04A30100BE5B04002EF50E0032A48674A762B134F319B19148F0072FC9CDB78B\",\n        \"n_operation\": 980270\n      },\n      {\n        \"block\": 191620,\n        \"account\": 957575,\n        \"ophash\":\n            \"84EC0200879C0E00010000003200769C0EC4BA046A75B41A41F10E4E0B64BE12\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 131444,\n        \"account\": 285630,\n        \"ophash\":\n            \"74010200BE5B040083791E00EA4245B88C9415366EBE59081CDC1D00F8FE638D\",\n        \"n_operation\": 1997187\n      },\n      {\n        \"block\": 89425,\n        \"account\": 285630,\n        \"ophash\":\n            \"515D0100BE5B04002086080085E041562E7DBBAEFF3A420E7BDF41E0418C08B8\",\n        \"n_operation\": 558624\n      },\n      {\n        \"block\": 7025,\n        \"account\": 16295,\n        \"ophash\":\n            \"711B0000A73F000001000000AA5E9D9C17729B7DAB5136497ED9FE0E8F36746E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 160031,\n        \"account\": 799625,\n        \"ophash\":\n            \"1F71020089330C0001000000DA592B4BFC10385BB96F62D9C705E118A483C43B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 137699,\n        \"account\": 285630,\n        \"ophash\":\n            \"E3190200BE5B0400C86D22004EAD104BA309389806C500AD0D930E232E537903\",\n        \"n_operation\": 2256328\n      },\n      {\n        \"block\": 250695,\n        \"account\": 1252925,\n        \"ophash\":\n            \"47D303003D1E130001000000E5FE1B395AF54C91AC1A28C8E11380D0D325B1ED\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 132558,\n        \"account\": 662270,\n        \"ophash\":\n            \"CE050200FE1A0A0001000000B303CD1039E7B38CBEB1A918FD58E5D3403AA8B5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 59717,\n        \"account\": 290760,\n        \"ophash\":\n            \"45E90000C86F04009B19000018A592ECD4DCE9CC4535E2493A9BF85CF51134C1\",\n        \"n_operation\": 6555\n      },\n      {\n        \"block\": 12532,\n        \"account\": 61020,\n        \"ophash\":\n            \"F43000005CEE000001000000EE63CA195262F699006EEDB2A744A59130B1876B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 300361,\n        \"account\": 1501275,\n        \"ophash\":\n            \"499504005BE8160001000000B1200433AA038FB1E83545DC8A1B17492FBAD196\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 228322,\n        \"account\": 1141055,\n        \"ophash\":\n            \"E27B03003F6911000100000098589A424012FC72E333A2F2E5F6BA7D39A22F89\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 92316,\n        \"account\": 285630,\n        \"ophash\":\n            \"9C680100BE5B04000A520900EFB5AA170F16CC10E9331F6B8F3691419526C4FE\",\n        \"n_operation\": 610826\n      },\n      {\n        \"block\": 69833,\n        \"account\": 285630,\n        \"ophash\":\n            \"C9100100BE5B0400EC990200C3363791247BFB0C7B64CDDB02CB4B6D19B77A5D\",\n        \"n_operation\": 170476\n      },\n      {\n        \"block\": 182100,\n        \"account\": 571630,\n        \"ophash\":\n            \"54C70200EEB80800B8120000AA1FB338DB758A398FBD8B9E530A5C75C60A9642\",\n        \"n_operation\": 4792\n      },\n      {\n        \"block\": 119781,\n        \"account\": 285630,\n        \"ophash\":\n            \"E5D30100BE5B0400ECB31600092B0C0DC80C987C3287F52922F588D13B06D524\",\n        \"n_operation\": 1487852\n      },\n      {\n        \"block\": 59197,\n        \"account\": 285630,\n        \"ophash\":\n            \"3DE70000BE5B04002B5300005E442F705D46FCDCF1C6DA0B3AB89893A6C267EA\",\n        \"n_operation\": 21291\n      },\n      {\n        \"block\": 268256,\n        \"account\": 1340715,\n        \"ophash\":\n            \"E01704002B7514000100000003DF8C5971A7C3DBDB8194AE1F1937E7FEB05AE2\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 119588,\n        \"account\": 285630,\n        \"ophash\":\n            \"24D30100BE5B04001F90160001A4ADC7979B8B11798EC72302FB8992AC8278E2\",\n        \"n_operation\": 1478687\n      },\n      {\n        \"block\": 275256,\n        \"account\": 483701,\n        \"ophash\":\n            \"38330400756107000B000000A2C9952B9A725622F66C6AD26001CAECD20ADEF2\",\n        \"n_operation\": 11\n      },\n      {\n        \"block\": 295846,\n        \"account\": 1478690,\n        \"ophash\":\n            \"A68304002290160001000000B8845A89C5FFE01B8BC806F47980B24C84E3EBFF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 88143,\n        \"account\": 285630,\n        \"ophash\":\n            \"4F580100BE5B0400203008001E41B1A7E08341B645BE3A7DB3EC1A04D1633673\",\n        \"n_operation\": 536608\n      },\n      {\n        \"block\": 116187,\n        \"account\": 70774,\n        \"ophash\":\n            \"DBC501007614010004000000E939F3E20045A38113F8040614E26AE1E388A0DA\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 147338,\n        \"account\": 285630,\n        \"ophash\":\n            \"8A3F0200BE5B0400431828009DC33A5111FAFCE9C63FB30971BDF1F2A442E9C6\",\n        \"n_operation\": 2627651\n      },\n      {\n        \"block\": 264506,\n        \"account\": 285630,\n        \"ophash\":\n            \"3A090400BE5B04004BAA4C003B6ACCC60739BF8915B84267155B84000512C74C\",\n        \"n_operation\": 5024331\n      },\n      {\n        \"block\": 89496,\n        \"account\": 285630,\n        \"ophash\":\n            \"985D0100BE5B0400A88908006C4FDCC30B28CDD0F8A3CB0D1FC9D69C20734E10\",\n        \"n_operation\": 559528\n      },\n      {\n        \"block\": 237753,\n        \"account\": 1188235,\n        \"ophash\":\n            \"B9A003008B21120001000000CCD3F800977A406F629206ED16929C476B5A8C42\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 168770,\n        \"account\": 843315,\n        \"ophash\":\n            \"4293020033DE0C0001000000D9A909CB5CF75BFBE718BE7896092FE924459192\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 88317,\n        \"account\": 285630,\n        \"ophash\":\n            \"FD580100BE5B0400D73A0800731C05374C05BD6D07748DFE4A71777E8272E112\",\n        \"n_operation\": 539351\n      },\n      {\n        \"block\": 197918,\n        \"account\": 938265,\n        \"ophash\":\n            \"1E05030019510E002A000000C3F3B87DF88A68EB72590EE76A3D828C4DA9529D\",\n        \"n_operation\": 42\n      },\n      {\n        \"block\": 65299,\n        \"account\": 290760,\n        \"ophash\":\n            \"13FF0000C86F04003B540000B68A5CD3955E1FC16887F85B6D0B5FA9257441BF\",\n        \"n_operation\": 21563\n      },\n      {\n        \"block\": 144301,\n        \"account\": 285630,\n        \"ophash\":\n            \"AD330200BE5B0400AC2E2600A9B21C7E856520B1627CA1E59712C3463771741F\",\n        \"n_operation\": 2502316\n      },\n      {\n        \"block\": 163042,\n        \"account\": 457633,\n        \"ophash\":\n            \"E27C0200A1FB060007000000CBEBB1D39BE47B65ABAE8CABCC9C24D9F7D1A167\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 159340,\n        \"account\": 212687,\n        \"ophash\":\n            \"6C6E0200CF3E0300030000006065F903E3714367BEAA33E101A2C2131CFB3419\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 297766,\n        \"account\": 1487745,\n        \"ophash\":\n            \"268B040081B3160001000000B5181A3AD8D7FC8EF903ED1787CF180722DECEE8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 159991,\n        \"account\": 799420,\n        \"ophash\":\n            \"F7700200BC320C0001000000DBE293BE0A6A5D66CB264214E9BA0A32FF6B21A0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 252144,\n        \"account\": 1260170,\n        \"ophash\":\n            \"F0D803008A3A130001000000290437E01599FCACF44246F044D6D3AD4260C226\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 49666,\n        \"account\": 247820,\n        \"ophash\":\n            \"02C200000CC8030001000000D0C66F0FFF7CAA838906EC000717B422B8EDACB2\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 155963,\n        \"account\": 86646,\n        \"ophash\":\n            \"3B6102007652010087090000C97E5287D7CF0E2E14906A63BE47DEB775238848\",\n        \"n_operation\": 2439\n      },\n      {\n        \"block\": 107024,\n        \"account\": 534555,\n        \"ophash\":\n            \"10A201001B28080001000000CF960DB1DCBFA35BBF5D110021C28250AA6836A2\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 69514,\n        \"account\": 285630,\n        \"ophash\":\n            \"8A0F0100BE5B0400E27A0200E9252F5BF86CDCC2F964BA55A58A1D32C3DB1903\",\n        \"n_operation\": 162530\n      },\n      {\n        \"block\": 64962,\n        \"account\": 290760,\n        \"ophash\":\n            \"C2FD0000C86F0400D2500000612E12A6BCB1811C20B1E2B3178EBEE45F5D9089\",\n        \"n_operation\": 20690\n      },\n      {\n        \"block\": 110834,\n        \"account\": 285630,\n        \"ophash\":\n            \"F2B00100BE5B040063E61000D9E0F40F4804DBB8113BADDBADA5F4734BC2DFD4\",\n        \"n_operation\": 1107555\n      },\n      {\n        \"block\": 134370,\n        \"account\": 671300,\n        \"ophash\":\n            \"E20C0200443E0A0001000000BE4E144FA1514BC947F8406B80A59F6E923D106D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 205790,\n        \"account\": 1028395,\n        \"ophash\":\n            \"DE2303002BB10F000100000070E21C5BE29651683A199D95C76948BD7C291002\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 70526,\n        \"account\": 285630,\n        \"ophash\":\n            \"7E130100BE5B040043D3020009F831B6224C4B9FA7786C8139987E6D575BD4E7\",\n        \"n_operation\": 185155\n      },\n      {\n        \"block\": 86270,\n        \"account\": 297299,\n        \"ophash\":\n            \"FE5001005389040043000000486E48648677C5CCD614A190E42C7E00653EE643\",\n        \"n_operation\": 67\n      },\n      {\n        \"block\": 97555,\n        \"account\": 285630,\n        \"ophash\":\n            \"137D0100BE5B0400EF0F0B00224A0A1EC53FA14DE5D99EF72D05650A4EFC60BD\",\n        \"n_operation\": 724975\n      },\n      {\n        \"block\": 189604,\n        \"account\": 318107,\n        \"ophash\":\n            \"A4E402009BDA04000300000079D23235E1C6C9AEC384C1A18D9878767834D9B7\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 62520,\n        \"account\": 290760,\n        \"ophash\":\n            \"38F40000C86F0400763A0000A7C0692153ACD74ABBF1E05B47B09F5215A10564\",\n        \"n_operation\": 14966\n      },\n      {\n        \"block\": 261135,\n        \"account\": 571630,\n        \"ophash\":\n            \"0FFC0300EEB80800513200009197579C27AE1C3B39021D8DFAA289E3A5C7F5A4\",\n        \"n_operation\": 12881\n      },\n      {\n        \"block\": 128593,\n        \"account\": 578210,\n        \"ophash\":\n            \"51F60100A2D2080052000000C301F09A894ADADD542D34B73D0CE61DFB4132E4\",\n        \"n_operation\": 82\n      },\n      {\n        \"block\": 206477,\n        \"account\": 1031810,\n        \"ophash\":\n            \"8D26030082BE0F00010000007F55D6FD6ABC4442C74D09678837D715FFA26A2B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 94284,\n        \"account\": 470855,\n        \"ophash\":\n            \"4C700100472F0700010000009B5239CC500603CD0C99A9CCC37AC990874FF602\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 152347,\n        \"account\": 285630,\n        \"ophash\":\n            \"1B530200BE5B0400948F2A00E9593F079298E422302235AC8A461E3344BAD0F2\",\n        \"n_operation\": 2789268\n      },\n      {\n        \"block\": 50201,\n        \"account\": 248440,\n        \"ophash\":\n            \"19C4000078CA0300010000002E38F96D9561879E6B1151D69CF430A122F4D875\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 192157,\n        \"account\": 472756,\n        \"ophash\":\n            \"9DEE0200B43607000900000084C3A39A121540ADBF8B489DEB0964D59F629811\",\n        \"n_operation\": 9\n      },\n      {\n        \"block\": 179477,\n        \"account\": 571630,\n        \"ophash\":\n            \"15BD0200EEB808001311000087254B22148BB741D877F0016CEB9A18AADDDFBF\",\n        \"n_operation\": 4371\n      },\n      {\n        \"block\": 154672,\n        \"account\": 771725,\n        \"ophash\":\n            \"305C02008DC60B0001000000D3BC67E41A2F9B9F7C1EC63438F9DCEB7B8F410C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 65032,\n        \"account\": 285630,\n        \"ophash\":\n            \"08FE0000BE5B040037550100723CC655A898F4F92D989052AC2A513AAC45E9AE\",\n        \"n_operation\": 87351\n      },\n      {\n        \"block\": 91006,\n        \"account\": 285630,\n        \"ophash\":\n            \"7E630100BE5B0400DBF7080084A33E582DC1A195365B4A71021EF36A0BFED18A\",\n        \"n_operation\": 587739\n      },\n      {\n        \"block\": 116194,\n        \"account\": 285630,\n        \"ophash\":\n            \"E2C50100BE5B0400810B1400EA6C29DF1F9228F934FBB5F45780D15F1502CA41\",\n        \"n_operation\": 1313665\n      },\n      {\n        \"block\": 228663,\n        \"account\": 546929,\n        \"ophash\":\n            \"377D03007158080002000000A59958FC58040A575B466E39F7A14288B146848C\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 267909,\n        \"account\": 1320421,\n        \"ophash\":\n            \"85160400E5251400030000001AEA6931AF59BAD86C44BA32AD1572D95AF23E9F\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 239604,\n        \"account\": 1197495,\n        \"ophash\":\n            \"F4A70300B745120001000000AC4B2B944EF28E1FD3DE0302487CFF1A7636F4A7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 265475,\n        \"account\": 7392,\n        \"ophash\":\n            \"030D0400E01C000001000000F857D53720A011CE7D4A57C7AF5EF3DF4E12A806\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 94908,\n        \"account\": 473950,\n        \"ophash\":\n            \"BC7201005E3B070001000000CDA178235153D2E1866E252EF4BAD9E43287D43D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 295227,\n        \"account\": 1475610,\n        \"ophash\":\n            \"3B8104001A84160001000000BDC24EF12DC7673637DC6E8AD59DE093687F6053\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 176134,\n        \"account\": 285630,\n        \"ophash\":\n            \"06B00200BE5B0400679C3700BA0BCFB7588CEBB49603F01CF7DD52EDCE829953\",\n        \"n_operation\": 3644519\n      },\n      {\n        \"block\": 159607,\n        \"account\": 797460,\n        \"ophash\":\n            \"776F0200142B0C000100000013A6A9EC6091A512E4C2C5C05033B16F86A93D1C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 185340,\n        \"account\": 926135,\n        \"ophash\":\n            \"FCD30200B7210E000100000042C2A7A0FE0F6C3C27E49735E83D5AB5B24A656C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 163329,\n        \"account\": 285630,\n        \"ophash\":\n            \"017E0200BE5B0400D2753000B3727717A58DF9E79FE366DEA5CA649B3F8CCF31\",\n        \"n_operation\": 3175890\n      },\n      {\n        \"block\": 98630,\n        \"account\": 285630,\n        \"ophash\":\n            \"46810100BE5B040016720B00D987CC04AA6C1A8530B836D4063F8E63500DF50C\",\n        \"n_operation\": 750102\n      },\n      {\n        \"block\": 205457,\n        \"account\": 1026735,\n        \"ophash\":\n            \"91220300AFAA0F0001000000BDB4470963FFAB86091D060519DF97377BCD365E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 116182,\n        \"account\": 285630,\n        \"ophash\":\n            \"D6C50100BE5B0400690814002E490DB838CAD4ACC3955F00E5E6FE6C8087FAB0\",\n        \"n_operation\": 1312873\n      },\n      {\n        \"block\": 163021,\n        \"account\": 814580,\n        \"ophash\":\n            \"CD7C0200F46D0C00010000009284512CED659B3F51E43D5E7B115F44FFB47C6B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 163880,\n        \"account\": 818850,\n        \"ophash\":\n            \"28800200A27E0C00010000001065306434DF1B00C31B40E5504D5C78DD5EF75B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 154370,\n        \"account\": 86646,\n        \"ophash\":\n            \"025B020076520100310900001E063016FF437F1AF900AE21CBC7ED73D6A76639\",\n        \"n_operation\": 2353\n      },\n      {\n        \"block\": 164852,\n        \"account\": 285630,\n        \"ophash\":\n            \"F4830200BE5B0400C7333100B92376BC9DC10571660C5C6FD743E20FFE60C3AE\",\n        \"n_operation\": 3224519\n      },\n      {\n        \"block\": 92903,\n        \"account\": 463930,\n        \"ophash\":\n            \"E76A01003A140700010000001AAD9B96070AC1D5D23E5C3140BE5C102897F753\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 61408,\n        \"account\": 285630,\n        \"ophash\":\n            \"E0EF0000BE5B040070BB0000BDA87567EA0E4E3C84E634CED6DA7ED5F57F35EA\",\n        \"n_operation\": 47984\n      },\n      {\n        \"block\": 149583,\n        \"account\": 285630,\n        \"ophash\":\n            \"4F480200BE5B040064412900F63B430304A4CAC7F32ABB158C4657408C94A2B4\",\n        \"n_operation\": 2703716\n      },\n      {\n        \"block\": 197244,\n        \"account\": 571630,\n        \"ophash\":\n            \"7C020300EEB808005A1E000090938ED64CDF6D9FB3A9B9BFA1E3041A8296BFEB\",\n        \"n_operation\": 7770\n      },\n      {\n        \"block\": 168244,\n        \"account\": 571630,\n        \"ophash\":\n            \"34910200EEB80800E60B00008FD44358EDBF4E750DEBF00CE3757D925A926BB5\",\n        \"n_operation\": 3046\n      },\n      {\n        \"block\": 127913,\n        \"account\": 578210,\n        \"ophash\":\n            \"A9F30100A2D208004700000099D1726DC51C41122364913F05C9557A5E9387C5\",\n        \"n_operation\": 71\n      },\n      {\n        \"block\": 102490,\n        \"account\": 285630,\n        \"ophash\":\n            \"5A900100BE5B04008CBA0C0080832BA660D35DAA07F9A17BDA611FCB0D6093B9\",\n        \"n_operation\": 834188\n      },\n      {\n        \"block\": 67565,\n        \"account\": 285630,\n        \"ophash\":\n            \"ED070100BE5B04009AD10100868662E4DDD3662E12CBDBB88A425D08CAEF288C\",\n        \"n_operation\": 119194\n      },\n      {\n        \"block\": 92013,\n        \"account\": 89846,\n        \"ophash\":\n            \"6D670100F65E010001000000B26E49E35C5DE824B2C25E11A7A97B7DC4C370C6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 72700,\n        \"account\": 285630,\n        \"ophash\":\n            \"FC1B0100BE5B0400B09E03006215E2FE7E85C66072712FB6CEA252325F1D9E2C\",\n        \"n_operation\": 237232\n      },\n      {\n        \"block\": 112236,\n        \"account\": 285630,\n        \"ophash\":\n            \"6CB60100BE5B0400CFA71100F03E23CE320C70D5D1B896A36612F6672827A5B6\",\n        \"n_operation\": 1157071\n      },\n      {\n        \"block\": 63842,\n        \"account\": 290760,\n        \"ophash\":\n            \"62F90000C86F0400484600005DC3E97D64D5E94236E37E5C256C9F7D346ABCEC\",\n        \"n_operation\": 17992\n      },\n      {\n        \"block\": 108833,\n        \"account\": 309655,\n        \"ophash\":\n            \"21A9010097B9040003000000832F6D8B98B470C2815385C0204C19D1493E4289\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 56428,\n        \"account\": 185097,\n        \"ophash\":\n            \"6CDC000009D3020004000000E1A28CF520A3353393E99B4F64D0F301BFB2781F\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 126627,\n        \"account\": 285630,\n        \"ophash\":\n            \"A3EE0100BE5B04000E6C1B00350402B06FFEBFAC08A90107161FF23DDD55B0CD\",\n        \"n_operation\": 1797134\n      },\n      {\n        \"block\": 281328,\n        \"account\": 71707,\n        \"ophash\":\n            \"F04A04001B1801001A00000093BFEA33BF4330D30FBA1A27DED7A22BA492D1E3\",\n        \"n_operation\": 26\n      },\n      {\n        \"block\": 233179,\n        \"account\": 1165360,\n        \"ophash\":\n            \"DB8E030030C8110001000000AAA410BF5CB38188C6CFD3598E0E8B7A7DAD661A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 263651,\n        \"account\": 499016,\n        \"ophash\":\n            \"E3050400489D070006000000BDECA36BC113DA1CB3B279C13ADC6B53C6BC9EAD\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 197326,\n        \"account\": 67050,\n        \"ophash\":\n            \"CE020300EA0501005E01000088E5F0620921D6A735922AE125A83EF5F241204B\",\n        \"n_operation\": 350\n      },\n      {\n        \"block\": 138016,\n        \"account\": 689555,\n        \"ophash\":\n            \"201B020093850A0001000000C6EE7D2559CCFC7011370CA974DD7136A1D9F324\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 155398,\n        \"account\": 86646,\n        \"ophash\":\n            \"065F020076520100660900002E0A2F9BCC6940F7D39DFE2736E5E7F72DE2B33C\",\n        \"n_operation\": 2406\n      },\n      {\n        \"block\": 263982,\n        \"account\": 1317355,\n        \"ophash\":\n            \"2E070400EB1914000100000051E696095A43277D76B49E9C2E59E43D146F465B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 79367,\n        \"account\": 396275,\n        \"ophash\":\n            \"07360100F30B060001000000D7ABF325E29B2FC32D41242DB993EFCA6995F4F1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 114796,\n        \"account\": 573450,\n        \"ophash\":\n            \"6CC001000AC0080001000000561461B4B298B227956E8BDCB3483E5ECB02AB86\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 234256,\n        \"account\": 571630,\n        \"ophash\":\n            \"10930300EEB80800112E000064F4A6A734D122E686C3C544E4FC2F0D59B9784C\",\n        \"n_operation\": 11793\n      },\n      {\n        \"block\": 95546,\n        \"account\": 285630,\n        \"ophash\":\n            \"3A750100BE5B0400176F0A0091D95FBC910AECF652417B8B9312540FE9F5EB59\",\n        \"n_operation\": 683799\n      },\n      {\n        \"block\": 204327,\n        \"account\": 1021110,\n        \"ophash\":\n            \"271E0300B6940F00010000000EB0E6D33101A92D62616772FA7D94DD65A6E126\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 121480,\n        \"account\": 606875,\n        \"ophash\":\n            \"88DA01009B420900010000008440E94A63EE6DA806F1A96749F45D95BAC9C6B0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 276432,\n        \"account\": 1381625,\n        \"ophash\":\n            \"D0370400F91415000100000078A65DB47117A558C72097ED5D886AE5D1200D99\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231847,\n        \"account\": 86646,\n        \"ophash\":\n            \"A78903007652010069160000524F93B8F669FB7DDE1A6F226AA7FE29427E8601\",\n        \"n_operation\": 5737\n      },\n      {\n        \"block\": 224532,\n        \"account\": 1122115,\n        \"ophash\":\n            \"146D0300431F1100010000000D81AB49CBF8317CC85985151E693D228C57668F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 62583,\n        \"account\": 290760,\n        \"ophash\":\n            \"77F40000C86F04002F3B000049826B2D0F92083D6EB9E8DBF686FC8211E9BF5D\",\n        \"n_operation\": 15151\n      },\n      {\n        \"block\": 221164,\n        \"account\": 571630,\n        \"ophash\":\n            \"EC5F0300EEB80800312B0000F1E35F1EA9C068C6BBE5E0533251EB25D22F55F3\",\n        \"n_operation\": 11057\n      },\n      {\n        \"block\": 56125,\n        \"account\": 279195,\n        \"ophash\":\n            \"3DDB00009B4204000100000086FB38FE7C6CDE50B184D969B99244E80B5A1421\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 283716,\n        \"account\": 1418040,\n        \"ophash\":\n            \"4454040038A3150001000000B7C9FCA42B0A0F04C3C91A3593B54F15217A6321\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 113898,\n        \"account\": 285630,\n        \"ophash\":\n            \"EABC0100BE5B04004CA612002E5DFFE6D0797AFE5059E4C9FBA78DA5C3BCB89C\",\n        \"n_operation\": 1222220\n      },\n      {\n        \"block\": 129599,\n        \"account\": 647465,\n        \"ophash\":\n            \"3FFA010029E109000100000033A361367CC466C27D2A6286EE91CFCA02B93CDE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 75734,\n        \"account\": 285630,\n        \"ophash\":\n            \"D6270100BE5B0400EB8D04009497D874F3A22BD540A953DDBAA3C03C772B44FA\",\n        \"n_operation\": 298475\n      },\n      {\n        \"block\": 225746,\n        \"account\": 1128190,\n        \"ophash\":\n            \"D2710300FE36110001000000550296F81333B16FCCC5AA2565D1083B38585EB1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 243342,\n        \"account\": 1216145,\n        \"ophash\":\n            \"8EB60300918E120001000000B4379D33E16E4A46D4876C9479F192C4ED064582\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231112,\n        \"account\": 1155015,\n        \"ophash\":\n            \"C8860300C79F110001000000F0EFF94163165E934B5BB9A914DE13182DD7FABC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 91589,\n        \"account\": 285630,\n        \"ophash\":\n            \"C5650100BE5B0400C22109007AFD9051858145A83863242C559A360CFF19B704\",\n        \"n_operation\": 598466\n      },\n      {\n        \"block\": 62600,\n        \"account\": 290760,\n        \"ophash\":\n            \"88F40000C86F0400473B000011A477907C27F5FA69F93AF4095EBF4DDA659E70\",\n        \"n_operation\": 15175\n      },\n      {\n        \"block\": 290251,\n        \"account\": 1450725,\n        \"ophash\":\n            \"CB6D0400E5221600010000009ED9B2DDF853C939E66A5AAC2A0EC6E037A00DDB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 162641,\n        \"account\": 812685,\n        \"ophash\":\n            \"517B02008D660C00010000005FD3C7E557DD1B0F56CCF799FA0139578378ABD5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 170175,\n        \"account\": 86646,\n        \"ophash\":\n            \"BF98020076520100580F0000087F22C3AAFC7F954F248883CE556BC72FC5A162\",\n        \"n_operation\": 3928\n      },\n      {\n        \"block\": 72331,\n        \"account\": 168537,\n        \"ophash\":\n            \"8B1A010059920200F1000000F0034C8E42439074C11BE0BCA0CAD7FB24381185\",\n        \"n_operation\": 241\n      },\n      {\n        \"block\": 153078,\n        \"account\": 764865,\n        \"ophash\":\n            \"F6550200C1AB0B00010000005F7D5B05F6AA061913050374AFFC825A03EF0C9D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 62256,\n        \"account\": 290760,\n        \"ophash\":\n            \"30F30000C86F04007D3700008C76CB1B0DD5D3EF850F911942B0D7E6975FD1AE\",\n        \"n_operation\": 14205\n      },\n      {\n        \"block\": 263860,\n        \"account\": 285630,\n        \"ophash\":\n            \"B4060400BE5B040075834C004F4B1D7144F262DA2BA35F7CBF7BB462A7999BD8\",\n        \"n_operation\": 5014389\n      },\n      {\n        \"block\": 242385,\n        \"account\": 571630,\n        \"ophash\":\n            \"D1B20300EEB808004D2F0000DD8285C4B743104D51EA9CB7D77E3C7608D432DE\",\n        \"n_operation\": 12109\n      },\n      {\n        \"block\": 227724,\n        \"account\": 300124,\n        \"ophash\":\n            \"8C7903005C9404005F310000F8FBC319D0CBEE46F69FC02DBF8FA4DDFC6DC8F9\",\n        \"n_operation\": 12639\n      },\n      {\n        \"block\": 94833,\n        \"account\": 473575,\n        \"ophash\":\n            \"71720100E739070001000000AABDF06B4AA9CD0649B26860EB033077E13D0E10\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 76568,\n        \"account\": 285630,\n        \"ophash\":\n            \"182B0100BE5B0400A5D60400A467F1B92D619101904828AF64D7A3482AC422D3\",\n        \"n_operation\": 317093\n      },\n      {\n        \"block\": 98123,\n        \"account\": 489995,\n        \"ophash\":\n            \"4B7F01000B7A070001000000E922A662DDF599F6D3E958374D32A1CC890695AD\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 266154,\n        \"account\": 547523,\n        \"ophash\":\n            \"AA0F0400C35A08002B0000005436E5A75F67E342DA0440A549A593184C168A60\",\n        \"n_operation\": 43\n      },\n      {\n        \"block\": 199907,\n        \"account\": 999005,\n        \"ophash\":\n            \"E30C03005D3E0F0001000000C2582E93519F4F66008236F3B42C9FE489A624EC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 101660,\n        \"account\": 285630,\n        \"ophash\":\n            \"1C8D0100BE5B0400D3700C00B810A8C3362E6BD47990D7827268E598D2C44EA2\",\n        \"n_operation\": 815315\n      },\n      {\n        \"block\": 107444,\n        \"account\": 285630,\n        \"ophash\":\n            \"B4A30100BE5B0400140E0F00A90A70939676AB789C95E4B0B96334D77E7C6094\",\n        \"n_operation\": 986644\n      },\n      {\n        \"block\": 114770,\n        \"account\": 285630,\n        \"ophash\":\n            \"52C00100BE5B040061E21200E5EDA6A775FC5D63FB910F2805F8C4501AAFD302\",\n        \"n_operation\": 1237601\n      },\n      {\n        \"block\": 115478,\n        \"account\": 576875,\n        \"ophash\":\n            \"16C301006BCD080001000000FF13E97255F7EA3FDF4A3ECB91118BA07453C31C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 277354,\n        \"account\": 285630,\n        \"ophash\":\n            \"6A3B0400BE5B0400DC054E00305C764D6B9FD5265CBF8EE0D530FEA6691D4CA3\",\n        \"n_operation\": 5113308\n      },\n      {\n        \"block\": 189885,\n        \"account\": 948880,\n        \"ophash\":\n            \"BDE50200907A0E00010000000E9049747619AE445E71F17E47D4C2522C5BD11B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 195398,\n        \"account\": 976450,\n        \"ophash\":\n            \"46FB020042E60E00010000008CED964A2B60934ED7C4F7DADE55EC70EEAEB714\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 96669,\n        \"account\": 285630,\n        \"ophash\":\n            \"9D790100BE5B0400EDC10A00DB9C7C0F4778F3F89E56055435EDCD4AD43262AC\",\n        \"n_operation\": 705005\n      },\n      {\n        \"block\": 96102,\n        \"account\": 479840,\n        \"ophash\":\n            \"66770100605207000100000002761D06AC30715D7DA563E44B9CB86B403438AC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 67166,\n        \"account\": 86646,\n        \"ophash\":\n            \"5E0601007652010005010000E90F6CD0EEF809A1697C4AAFAAA7F16731BC9523\",\n        \"n_operation\": 261\n      },\n      {\n        \"block\": 149050,\n        \"account\": 744725,\n        \"ophash\":\n            \"3A460200155D0B00010000005C1FF3478ABD91A3E2D8BACD6FA0216AD5C2A373\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 221184,\n        \"account\": 1105365,\n        \"ophash\":\n            \"00600300D5DD1000010000006D8261676DC86BA08063CBF48D9F73E5F1D42157\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 84644,\n        \"account\": 285630,\n        \"ophash\":\n            \"A44A0100BE5B0400FE3407003734BC6CFE37BF0654C54006389D7DEA0275C8B1\",\n        \"n_operation\": 472318\n      },\n      {\n        \"block\": 214369,\n        \"account\": 1071315,\n        \"ophash\":\n            \"61450300D358100001000000607613B22207D94684FA266A7265E453600EAF39\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 263872,\n        \"account\": 112800,\n        \"ophash\":\n            \"C0060400A0B801003B280000DA7359A7BAE3DA4989091ACFA2B2FBEB69D4A197\",\n        \"n_operation\": 10299\n      },\n      {\n        \"block\": 218026,\n        \"account\": 571630,\n        \"ophash\":\n            \"AA530300EEB80800F02A00006F57F332B92ABB48AC4D10541F67460C7FCC56B8\",\n        \"n_operation\": 10992\n      },\n      {\n        \"block\": 218372,\n        \"account\": 1091340,\n        \"ophash\":\n            \"045503000CA7100001000000B5EF7823A26DC2D5D52D11ACC04A8724E3DE5A74\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 149825,\n        \"account\": 748595,\n        \"ophash\":\n            \"41490200336C0B00010000003027D8DB576B3353245FDC8B4AAE9FE1C9F539DA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 139167,\n        \"account\": 695290,\n        \"ophash\":\n            \"9F1F0200FA9B0A00010000002D1DD2D1A8ACEDDD9DACBE30211C21B5975D9D9C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 282235,\n        \"account\": 285630,\n        \"ophash\":\n            \"7B4E0400BE5B0400235B4E0083B08A25E16721A98D84355F1B8736BDEBBF067F\",\n        \"n_operation\": 5135139\n      },\n      {\n        \"block\": 222412,\n        \"account\": 546194,\n        \"ophash\":\n            \"CC64030092550800040000003115A39A5B4644E4BE62AB29B81B545C92E78219\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 257700,\n        \"account\": 1287970,\n        \"ophash\":\n            \"A4EE030022A7130001000000491876A47BCE43F6CA872CB05B8693FD739E5FC4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 196343,\n        \"account\": 571630,\n        \"ophash\":\n            \"F7FE0200EEB80800741D00001A36BF7B5F135DDD191E71468018350F63E53C8C\",\n        \"n_operation\": 7540\n      },\n      {\n        \"block\": 184032,\n        \"account\": 86646,\n        \"ophash\":\n            \"E0CE02007652010099120000A1268F8CD79065D0E10636CC1B2E21117D8F6258\",\n        \"n_operation\": 4761\n      },\n      {\n        \"block\": 227068,\n        \"account\": 1134780,\n        \"ophash\":\n            \"FC760300BC5011000100000075503526DDF8EB8A6B22C086D7A5EC604A3DAFEB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 284439,\n        \"account\": 473232,\n        \"ophash\":\n            \"17570400903807000200000017101A73BA408C79C915FED32DEDFBF95415E557\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 70442,\n        \"account\": 285630,\n        \"ophash\":\n            \"2A130100BE5B040077CB0200A582018F506FF3EBAE3E98BB40AEDC8544F1EF65\",\n        \"n_operation\": 183159\n      },\n      {\n        \"block\": 63469,\n        \"account\": 160435,\n        \"ophash\":\n            \"EDF70000B372020002000000AFA04464713E97E2903105CA0349602CB5940220\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 28139,\n        \"account\": 50001,\n        \"ophash\":\n            \"EB6D000051C3000001000000D5DEBFB7FF40A3BA8B5089EA1FB53CCD5E2A0FDF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 191507,\n        \"account\": 957020,\n        \"ophash\":\n            \"13EC02005C9A0E00010000000EB42E4161F386D9110BDC8566E0D138274E56BC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 211254,\n        \"account\": 566847,\n        \"ophash\":\n            \"363903003FA608000600000024399D9822F02038E594161750115F5CC36E2562\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 70318,\n        \"account\": 290760,\n        \"ophash\":\n            \"AE120100C86F04008073000052D4400A2A64DE35ABC09B0111688260ACE4014D\",\n        \"n_operation\": 29568\n      },\n      {\n        \"block\": 133467,\n        \"account\": 666810,\n        \"ophash\":\n            \"5B090200BA2C0A000100000080B6362F883A83B130D09D667F07B6E0FC3CF6ED\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 158337,\n        \"account\": 791170,\n        \"ophash\":\n            \"816A020082120C000100000069E60889277ACDB9C82803341D3148B3DE69F460\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 21526,\n        \"account\": 106725,\n        \"ophash\":\n            \"16540000E5A00100020000006A5FCF4C3EAEA5262DF491ABBF43F2C6E40656A4\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 124128,\n        \"account\": 285630,\n        \"ophash\":\n            \"E0E40100BE5B040037B41900807460DCBB7545F345A484A3DC0AD823C489C227\",\n        \"n_operation\": 1684535\n      },\n      {\n        \"block\": 63396,\n        \"account\": 285630,\n        \"ophash\":\n            \"A4F70000BE5B0400641B010000D60319FDCF10E4CB051592A6093DED13C5D503\",\n        \"n_operation\": 72548\n      },\n      {\n        \"block\": 38484,\n        \"account\": 188120,\n        \"ophash\":\n            \"54960000D8DE0200010000006B43B91F8F83349F847D3CD8CB114EAD78D19C0F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 96391,\n        \"account\": 86646,\n        \"ophash\":\n            \"8778010076520100C20200009E14530649B0AFD91352FF01A9A47E6024FE67FB\",\n        \"n_operation\": 706\n      },\n      {\n        \"block\": 44457,\n        \"account\": 122520,\n        \"ophash\":\n            \"A9AD000098DE010003000000113BE910DA846B06A99A87A6A313BC272F520A84\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 70983,\n        \"account\": 168539,\n        \"ophash\":\n            \"471501005B920200200000007BCB357D95D4B6BB00E7909BA3B5ADA301F71A19\",\n        \"n_operation\": 32\n      },\n      {\n        \"block\": 62014,\n        \"account\": 290760,\n        \"ophash\":\n            \"3EF20000C86F0400CC330000E7CEF1A1ED74517DFB442CDE4B70620A381B9715\",\n        \"n_operation\": 13260\n      },\n      {\n        \"block\": 204142,\n        \"account\": 1020195,\n        \"ophash\":\n            \"6E1D030023910F0001000000B7425175FD1082E5FBEBB968E6EBF998A641B716\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 192116,\n        \"account\": 582004,\n        \"ophash\":\n            \"74EE020074E10800020000000E4AD4A0A6645819B33ACE153629249D9ADD7253\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 103375,\n        \"account\": 285630,\n        \"ophash\":\n            \"CF930100BE5B0400130A0D00DECCCD5E689707AAC39B1FBF2182438839F694DC\",\n        \"n_operation\": 854547\n      },\n      {\n        \"block\": 90560,\n        \"account\": 296330,\n        \"ophash\":\n            \"C06101008A8504000D0000004319B9D0E86F6D156A6083D8F8F1C5EEC0FECD0F\",\n        \"n_operation\": 13\n      },\n      {\n        \"block\": 88451,\n        \"account\": 285630,\n        \"ophash\":\n            \"83590100BE5B040006440800C8FA00E867719E5D818542C7E3F7945EFC8D40F7\",\n        \"n_operation\": 541702\n      },\n      {\n        \"block\": 129136,\n        \"account\": 285630,\n        \"ophash\":\n            \"70F80100BE5B0400041A1D00926C7DCBCAFC15234DE9DAF2BAC29D4030B17865\",\n        \"n_operation\": 1907204\n      },\n      {\n        \"block\": 102172,\n        \"account\": 285630,\n        \"ophash\":\n            \"1C8F0100BE5B0400AF9D0C00AAA5322EFF2B135D872343CE3CE3AE8BFEDE252A\",\n        \"n_operation\": 826799\n      },\n      {\n        \"block\": 4715,\n        \"account\": 22565,\n        \"ophash\":\n            \"6B1200002558000001000000D611C8913430195FA7D358DA9DCC1CF693B4D8AE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 67631,\n        \"account\": 290760,\n        \"ophash\":\n            \"2F080100C86F0400046500001FC27BD6620BBFB4D95C2C85D368FBB900EB5986\",\n        \"n_operation\": 25860\n      },\n      {\n        \"block\": 193441,\n        \"account\": 571630,\n        \"ophash\":\n            \"A1F30200EEB808000E1B0000F2EC2FBC1EEC72B06699684451B75CE69EAD380B\",\n        \"n_operation\": 6926\n      },\n      {\n        \"block\": 276017,\n        \"account\": 1379530,\n        \"ophash\":\n            \"31360400CA0C1500010000002F413BA60C48F81C1F0B6B3E4FA5B865CBE8F850\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 269593,\n        \"account\": 1347435,\n        \"ophash\":\n            \"191D04006B8F14000100000077440ABA0F3284EBC1A93F044614606C2B6797F5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 252748,\n        \"account\": 1263180,\n        \"ophash\":\n            \"4CDB03004C46130001000000A22A2793C4C9B5603A83F0F7A7B142C88CA57FDE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 73819,\n        \"account\": 168610,\n        \"ophash\":\n            \"5B200100A292020016010000F0ADF4028A4107BAB52B9EA1D3A4DE8134FBC94C\",\n        \"n_operation\": 278\n      },\n      {\n        \"block\": 145148,\n        \"account\": 86646,\n        \"ophash\":\n            \"FC360200765201006708000043553447B286FEBFC88AEA2DB72AE0448A613B4D\",\n        \"n_operation\": 2151\n      },\n      {\n        \"block\": 105811,\n        \"account\": 285630,\n        \"ophash\":\n            \"539D0100BE5B0400F6390E001E9FC886DD7EFF20C1D8F7987732F4CA4634F629\",\n        \"n_operation\": 932342\n      },\n      {\n        \"block\": 82043,\n        \"account\": 285630,\n        \"ophash\":\n            \"7B400100BE5B04001E8506005D7011285E996315A6494FD83E15F57C3992205B\",\n        \"n_operation\": 427294\n      },\n      {\n        \"block\": 145069,\n        \"account\": 285630,\n        \"ophash\":\n            \"AD360200BE5B0400DBCA2600A5F3C213E23AE4BADF8E8AAB334026FC643B075D\",\n        \"n_operation\": 2542299\n      },\n      {\n        \"block\": 133644,\n        \"account\": 285630,\n        \"ophash\":\n            \"0C0A0200BE5B040015E01F0023956D81B71FDB697B93A3A17D9DB33374093657\",\n        \"n_operation\": 2088981\n      },\n      {\n        \"block\": 98911,\n        \"account\": 285630,\n        \"ophash\":\n            \"5F820100BE5B0400058D0B00BC475738C83916139E226FDAB8A6DAD297065445\",\n        \"n_operation\": 756997\n      },\n      {\n        \"block\": 134216,\n        \"account\": 670560,\n        \"ophash\":\n            \"480C0200603B0A000100000055E131DF83F077AD4824543EC07008087F528F98\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 114609,\n        \"account\": 285630,\n        \"ophash\":\n            \"B1BF0100BE5B0400BFBE120036CFDF39BE75659E358AF1994F8A76B8FF2558CB\",\n        \"n_operation\": 1228479\n      },\n      {\n        \"block\": 249844,\n        \"account\": 1248660,\n        \"ophash\":\n            \"F4CF0300940D130001000000D4F17CEA90152E33B376E67DDDA5D3D5FD339DC4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 97888,\n        \"account\": 86646,\n        \"ophash\":\n            \"607E010076520100DF020000EFFCABAD5705F7D0E177FAAEAD1B783CB2FC668B\",\n        \"n_operation\": 735\n      },\n      {\n        \"block\": 196472,\n        \"account\": 571630,\n        \"ophash\":\n            \"78FF0200EEB80800951D0000C3ADD86C8BFE47D592CD2F091CF4AC1E0BAF0B5A\",\n        \"n_operation\": 7573\n      },\n      {\n        \"block\": 102366,\n        \"account\": 285630,\n        \"ophash\":\n            \"DE8F0100BE5B040089B00C002D240A62C802397A9E8A29BE57473C1F2C025D3F\",\n        \"n_operation\": 831625\n      },\n      {\n        \"block\": 139485,\n        \"account\": 696890,\n        \"ophash\":\n            \"DD2002003AA20A0001000000A945DEEA6995ABAC819387555C886076259AF471\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 117719,\n        \"account\": 588085,\n        \"ophash\":\n            \"D7CB010035F9080001000000A8CFF36119F1135111722019E1AFEAC619FFD708\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 264398,\n        \"account\": 1321445,\n        \"ophash\":\n            \"CE080400E529140001000000240C3F41ABF23BAF63EF7EA81FFDCC991235D636\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 243776,\n        \"account\": 1218330,\n        \"ophash\":\n            \"40B803001A9712000100000046831599044268F7161D28654A94C4F7B15AB405\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 250713,\n        \"account\": 105569,\n        \"ophash\":\n            \"59D30300619C01001C00000020C59C9780389B5CB0D7C5120CD0E200EBE2CBD6\",\n        \"n_operation\": 28\n      },\n      {\n        \"block\": 210274,\n        \"account\": 571630,\n        \"ophash\":\n            \"62350300EEB80800C6290000ADABAFEC2E31FC6131DF4E8B2E6D47D02EB747F4\",\n        \"n_operation\": 10694\n      },\n      {\n        \"block\": 76653,\n        \"account\": 9001,\n        \"ophash\":\n            \"6D2B0100292300000800000042F55CF4771FE3C0C28029F7EEE707547026FBE2\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 91195,\n        \"account\": 285630,\n        \"ophash\":\n            \"3B640100BE5B0400CD0509005FD9DEC03856EED6C7C01291C451D347FA1EBB68\",\n        \"n_operation\": 591309\n      },\n      {\n        \"block\": 300026,\n        \"account\": 483689,\n        \"ophash\":\n            \"FA9304006961070098010000BD1C9A5C6911533981830690E81D26A4BA5D92F1\",\n        \"n_operation\": 408\n      },\n      {\n        \"block\": 129203,\n        \"account\": 48210,\n        \"ophash\":\n            \"B3F8010052BC00000100000099EC1491FAD22A7F29A608DF19E83D0064B1B96B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 198357,\n        \"account\": 86646,\n        \"ophash\":\n            \"D50603007652010037140000C5211E1D130F0117CB1D9A467253579F1563ECD0\",\n        \"n_operation\": 5175\n      },\n      {\n        \"block\": 76456,\n        \"account\": 285630,\n        \"ophash\":\n            \"A82A0100BE5B040011CC0400AC70B24A9889B1A38049428BCF4335CA7B118B7E\",\n        \"n_operation\": 314385\n      },\n      {\n        \"block\": 4484,\n        \"account\": 21540,\n        \"ophash\":\n            \"841100002454000001000000B5898E33AED0D84BB57C8BD5844D7A3F0F4AFFD8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 64710,\n        \"account\": 290760,\n        \"ophash\":\n            \"C6FC0000C86F0400964E0000F9336CEC5AA500D4A343DB170F11D9537DA9EABF\",\n        \"n_operation\": 20118\n      },\n      {\n        \"block\": 192550,\n        \"account\": 962215,\n        \"ophash\":\n            \"26F00200A7AE0E00010000001DCB510074E146A4B5562CE00ACBF7EE9D1510E4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 7017,\n        \"account\": 12540,\n        \"ophash\":\n            \"691B0000FC300000010000005155F3B2A5D7E27813EE6AF505C7683F6FBBB8CB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 127235,\n        \"account\": 635655,\n        \"ophash\":\n            \"03F1010007B3090001000000BDD05399FFDE66BA9B202CE4C1E997B0F9F7B82D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 143444,\n        \"account\": 291000,\n        \"ophash\":\n            \"54300200B87004005400000014D3164D0CA6A9F4904BB3C0FC0BA61A70662CE3\",\n        \"n_operation\": 84\n      },\n      {\n        \"block\": 159592,\n        \"account\": 285630,\n        \"ophash\":\n            \"686F0200BE5B0400702B2E00A22FFF99429B4694B00B251454AEEE23D02A264F\",\n        \"n_operation\": 3025776\n      },\n      {\n        \"block\": 98984,\n        \"account\": 285630,\n        \"ophash\":\n            \"A8820100BE5B040066930B000D3D119BFF19C45087DF26E7D679E64CB4202D64\",\n        \"n_operation\": 758630\n      },\n      {\n        \"block\": 239387,\n        \"account\": 106975,\n        \"ophash\":\n            \"1BA70300DFA1010006000000B0234671746239D46CA10C6E0EF7EAD1E048A30A\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 90238,\n        \"account\": 285630,\n        \"ophash\":\n            \"7E600100BE5B0400BFBF0800E29B0C8B5866680FFBE6F8C29031FFA8BF8BDEBC\",\n        \"n_operation\": 573375\n      },\n      {\n        \"block\": 66054,\n        \"account\": 290760,\n        \"ophash\":\n            \"06020100C86F0400FB5A0000C3A9CCE5D081DD87646BB16CA0BA692F58C558B7\",\n        \"n_operation\": 23291\n      },\n      {\n        \"block\": 120992,\n        \"account\": 604425,\n        \"ophash\":\n            \"A0D801000939090001000000DEF3964051C78F42C0A9953CE54C03A57F0D27F6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 105817,\n        \"account\": 285630,\n        \"ophash\":\n            \"599D0100BE5B04005A3A0E004E2E8A066A5142A377F80C8699C81851E7023A02\",\n        \"n_operation\": 932442\n      },\n      {\n        \"block\": 44739,\n        \"account\": 220475,\n        \"ophash\":\n            \"C3AE00003B5D0300010000006003F373E9DF71C67C9D15B1D226546183C59F9B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 110779,\n        \"account\": 285630,\n        \"ophash\":\n            \"BBB00100BE5B040017DC1000A403B4806ADE4D790DC89E16902D2F8A873C1DF7\",\n        \"n_operation\": 1104919\n      },\n      {\n        \"block\": 156193,\n        \"account\": 200119,\n        \"ophash\":\n            \"21620200B70D030006000000D6A1124EDA5E4B64C513115762F3A3002BE376E4\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 165231,\n        \"account\": 55065,\n        \"ophash\":\n            \"6F85020019D70000030000006AE1AAE990DBA46C0673CC8E53DE9888B023DF53\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 186362,\n        \"account\": 931290,\n        \"ophash\":\n            \"FAD70200DA350E0001000000549B1A5CED2763EDA588CE3498CBA6BF6266B4D6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 111519,\n        \"account\": 285630,\n        \"ophash\":\n            \"9FB30100BE5B0400FF4A11006411EEAA47DCF324FF2BBA13A40C24A17E83F202\",\n        \"n_operation\": 1133311\n      },\n      {\n        \"block\": 107248,\n        \"account\": 285630,\n        \"ophash\":\n            \"F0A20100BE5B04008BF20E003E39FA92025317F408468564FC196B05A22747FD\",\n        \"n_operation\": 979595\n      },\n      {\n        \"block\": 190669,\n        \"account\": 285630,\n        \"ophash\":\n            \"CDE80200BE5B0400283E3F007E14CFEF28671DF54FA056551F0C5A06BF988B0B\",\n        \"n_operation\": 4144680\n      },\n      {\n        \"block\": 266179,\n        \"account\": 1330335,\n        \"ophash\":\n            \"C30F04009F4C140001000000C10EE494FD3511D44B83AA8F168258BEC764B59F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 90072,\n        \"account\": 285630,\n        \"ophash\":\n            \"D85F0100BE5B0400E5B408006ABA4D7C2FC98BAFF046CE2AEC5FB78928B86572\",\n        \"n_operation\": 570597\n      },\n      {\n        \"block\": 166793,\n        \"account\": 467315,\n        \"ophash\":\n            \"898B0200732107000800000041FE1DB3707F5558747AF981BB41E9C33DCB6AB5\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 124009,\n        \"account\": 588621,\n        \"ophash\":\n            \"69E401004DFB080014000000729C263F977EB1EEB36831C553C016045F36C9B4\",\n        \"n_operation\": 20\n      },\n      {\n        \"block\": 98758,\n        \"account\": 285630,\n        \"ophash\":\n            \"C6810100BE5B0400B97E0B00376795081AE35F90D9D88C7EF1D38716A279F021\",\n        \"n_operation\": 753337\n      },\n      {\n        \"block\": 67682,\n        \"account\": 290760,\n        \"ophash\":\n            \"62080100C86F04006A6500002DE7F08349F9212FB2CB33FAC4EA23141C97C400\",\n        \"n_operation\": 25962\n      },\n      {\n        \"block\": 78957,\n        \"account\": 285630,\n        \"ophash\":\n            \"6D340100BE5B04006E8F0500F927DB8EC5C9B609AFB7B6934004E74DB1320C6D\",\n        \"n_operation\": 364398\n      },\n      {\n        \"block\": 293621,\n        \"account\": 86646,\n        \"ophash\":\n            \"F57A040076520100B618000000D8DE5EFD1480C0F0A2F12EC25D1E90A50D389F\",\n        \"n_operation\": 6326\n      },\n      {\n        \"block\": 73906,\n        \"account\": 285630,\n        \"ophash\":\n            \"B2200100BE5B040085F30300D8BB8B69ADD9DA958AB031717867305CD1F3E55E\",\n        \"n_operation\": 258949\n      },\n      {\n        \"block\": 172908,\n        \"account\": 863995,\n        \"ophash\":\n            \"6CA30200FB2E0D00010000003E9BADF45BE7EE1654EBCC579384A81B78EA9B48\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 256395,\n        \"account\": 1281415,\n        \"ophash\":\n            \"8BE90300878D13000100000060C41189C5D49F5A3F689B62F3C9FB9E8A0C4065\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 102363,\n        \"account\": 290911,\n        \"ophash\":\n            \"DB8F01005F70040042000000710BC898DA4BC985CD8812FE7C7EDEBFB4DDE0F3\",\n        \"n_operation\": 66\n      },\n      {\n        \"block\": 272747,\n        \"account\": 1363215,\n        \"ophash\":\n            \"6B2904000FCD1400010000004A6634A0CF2B3FE948E2B8AA8C0F3EBC1FD53736\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 85499,\n        \"account\": 285630,\n        \"ophash\":\n            \"FB4D0100BE5B0400827C07000B91E9B9CCA038EA2FCFDB701123FE1786496F99\",\n        \"n_operation\": 490626\n      },\n      {\n        \"block\": 121919,\n        \"account\": 285630,\n        \"ophash\":\n            \"3FDC0100BE5B04008E301800B2F25B4DA7C0BD8DD18A63EE7323803EA92E51C3\",\n        \"n_operation\": 1585294\n      },\n      {\n        \"block\": 217324,\n        \"account\": 47805,\n        \"ophash\":\n            \"EC500300BDBA00004F00000000757707E7BCF1B7CA4817BC853D876427285542\",\n        \"n_operation\": 79\n      },\n      {\n        \"block\": 33490,\n        \"account\": 3535,\n        \"ophash\":\n            \"D2820000CF0D000015000000BFC5C63500E5B6A36560059698668DC1582AC6A2\",\n        \"n_operation\": 21\n      },\n      {\n        \"block\": 77657,\n        \"account\": 285630,\n        \"ophash\":\n            \"592F0100BE5B0400B32705000756833F13CE363BD68885EB2A8AB0CF3D787EE7\",\n        \"n_operation\": 337843\n      },\n      {\n        \"block\": 207107,\n        \"account\": 1034980,\n        \"ophash\":\n            \"03290300E4CA0F0001000000EA259C8B21C4A0DB90D6A493C8921DAE15983769\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 107453,\n        \"account\": 160888,\n        \"ophash\":\n            \"BDA3010078740200020000002DC3FD0032F9417AA7DE9FCB8A99E9835F928E31\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 86886,\n        \"account\": 285630,\n        \"ophash\":\n            \"66530100BE5B040083DD0700BB613A4740FE40784703884E992064E461EE33C3\",\n        \"n_operation\": 515459\n      },\n      {\n        \"block\": 105422,\n        \"account\": 86646,\n        \"ophash\":\n            \"CE9B010076520100AB030000C70F3E3DBD570B95517875FA38072D57C608E315\",\n        \"n_operation\": 939\n      },\n      {\n        \"block\": 107625,\n        \"account\": 285630,\n        \"ophash\":\n            \"69A40100BE5B0400DA260F00D4D06609054BB713E3BE2BBFC6473D3A206E6290\",\n        \"n_operation\": 992986\n      },\n      {\n        \"block\": 205804,\n        \"account\": 1028500,\n        \"ophash\":\n            \"EC23030094B10F00010000002AD031EB248B8729FDB261A48CD6A36F5ADB7B37\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 98988,\n        \"account\": 303905,\n        \"ophash\":\n            \"AC82010021A30400030000008A762486C0F0CEEE4584728C4913588526CAF474\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 264243,\n        \"account\": 1309660,\n        \"ophash\":\n            \"33080400DCFB13000300000026C6F94612F5474ECE9378181FB67811356E0072\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 70416,\n        \"account\": 285630,\n        \"ophash\":\n            \"10130100BE5B0400A9C70200DECB8DC0B5E98CBFA909F22428F36D8AD8EF1550\",\n        \"n_operation\": 182185\n      },\n      {\n        \"block\": 263474,\n        \"account\": 1316835,\n        \"ophash\":\n            \"32050400E31714000100000057867A698F1A48257D089B421AD7B8239D88A68F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 186093,\n        \"account\": 929930,\n        \"ophash\":\n            \"EDD602008A300E00010000008FE3299EA49B50B44B6D9631CF506F9E7949BFBF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 69173,\n        \"account\": 285630,\n        \"ophash\":\n            \"350E0100BE5B0400595A0200E7A8136DFB111F7E3F509E2B34CC3A9019EAC0E5\",\n        \"n_operation\": 154201\n      },\n      {\n        \"block\": 227105,\n        \"account\": 571630,\n        \"ophash\":\n            \"21770300EEB80800D32C000055A6920ECDE08A89F57EE7960E6B357C893BDFA9\",\n        \"n_operation\": 11475\n      },\n      {\n        \"block\": 254466,\n        \"account\": 271959,\n        \"ophash\":\n            \"02E2030057260400070000007F48E12A9B29B3EC4528E44BF77F4305220137B5\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 236525,\n        \"account\": 1182110,\n        \"ophash\":\n            \"ED9B03009E091200010000007FD692919D8E5BD4402DFC1506C067BCC6F27205\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 249594,\n        \"account\": 285630,\n        \"ophash\":\n            \"FACE0300BE5B040017FC4A0073E043E9F4EF45B19811EF5C2AFC9538B9E2A7CE\",\n        \"n_operation\": 4914199\n      },\n      {\n        \"block\": 73391,\n        \"account\": 285630,\n        \"ophash\":\n            \"AF1E0100BE5B040007D00300EA1463D03B610C2305AE41695540DFC01BEA41FA\",\n        \"n_operation\": 249863\n      },\n      {\n        \"block\": 205092,\n        \"account\": 571630,\n        \"ophash\":\n            \"24210300EEB80800A0250000DD059305BD3B889D707DB3386C49F3DB52B6CFEA\",\n        \"n_operation\": 9632\n      },\n      {\n        \"block\": 45523,\n        \"account\": 219045,\n        \"ophash\":\n            \"D3B10000A5570300010000001E3DAC4B2B6A4541CF0CA5164B108C1C0F28C138\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 235809,\n        \"account\": 188923,\n        \"ophash\":\n            \"21990300FBE10200270000009956D57FB4913A91F19ACBCAD691FAA39F1FFC0D\",\n        \"n_operation\": 39\n      },\n      {\n        \"block\": 107805,\n        \"account\": 285630,\n        \"ophash\":\n            \"1DA50100BE5B0400D8400F0042D7FD93682C8887DEEE6B1C5E6773516A4D1A37\",\n        \"n_operation\": 999640\n      },\n      {\n        \"block\": 252125,\n        \"account\": 366422,\n        \"ophash\":\n            \"DDD8030056970500050000009B6AC5B177078666A5A62EA2EC7A2DD6AFF1AA08\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 146557,\n        \"account\": 732265,\n        \"ophash\":\n            \"7D3C0200692C0B0001000000496A7756DEFFFFB215BD8C22408E7FE9A7189F8F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 281016,\n        \"account\": 582406,\n        \"ophash\":\n            \"B849040006E30800410000008D4EB81EDC2941686011645E5BAB41CD966E6275\",\n        \"n_operation\": 65\n      },\n      {\n        \"block\": 195577,\n        \"account\": 571630,\n        \"ophash\":\n            \"F9FB0200EEB80800EF1C0000937E764F9E87F80F0C41B43D9A39AFB796A68D52\",\n        \"n_operation\": 7407\n      },\n      {\n        \"block\": 219512,\n        \"account\": 1097020,\n        \"ophash\":\n            \"785903003CBD10000100000009A79D8A753838A5AD35961B9DF5EFD9F61719BB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 65062,\n        \"account\": 285630,\n        \"ophash\":\n            \"26FE0000BE5B0400715501006C7DC8280B5E709CA6B1764CB137A2577CE0E6D3\",\n        \"n_operation\": 87409\n      },\n      {\n        \"block\": 71423,\n        \"account\": 285630,\n        \"ophash\":\n            \"FF160100BE5B0400B52C03004ED4A1D1EC85F30E72DF33D9D83E1897912D951F\",\n        \"n_operation\": 208053\n      },\n      {\n        \"block\": 281441,\n        \"account\": 1406655,\n        \"ophash\":\n            \"614B0400BF761500010000002777A707030D12D7E97C6CFB80359F7A0506685B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 296584,\n        \"account\": 1481985,\n        \"ophash\":\n            \"88860400019D160001000000A6549B2A9CEFD4858E4D9F33E62753FFF7B7A2BF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 61643,\n        \"account\": 307590,\n        \"ophash\":\n            \"CBF0000086B10400010000003D62699D7E0A3F5C003B6B69AE9E34E4E9D6539D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 94629,\n        \"account\": 285630,\n        \"ophash\":\n            \"A5710100BE5B040089200A0074213C34C0AEBC1176315EB6D411481852DEC1C1\",\n        \"n_operation\": 663689\n      },\n      {\n        \"block\": 158988,\n        \"account\": 86646,\n        \"ophash\":\n            \"0C6D020076520100100A00004CF669F1BA5E2169CFF3515E161C58FB2013FCAB\",\n        \"n_operation\": 2576\n      },\n      {\n        \"block\": 89305,\n        \"account\": 285630,\n        \"ophash\":\n            \"D95C0100BE5B0400B6800800949AF117E34C6B332B682BC95B5C2ED281D7715A\",\n        \"n_operation\": 557238\n      },\n      {\n        \"block\": 139351,\n        \"account\": 696240,\n        \"ophash\":\n            \"57200200B09F0A00010000005F4134F3EBCAF3B73989653DC2B87161F21B97CA\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 58445,\n        \"account\": 285630,\n        \"ophash\":\n            \"4DE40000BE5B04006F3500007863CC72F0CEB1409CC80EC6887E92207C410947\",\n        \"n_operation\": 13679\n      },\n      {\n        \"block\": 268103,\n        \"account\": 629030,\n        \"ophash\":\n            \"4717040026990900270000001698A996DF51A1BAC86306CAB793ECAE86A2EEE3\",\n        \"n_operation\": 39\n      },\n      {\n        \"block\": 123039,\n        \"account\": 614650,\n        \"ophash\":\n            \"9FE00100FA6009000100000022A0CBD4A904C612A1221A39DF24C0B8CBBEF5DF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 298048,\n        \"account\": 1303940,\n        \"ophash\":\n            \"408C040084E5130001000000D0ADE437213AB5AD924D8ED65DC2FF0DA272C987\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 72404,\n        \"account\": 282867,\n        \"ophash\":\n            \"D41A0100F3500400140000007CB177FFEE08ABA2EB620F06E11A9B6E6DB64E57\",\n        \"n_operation\": 20\n      },\n      {\n        \"block\": 117008,\n        \"account\": 584515,\n        \"ophash\":\n            \"10C9010043EB08000100000076433D989745D724786333DABA6C5613BC0B9924\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 146029,\n        \"account\": 332823,\n        \"ophash\":\n            \"6D3A0200171405005800000084DF70E3BF3F382DF78C9AFFCE9331866CB7AE71\",\n        \"n_operation\": 88\n      },\n      {\n        \"block\": 136638,\n        \"account\": 682670,\n        \"ophash\":\n            \"BE150200AE6A0A0001000000E827EBDC580F1B0F2BE8B69862985500CBFE0C8D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231694,\n        \"account\": 545034,\n        \"ophash\":\n            \"0E8903000A51080004000000A0ABE9E03FF31DAEA6479C6167B4E272F12C48E9\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 122001,\n        \"account\": 609480,\n        \"ophash\":\n            \"91DC0100C84C0900010000005B9A2E76CCE0ECD75EA1E433BEBCA0E2B6BC2A6F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 55151,\n        \"account\": 273775,\n        \"ophash\":\n            \"6FD700006F2D040001000000069AF1B76BE2A6B788F55E41E271BB5B6C07E2FB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 235071,\n        \"account\": 1174825,\n        \"ophash\":\n            \"3F96030029ED110001000000F462FFC1D6145E125FF6AAD8E0BB2C9E9EA7EA52\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 175346,\n        \"account\": 876185,\n        \"ophash\":\n            \"F2AC0200995E0D000100000050424E9060CC62C72D682FB3A13A979AE0AF3E2D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 99320,\n        \"account\": 285630,\n        \"ophash\":\n            \"F8830100BE5B04007AB20B007CFF89EE5A55906F0F73CB51C765B31128756FB1\",\n        \"n_operation\": 766586\n      },\n      {\n        \"block\": 245202,\n        \"account\": 1225460,\n        \"ophash\":\n            \"D2BD0300F4B21200010000005C186120E9F13B6E235881BA3C653777EA011148\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 123195,\n        \"account\": 285630,\n        \"ophash\":\n            \"3BE10100BE5B0400D315190061C7431FCF474EBF9BCF85F6E104A646E64C8049\",\n        \"n_operation\": 1643987\n      },\n      {\n        \"block\": 300632,\n        \"account\": 1076799,\n        \"ophash\":\n            \"589604003F6E1000070000002E5ACABA459FE87E05BE2AD065D5DEF933A8054A\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 155338,\n        \"account\": 200119,\n        \"ophash\":\n            \"CA5E0200B70D03000400000093AE9001B3A9EE9A69175B1162B6A2D1C8C57CAF\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 104892,\n        \"account\": 523900,\n        \"ophash\":\n            \"BC9901007CFE07000100000049B72B9C12A0E701734CB99F20FF6F0F3FCEEEA9\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 74516,\n        \"account\": 164122,\n        \"ophash\":\n            \"142301001A810200A2010000433FED94C3970462D04C2B41B285864BB043416D\",\n        \"n_operation\": 418\n      },\n      {\n        \"block\": 25396,\n        \"account\": 124860,\n        \"ophash\":\n            \"34630000BCE7010001000000646D9F2A7B20CF98367574DA74DF562EE0D64A42\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 58106,\n        \"account\": 285630,\n        \"ophash\":\n            \"FAE20000BE5B0400C224000093A366F9ED1F9ACBBE1C6575864438B5C8DB03A8\",\n        \"n_operation\": 9410\n      },\n      {\n        \"block\": 154283,\n        \"account\": 285630,\n        \"ophash\":\n            \"AB5A0200BE5B0400D47B2B0045A9D7393FC87CE6063E1A2FF9F60D85FEE8EF0D\",\n        \"n_operation\": 2849748\n      },\n      {\n        \"block\": 70283,\n        \"account\": 285630,\n        \"ophash\":\n            \"8B120100BE5B040030BD02004132B0B9E343E72557078413FBBC30BE96B62F12\",\n        \"n_operation\": 179504\n      },\n      {\n        \"block\": 70719,\n        \"account\": 285630,\n        \"ophash\":\n            \"3F140100BE5B040091E40200327BC04AD58984CD9A8B33543DDA4049528C6291\",\n        \"n_operation\": 189585\n      },\n      {\n        \"block\": 119675,\n        \"account\": 597820,\n        \"ophash\":\n            \"7BD301003C1F0900010000005C98278683759B303FE7D9B53C6A2053E362F195\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 188078,\n        \"account\": 350506,\n        \"ophash\":\n            \"AEDE02002A5905002C050000A66E993E1A37F8CFC71CC94192C203B5F49CF9AE\",\n        \"n_operation\": 1324\n      },\n      {\n        \"block\": 172242,\n        \"account\": 86646,\n        \"ophash\":\n            \"D2A0020076520100FC0F000045DA6E5DC61D399723E80CD3E886853FC29CE757\",\n        \"n_operation\": 4092\n      },\n      {\n        \"block\": 202277,\n        \"account\": 1010840,\n        \"ophash\":\n            \"25160300986C0F0001000000A34DDD49316C6627B40EDC29C123517225823CD5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 60505,\n        \"account\": 290760,\n        \"ophash\":\n            \"59EC0000C86F0400EA24000010031678053F223002513D3E4CEC1F55FB5396B4\",\n        \"n_operation\": 9450\n      },\n      {\n        \"block\": 271417,\n        \"account\": 1356555,\n        \"ophash\":\n            \"392404000BB31400010000007265AFE4A7B9D8B4B55D7124D182121BC9198484\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 175549,\n        \"account\": 877230,\n        \"ophash\":\n            \"BDAD0200AE620D000100000083B5FDAEF2B6DEEE777D9094DE2E54D5CCEC1680\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 157678,\n        \"account\": 787860,\n        \"ophash\":\n            \"EE67020094050C000100000044CA9B2B15F45C00B527772629219D0C4DE1C7BB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 266384,\n        \"account\": 285630,\n        \"ophash\":\n            \"90100400BE5B04004F064D00F053B2AD8E2166012285A0901D740CAB79D1F1CD\",\n        \"n_operation\": 5047887\n      },\n      {\n        \"block\": 137856,\n        \"account\": 285630,\n        \"ophash\":\n            \"801A0200BE5B0400A888220037019E7BBF3640008CFF8D1DCF69EF1006431518\",\n        \"n_operation\": 2263208\n      },\n      {\n        \"block\": 136625,\n        \"account\": 682585,\n        \"ophash\":\n            \"B1150200596A0A00010000004FE2E4F6FDBDE61352F49D9F991B27168AB69AF1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 63969,\n        \"account\": 290760,\n        \"ophash\":\n            \"E1F90000C86F0400B1470000A80BDD2CEB1DC7917F13F369409035C8CF950CAC\",\n        \"n_operation\": 18353\n      },\n      {\n        \"block\": 94915,\n        \"account\": 285630,\n        \"ophash\":\n            \"C3720100BE5B040025380A006BAEAC35E0305700DC880800A293DCEAF636AB50\",\n        \"n_operation\": 669733\n      },\n      {\n        \"block\": 297004,\n        \"account\": 1484475,\n        \"ophash\":\n            \"2C880400BBA6160001000000B79A7B94D82226A117399FBA07DE45460F715218\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 254564,\n        \"account\": 285630,\n        \"ophash\":\n            \"64E20300BE5B0400C35F4B004E3EE134C8E8E7105280F1CFAC52F8EEF7D4FFAA\",\n        \"n_operation\": 4939715\n      },\n      {\n        \"block\": 169764,\n        \"account\": 848290,\n        \"ophash\":\n            \"24970200A2F10C000100000035C25B89A11229D0BF411077FB5C91450B37382D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 15146,\n        \"account\": 73005,\n        \"ophash\":\n            \"2A3B00002D1D01000100000059E952FEEA140BE34CB2C54BBFD1FAC86B0A2ACB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 168794,\n        \"account\": 3570,\n        \"ophash\":\n            \"5A930200F20D0000250000006EEE8A381E26E25FD12679E950562873435E7342\",\n        \"n_operation\": 37\n      },\n      {\n        \"block\": 120517,\n        \"account\": 285630,\n        \"ophash\":\n            \"C5D60100BE5B0400B9391700A18EEC9F013BA64039F1B80BB4510C4540566A2A\",\n        \"n_operation\": 1522105\n      },\n      {\n        \"block\": 78077,\n        \"account\": 285630,\n        \"ophash\":\n            \"FD300100BE5B0400A14705002054A43E07063D80CBC2E4DF833E9EE49569AC73\",\n        \"n_operation\": 346017\n      },\n      {\n        \"block\": 162396,\n        \"account\": 811445,\n        \"ophash\":\n            \"5C7A0200B5610C0001000000AFEEB09F9DE079D36857D5308101D4F9FA47B945\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 61336,\n        \"account\": 290760,\n        \"ophash\":\n            \"98EF0000C86F0400502C0000B93D6567A83E4307E6E21D9CA591DC4EF584E1B1\",\n        \"n_operation\": 11344\n      },\n      {\n        \"block\": 130474,\n        \"account\": 86646,\n        \"ophash\":\n            \"AAFD01007652010042070000F452FF6CFE01B927E69371E058086A1C9A56B4D8\",\n        \"n_operation\": 1858\n      },\n      {\n        \"block\": 199067,\n        \"account\": 571630,\n        \"ophash\":\n            \"9B090300EEB8080029200000E5D954B7E82F86305EE4887DD68002CCB4E8C178\",\n        \"n_operation\": 8233\n      },\n      {\n        \"block\": 120758,\n        \"account\": 86646,\n        \"ophash\":\n            \"B6D7010076520100000600006B0B8128FA653C416F3076F797D2993D980072A8\",\n        \"n_operation\": 1536\n      },\n      {\n        \"block\": 275591,\n        \"account\": 285630,\n        \"ophash\":\n            \"87340400BE5B040054E74D00E4B2092A355C42E246FEECB1E6D495CAC622B585\",\n        \"n_operation\": 5105492\n      },\n      {\n        \"block\": 259212,\n        \"account\": 195655,\n        \"ophash\":\n            \"8CF4030047FC02000E000000D07CCDD94A4A923BC15917E589AEA9C6E5232774\",\n        \"n_operation\": 14\n      },\n      {\n        \"block\": 74904,\n        \"account\": 373990,\n        \"ophash\":\n            \"98240100E6B405000100000033A570577C2CEBB59D2075689300898F43BB696E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 140237,\n        \"account\": 700665,\n        \"ophash\":\n            \"CD230200F9B00A00010000003BD5AD92297250B90BA756B2BCDA560D0FD4EBC5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 207176,\n        \"account\": 1035320,\n        \"ophash\":\n            \"4829030038CC0F0001000000E1932E805C6B64254AA3535E70B13ECD0C4F00FE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 273457,\n        \"account\": 1366775,\n        \"ophash\":\n            \"312C0400F7DA140001000000381F85DA1DACF5B0ADBF9F13D752E3E5CA4155E3\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 97198,\n        \"account\": 285630,\n        \"ophash\":\n            \"AE7B0100BE5B0400A2EF0A00EFE09313A00271C8118D2B06251F61E2536EC4A4\",\n        \"n_operation\": 716706\n      },\n      {\n        \"block\": 59580,\n        \"account\": 285630,\n        \"ophash\":\n            \"BCE80000BE5B0400DC63000065DCF77335341CA7126D035BC7ED004442CA9DD7\",\n        \"n_operation\": 25564\n      },\n      {\n        \"block\": 147206,\n        \"account\": 735490,\n        \"ophash\":\n            \"063F020002390B00010000007FBAC29CE4D4B10BC2FBF5AC395E75874591D3C8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 286648,\n        \"account\": 1432690,\n        \"ophash\":\n            \"B85F040072DC1500010000000FB8A3C06C20E65BCD3675D2700D6BD90155A247\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 139704,\n        \"account\": 697990,\n        \"ophash\":\n            \"B821020086A60A0001000000AC49048F769AE409ACD214AEBFF343D894E82CD0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 218525,\n        \"account\": 1092095,\n        \"ophash\":\n            \"9D550300FFA9100001000000DF80BBA3139B4AD92C3AF3C0AD0FD6AEC709F01B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 113998,\n        \"account\": 285630,\n        \"ophash\":\n            \"4EBD0100BE5B0400C5B312004ECCFF6DD628A97472A8F1A11E0C4C738B40FE92\",\n        \"n_operation\": 1225669\n      },\n      {\n        \"block\": 1191,\n        \"account\": 5010,\n        \"ophash\":\n            \"A704000092130000010000006CEA38D565B3358778030C70681DEB048C71919F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 103962,\n        \"account\": 285630,\n        \"ophash\":\n            \"1A960100BE5B0400EB3D0D00AD27A9E67FE484684A46E25FEFD29B310A59D774\",\n        \"n_operation\": 867819\n      },\n      {\n        \"block\": 63446,\n        \"account\": 285630,\n        \"ophash\":\n            \"D6F70000BE5B040006200100EE90B8E3FB8EDE97DA184E65A8AECA82E97EC6F3\",\n        \"n_operation\": 73734\n      },\n      {\n        \"block\": 201951,\n        \"account\": 1009240,\n        \"ophash\":\n            \"DF14030058660F00010000009328E8BB9F67BE62927F620B099CE784FE33B867\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 58160,\n        \"account\": 285630,\n        \"ophash\":\n            \"30E30000BE5B0400842600006DEDD1C1F8E691325EE96965F1D6061389E20579\",\n        \"n_operation\": 9860\n      },\n      {\n        \"block\": 178776,\n        \"account\": 893350,\n        \"ophash\":\n            \"58BA0200A6A10D0001000000AA0C1D2672854CA1841A3EFE767405E62A487EFF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 119769,\n        \"account\": 285630,\n        \"ophash\":\n            \"D9D30100BE5B04004DB016009A55D50EC4817DFADC9E8FB5B2A5A02D189CE43C\",\n        \"n_operation\": 1486925\n      },\n      {\n        \"block\": 281710,\n        \"account\": 1408005,\n        \"ophash\":\n            \"6E4C0400057C150001000000B1DF169226CFA370B6D462DF13B27789BA8016ED\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 294215,\n        \"account\": 69933,\n        \"ophash\":\n            \"477D04002D1101001900000087209747EA0CCC394A5BB8E2329B9AAFB2BBCC36\",\n        \"n_operation\": 25\n      },\n      {\n        \"block\": 176781,\n        \"account\": 285630,\n        \"ophash\":\n            \"8DB20200BE5B04007E0538006782521BB2A89ACEBE9F95F7F66C9E87744F989C\",\n        \"n_operation\": 3671422\n      },\n      {\n        \"block\": 207562,\n        \"account\": 571630,\n        \"ophash\":\n            \"CA2A0300EEB80800E127000099D6DDD839ED7CE16878CDD120E71727168562DE\",\n        \"n_operation\": 10209\n      },\n      {\n        \"block\": 287533,\n        \"account\": 1437125,\n        \"ophash\":\n            \"2D630400C5ED1500010000002E164FB8108E75C92668D1B724C2E7B4F4307EB8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 99850,\n        \"account\": 285630,\n        \"ophash\":\n            \"0A860100BE5B040034C70B00B8E21D3FB67A624C1B661C8E053BB29B98290BD4\",\n        \"n_operation\": 771892\n      },\n      {\n        \"block\": 251056,\n        \"account\": 1254715,\n        \"ophash\":\n            \"B0D403003B251300010000001DE45A8961ACF8BF0F7F62AA2B63D7BECFE8EAB6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 253729,\n        \"account\": 1268115,\n        \"ophash\":\n            \"21DF0300935913000100000082C80D912A3429A0F62C625970F456554755D251\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 255192,\n        \"account\": 1275345,\n        \"ophash\":\n            \"D8E40300D175130001000000DF6773F6C738913FE85C2D9B8BA951D12272BC66\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 146609,\n        \"account\": 285630,\n        \"ophash\":\n            \"B13C0200BE5B04005CC527002478B7787E181522BBD61120BB906315A24A35F1\",\n        \"n_operation\": 2606428\n      },\n      {\n        \"block\": 115476,\n        \"account\": 576870,\n        \"ophash\":\n            \"14C3010066CD080001000000CA463364DC83AC555FD38175E0F7F087E3FBB54B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 227695,\n        \"account\": 6680,\n        \"ophash\":\n            \"6F790300181A000007000000D70169AE3DE6F5320DC097A3FE3F317241A796E0\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 263468,\n        \"account\": 1316815,\n        \"ophash\":\n            \"2C050400CF171400010000006C40F28E9E7F10D427D292348BF991441C3F5884\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 139146,\n        \"account\": 274800,\n        \"ophash\":\n            \"8A1F02007031040004000000583CAE29D930DCF4B4C244C5D8520AFFE38B0F20\",\n        \"n_operation\": 4\n      },\n      {\n        \"block\": 90345,\n        \"account\": 285630,\n        \"ophash\":\n            \"E9600100BE5B040068C70800F2FC3549DD406F68A4638506567EAD0E57D53B7F\",\n        \"n_operation\": 575336\n      },\n      {\n        \"block\": 81492,\n        \"account\": 86646,\n        \"ophash\":\n            \"543E010076520100C40100009487EB357CA0A1B362044BCF06CA8771918C5353\",\n        \"n_operation\": 452\n      },\n      {\n        \"block\": 148934,\n        \"account\": 744145,\n        \"ophash\":\n            \"C6450200D15A0B00010000004B449A2E684C59E32AE0AD964893CE6B03971AB0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 92617,\n        \"account\": 278248,\n        \"ophash\":\n            \"C9690100E83E0400030000004E2CD07FD528002361416FC0204847F2BD11A43E\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 149157,\n        \"account\": 745265,\n        \"ophash\":\n            \"A5460200315F0B000100000089975F7CA115B64E3207EB5E2DDA2E3AFF8B912D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 73635,\n        \"account\": 285630,\n        \"ophash\":\n            \"A31F0100BE5B04007FE003004FC3E8B7D187823CAF31798FF973049D0F292025\",\n        \"n_operation\": 254079\n      },\n      {\n        \"block\": 91331,\n        \"account\": 285630,\n        \"ophash\":\n            \"C3640100BE5B0400CF100900E0EA7BA14D603CA7362D96EE47A77AC7835C9B6A\",\n        \"n_operation\": 594127\n      },\n      {\n        \"block\": 169807,\n        \"account\": 86646,\n        \"ophash\":\n            \"4F97020076520100270F000092BDDDF1A7423C353ACAB8D214D2F4B0BD1021E5\",\n        \"n_operation\": 3879\n      },\n      {\n        \"block\": 141158,\n        \"account\": 705225,\n        \"ophash\":\n            \"66270200C9C20A0001000000196E985F399A0C90C4BB1B6B804018E45A3254E1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 176604,\n        \"account\": 285630,\n        \"ophash\":\n            \"DCB10200BE5B04002BD53700C5B84D9CFBD5A03E4F425B942CB9E31EE6660025\",\n        \"n_operation\": 3659051\n      },\n      {\n        \"block\": 88225,\n        \"account\": 285630,\n        \"ophash\":\n            \"A1580100BE5B04007A340800679A85D79A09010D2FB52FD1A3C1EAD943F10436\",\n        \"n_operation\": 537722\n      },\n      {\n        \"block\": 138048,\n        \"account\": 285630,\n        \"ophash\":\n            \"401B0200BE5B04008EA822003D23A06CA163AD81F63AD1935418EC353D34BA25\",\n        \"n_operation\": 2271374\n      },\n      {\n        \"block\": 212292,\n        \"account\": 1060940,\n        \"ophash\":\n            \"443D03004C30100001000000D51E7CF014AB1FDC7339023ED0C50AC1CC934824\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 170850,\n        \"account\": 285630,\n        \"ophash\":\n            \"629B0200BE5B04005C6C3400D0A7B6E25BF80CB75DC8602917E2BA1FCEDF5E04\",\n        \"n_operation\": 3435612\n      },\n      {\n        \"block\": 91004,\n        \"account\": 285630,\n        \"ophash\":\n            \"7C630100BE5B040077F708001968E50B4BF65462B028EAC6672B564179B7FCD1\",\n        \"n_operation\": 587639\n      },\n      {\n        \"block\": 73560,\n        \"account\": 285630,\n        \"ophash\":\n            \"581F0100BE5B040085DB03002D5DDF43C8F11C5AB7873BD9BD2AFD5D3671BED4\",\n        \"n_operation\": 252805\n      },\n      {\n        \"block\": 245101,\n        \"account\": 285630,\n        \"ophash\":\n            \"6DBD0300BE5B0400E49C4A006584FAFA2C3C8E96136D7A6FD2A74AFED691DF81\",\n        \"n_operation\": 4889828\n      },\n      {\n        \"block\": 125544,\n        \"account\": 627190,\n        \"ophash\":\n            \"68EA0100F691090001000000DAB106BFE581029866BCEF8D15DF667E9E5CB518\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231729,\n        \"account\": 1158085,\n        \"ophash\":\n            \"31890300C5AB110001000000C6FD506440F78D8ABF5B606337625E49BBFBBDD8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 64598,\n        \"account\": 285630,\n        \"ophash\":\n            \"56FC0000BE5B040092460100B3F67789B4E355297883AA293AB32838E41ABC99\",\n        \"n_operation\": 83602\n      },\n      {\n        \"block\": 73283,\n        \"account\": 285630,\n        \"ophash\":\n            \"431E0100BE5B0400E6C9030084A20B98628DA32B5258DE0FAC2EC6A003C85F12\",\n        \"n_operation\": 248294\n      },\n      {\n        \"block\": 210360,\n        \"account\": 529497,\n        \"ophash\":\n            \"B83503005914080003000000A9F6C9660AD322B96ADFC7A1E1B146297A13FFB5\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 113922,\n        \"account\": 285630,\n        \"ophash\":\n            \"02BD0100BE5B04001DAB12002B71936474F2846292DD675D6394BCCB6756AE67\",\n        \"n_operation\": 1223453\n      },\n      {\n        \"block\": 117718,\n        \"account\": 588070,\n        \"ophash\":\n            \"D6CB010026F9080001000000D47891024BBBCB0DDACA8C03A2D57D3FDD43DC14\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 117033,\n        \"account\": 584650,\n        \"ophash\":\n            \"29C90100CAEB0800010000003E2942293C6939A950605FF7B1D0F680C530783B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 185454,\n        \"account\": 571630,\n        \"ophash\":\n            \"6ED40200EEB808002615000031BCDDA3EABF618DED799F51CD7B9E276BEDED16\",\n        \"n_operation\": 5414\n      },\n      {\n        \"block\": 126673,\n        \"account\": 632850,\n        \"ophash\":\n            \"D1EE010012A8090001000000D2EF3494DD7C13BF1BC5EC68C70C7518FC28F41D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 128464,\n        \"account\": 641805,\n        \"ophash\":\n            \"D0F501000DCB0900010000005093F96D88F44B3B997E03E3F7EA167DF055C9AF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 202622,\n        \"account\": 1012595,\n        \"ophash\":\n            \"7E17030073730F00010000008FD932449C23B4BAFABC47A709EC538E75FC549F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 218755,\n        \"account\": 1093240,\n        \"ophash\":\n            \"8356030078AE100001000000CD5D00FC1B58A5E99F10BF5FE1BB8D1DCA2EEBBF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 286089,\n        \"account\": 547523,\n        \"ophash\":\n            \"895D0400C35A080080000000E1921F23F3B2886A4097ED87C4E19EA13725022C\",\n        \"n_operation\": 128\n      },\n      {\n        \"block\": 61645,\n        \"account\": 285630,\n        \"ophash\":\n            \"CDF00000BE5B0400B8C5000070FD85D5D8801B36357340B61234A5EE7E354A67\",\n        \"n_operation\": 50616\n      },\n      {\n        \"block\": 261090,\n        \"account\": 285630,\n        \"ophash\":\n            \"E2FB0300BE5B04003BDE4B005488AA0D489AC55803A46F179DE2939D90A50F61\",\n        \"n_operation\": 4972091\n      },\n      {\n        \"block\": 65096,\n        \"account\": 285630,\n        \"ophash\":\n            \"48FE0000BE5B0400DE550100F05997513419B7F30B4DE15A2C48ED84CA68909F\",\n        \"n_operation\": 87518\n      },\n      {\n        \"block\": 194168,\n        \"account\": 571630,\n        \"ophash\":\n            \"78F60200EEB80800A61B0000F05CC08AFDEE9072A80A787146B0FC89C9BACFF2\",\n        \"n_operation\": 7078\n      },\n      {\n        \"block\": 238927,\n        \"account\": 1194105,\n        \"ophash\":\n            \"4FA503007938120001000000CD34CAB2495B3ADF8ED72CC890E22B6CAF02C54F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 168334,\n        \"account\": 838183,\n        \"ophash\":\n            \"8E91020027CA0C0006000000731EFF4111C74AE953505EB78218D5F36E3DE183\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 164713,\n        \"account\": 86646,\n        \"ophash\":\n            \"69830200765201000A0C0000731F67F94B85FD0CFE11F8F75361DECCCCDC0203\",\n        \"n_operation\": 3082\n      },\n      {\n        \"block\": 145011,\n        \"account\": 724515,\n        \"ophash\":\n            \"73360200230E0B0001000000B121C049559E46DDE6E77F7DB8A9E5C6F3CBAE4D\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 54282,\n        \"account\": 122478,\n        \"ophash\":\n            \"0AD400006EDE0100170000003CD0C51F6336AF96A96D55279B928A7211CB18C4\",\n        \"n_operation\": 23\n      },\n      {\n        \"block\": 259445,\n        \"account\": 587022,\n        \"ophash\":\n            \"75F503000EF50800020000003E35BFE9FB939B34596E6FB7621BC4B650522CAE\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 71330,\n        \"account\": 168536,\n        \"ophash\":\n            \"A2160100589202006C000000A2C8F5AB3B3C87C2B1A31B4651CEA146429EF186\",\n        \"n_operation\": 108\n      },\n      {\n        \"block\": 72087,\n        \"account\": 285630,\n        \"ophash\":\n            \"97190100BE5B0400EE6A03007D51003B708BFB49A16168207946C8B91235262F\",\n        \"n_operation\": 223982\n      },\n      {\n        \"block\": 82120,\n        \"account\": 285630,\n        \"ophash\":\n            \"C8400100BE5B0400AD8B0600D2259628B00E8A5240FA1026D4D82EBB2FCB2571\",\n        \"n_operation\": 428973\n      },\n      {\n        \"block\": 101044,\n        \"account\": 285630,\n        \"ophash\":\n            \"B48A0100BE5B0400A3370C00BEE19753BBB660146868C21A05E0DD32A36888D5\",\n        \"n_operation\": 800675\n      },\n      {\n        \"block\": 154118,\n        \"account\": 770070,\n        \"ophash\":\n            \"065A020016C00B0001000000AD31D8491C367E7D95ECCA5FC662CDBE49F0C23F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 75494,\n        \"account\": 376945,\n        \"ophash\":\n            \"E626010071C0050001000000E02D765830EA9C2C13EFCF0CE24E48B8BD40A068\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 98228,\n        \"account\": 285630,\n        \"ophash\":\n            \"B47F0100BE5B0400864C0B00F797E42F8B1F8A8BF68EF6FBEE9018C523308F59\",\n        \"n_operation\": 740486\n      },\n      {\n        \"block\": 128845,\n        \"account\": 285630,\n        \"ophash\":\n            \"4DF70100BE5B040013EB1C00DAAFF4035605EDF948351D09B2F312AE99D5F58C\",\n        \"n_operation\": 1895187\n      },\n      {\n        \"block\": 165604,\n        \"account\": 571630,\n        \"ophash\":\n            \"E4860200EEB80800B00A00007A881B54E77DA30F4F14263103BB9983886EFBBE\",\n        \"n_operation\": 2736\n      },\n      {\n        \"block\": 76952,\n        \"account\": 285630,\n        \"ophash\":\n            \"982C0100BE5B0400B9F5040067BD5658D4C2577165F4C52428B134A3E25754E0\",\n        \"n_operation\": 325049\n      },\n      {\n        \"block\": 143439,\n        \"account\": 716645,\n        \"ophash\":\n            \"4F30020065EF0A0001000000AA4F4DFB5D4D5E69D97C309B5813858909EBF71F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 259851,\n        \"account\": 587043,\n        \"ophash\":\n            \"0BF7030023F50800020000001D364AAC5B7E4DCDBE171D8D7FF9764A7DA55EDA\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 157514,\n        \"account\": 285630,\n        \"ophash\":\n            \"4A670200BE5B0400F8FC2C005ED1880D5B95E8F49FE6951B0A7C70004E9770B2\",\n        \"n_operation\": 2948344\n      },\n      {\n        \"block\": 57227,\n        \"account\": 285610,\n        \"ophash\":\n            \"8BDF0000AA5B0400010000008BE28F287E74F7100FBEDBD415DEE7DD85F5336E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 83245,\n        \"account\": 415665,\n        \"ophash\":\n            \"2D450100B15706000100000075206FE36A9B40C3963C1C983E26327647BDE20A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 244096,\n        \"account\": 1219960,\n        \"ophash\":\n            \"80B90300789D120001000000FDB40E0B61645EB86A06E4B62BF7C619D55DE58E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 175063,\n        \"account\": 571630,\n        \"ophash\":\n            \"D7AB0200EEB80800450F0000F224EDE0BB20831692A941FAD5CC0FBDB5B352E0\",\n        \"n_operation\": 3909\n      },\n      {\n        \"block\": 149073,\n        \"account\": 285630,\n        \"ophash\":\n            \"51460200BE5B04004F002900A4A808801A76C70374C082325C835C9B818B4F51\",\n        \"n_operation\": 2687055\n      },\n      {\n        \"block\": 238652,\n        \"account\": 1192690,\n        \"ophash\":\n            \"3CA40300F23212000100000048CB9170AD33F27F3389154FAD6D345FB7C1639B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 256462,\n        \"account\": 439015,\n        \"ophash\":\n            \"CEE90300E7B20600050000004D8E4AF9F6B0ED3F66F4F5D304626FC6E5F8A25D\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 59878,\n        \"account\": 285630,\n        \"ophash\":\n            \"E6E90000BE5B04002971000066D21AF40410F66FF15E92DF92662FA907D33447\",\n        \"n_operation\": 28969\n      },\n      {\n        \"block\": 88514,\n        \"account\": 285630,\n        \"ophash\":\n            \"C2590100BE5B04005F4808004E860BE21E9C9D7A55415F6B57A6A376EA01ADD6\",\n        \"n_operation\": 542815\n      },\n      {\n        \"block\": 225698,\n        \"account\": 1127955,\n        \"ophash\":\n            \"A27103001336110001000000EEDDD98D2867C675C7116EFC3F3946AEAFBA8651\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 149572,\n        \"account\": 747335,\n        \"ophash\":\n            \"4448020047670B00010000005A3C43E1AFBE16668507937B603E2B4A93615069\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 107022,\n        \"account\": 285630,\n        \"ophash\":\n            \"0EA20100BE5B04008DD30E002EAD6E0F1E8E2A29040C5B6D4A822DDE3B044CC0\",\n        \"n_operation\": 971661\n      },\n      {\n        \"block\": 125576,\n        \"account\": 285630,\n        \"ophash\":\n            \"88EA0100BE5B040089B41A00B916604BAC23D8398220A9CFE3D1C148CCFC480E\",\n        \"n_operation\": 1750153\n      },\n      {\n        \"block\": 57287,\n        \"account\": 285350,\n        \"ophash\":\n            \"C7DF0000A65A0400020000000871D5830BC3676B190FCBFDF1D08E3B3697B7A0\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 78407,\n        \"account\": 340845,\n        \"ophash\":\n            \"473201006D33050061020000E9AD4996D9DE35F3941E660A118B8F02C7689463\",\n        \"n_operation\": 609\n      },\n      {\n        \"block\": 91886,\n        \"account\": 52558,\n        \"ophash\":\n            \"EE6601004ECD000001000000D124806E30AB904624E18A508438A77439FF9122\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 111032,\n        \"account\": 86646,\n        \"ophash\":\n            \"B8B1010076520100A40400006DC0EF600ECD124CFA920EA76D10B09D9E200F64\",\n        \"n_operation\": 1188\n      },\n      {\n        \"block\": 220118,\n        \"account\": 1100065,\n        \"ophash\":\n            \"D65B030021C91000010000000331E441FFF44349181982F380979417D6566778\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 241257,\n        \"account\": 1205755,\n        \"ophash\":\n            \"69AE0300FB65120001000000FDC4B087DDA138A7619B738BEFA6EB6E5BB33103\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 243548,\n        \"account\": 1217195,\n        \"ophash\":\n            \"5CB70300AB92120001000000D52E6FA2AD1B859AAED97C289E49801FB2029C17\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 132079,\n        \"account\": 285630,\n        \"ophash\":\n            \"EF030200BE5B0400FEE31E00EA7E8535A3927BD9455C8790E09E5C5BFFBC3D5B\",\n        \"n_operation\": 2024446\n      },\n      {\n        \"block\": 68606,\n        \"account\": 285630,\n        \"ophash\":\n            \"FE0B0100BE5B0400A925020080F8CDD18CA989A37EDF91177CC048CD76BFE82F\",\n        \"n_operation\": 140713\n      },\n      {\n        \"block\": 245375,\n        \"account\": 1226315,\n        \"ophash\":\n            \"7FBE03004BB61200010000000952EE10D3E0CE4D4C5B96B13CAF23FC95A5E2BC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 261265,\n        \"account\": 274532,\n        \"ophash\":\n            \"91FC03006430040007000000D6A767CD048FE485525FD47162359FC1893BC63F\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 281063,\n        \"account\": 34500,\n        \"ophash\":\n            \"E7490400C4860000F81F0000C78E37C4C78B81F377046B90EFD6D410843B05D9\",\n        \"n_operation\": 8184\n      },\n      {\n        \"block\": 107774,\n        \"account\": 285630,\n        \"ophash\":\n            \"FEA40100BE5B04006C3D0F0004191D8026D0E20662A466F54B4F672593F60C5D\",\n        \"n_operation\": 998764\n      },\n      {\n        \"block\": 195452,\n        \"account\": 976725,\n        \"ophash\":\n            \"7CFB020055E70E0001000000CEC4C88BAD7837CABA50E7C9C51399B6D6599E97\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 270803,\n        \"account\": 1353485,\n        \"ophash\":\n            \"D32104000DA714000100000048BAEC9151E6158BDBF17566AE9562B4865BECF6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 101306,\n        \"account\": 285630,\n        \"ophash\":\n            \"BA8B0100BE5B040097500C006AEA6C6F7A612DEF397477A52D5A93A76CE7679A\",\n        \"n_operation\": 807063\n      },\n      {\n        \"block\": 62231,\n        \"account\": 290760,\n        \"ophash\":\n            \"17F30000C86F04002A370000A1D12B45A54977FA0BEA2B5E78E36E8DA3683A7B\",\n        \"n_operation\": 14122\n      },\n      {\n        \"block\": 132316,\n        \"account\": 285630,\n        \"ophash\":\n            \"DC040200BE5B0400750B1F003DE6F1121E75ACB66030B6772CD3F168FBCE794B\",\n        \"n_operation\": 2034549\n      },\n      {\n        \"block\": 188141,\n        \"account\": 350506,\n        \"ophash\":\n            \"EDDE02002A59050031050000879155E92867EE82E55AE0FD6F2817D97A3DFA60\",\n        \"n_operation\": 1329\n      },\n      {\n        \"block\": 126371,\n        \"account\": 631325,\n        \"ophash\":\n            \"A3ED01001DA2090001000000414882C816683728D969F1646619BE9ECF6814F8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 75435,\n        \"account\": 285630,\n        \"ophash\":\n            \"AB260100BE5B0400DF76040096B016D797DBDDDCBBF28C8C86C6DCD821AFD495\",\n        \"n_operation\": 292575\n      },\n      {\n        \"block\": 94595,\n        \"account\": 285630,\n        \"ophash\":\n            \"83710100BE5B0400A81C0A00FA5E88A0FEDA6C4F7012DB515F1C73EC8DF441E0\",\n        \"n_operation\": 662696\n      },\n      {\n        \"block\": 24553,\n        \"account\": 121790,\n        \"ophash\":\n            \"E95F0000BEDB0100010000009E0BE8CC2ED939A88A8BCFAE1C6912E29DE746E0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 209490,\n        \"account\": 571630,\n        \"ophash\":\n            \"52320300EEB8080046290000302347C6494A3A45082969588B5311BF4CADCBD4\",\n        \"n_operation\": 10566\n      },\n      {\n        \"block\": 110262,\n        \"account\": 285630,\n        \"ophash\":\n            \"B6AE0100BE5B04005A931000A33141E99FAD8EDBC589688C9C54F9433DF260CB\",\n        \"n_operation\": 1086298\n      },\n      {\n        \"block\": 211707,\n        \"account\": 1057995,\n        \"ophash\":\n            \"FB3A0300CB24100001000000811E3A853A3D65171166E11D7EB3C74D07AE4A0C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 105352,\n        \"account\": 285630,\n        \"ophash\":\n            \"889B0100BE5B040067FA0D0065E746D346A352CFE546E0DBDF2B29B78AF8EEBC\",\n        \"n_operation\": 916071\n      },\n      {\n        \"block\": 110239,\n        \"account\": 285630,\n        \"ophash\":\n            \"9FAE0100BE5B0400658F10005F2B4E6073F8F8B8031DECD5CA9034E974AB113B\",\n        \"n_operation\": 1085285\n      },\n      {\n        \"block\": 66814,\n        \"account\": 290760,\n        \"ophash\":\n            \"FE040100C86F0400905E00004C254E10AD3FFEC24D98665CD01DCB2F4194716D\",\n        \"n_operation\": 24208\n      },\n      {\n        \"block\": 125099,\n        \"account\": 619703,\n        \"ophash\":\n            \"ABE80100B77409000B000000D019D80BD44D5245D16CEC5BDDEF5C044A16176E\",\n        \"n_operation\": 11\n      },\n      {\n        \"block\": 60195,\n        \"account\": 285630,\n        \"ophash\":\n            \"23EB0000BE5B0400258000005302755C5C44C4D62A236AAC47568A55DFACB383\",\n        \"n_operation\": 32805\n      },\n      {\n        \"block\": 62919,\n        \"account\": 285630,\n        \"ophash\":\n            \"C7F50000BE5B0400C00201007C5401FA64D6D1481A132C8A15B6F51BB23AEA64\",\n        \"n_operation\": 66240\n      },\n      {\n        \"block\": 120796,\n        \"account\": 86646,\n        \"ophash\":\n            \"DCD70100765201000506000049B586745219336B34E2B3789AAD5F20DD8912E4\",\n        \"n_operation\": 1541\n      },\n      {\n        \"block\": 249491,\n        \"account\": 1246925,\n        \"ophash\":\n            \"93CE0300CD06130001000000B8E624341F90B048B339CFAF5DF072D820283767\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 159888,\n        \"account\": 798905,\n        \"ophash\":\n            \"90700200B9300C0001000000902875E956F5F0F08586344042BD18D921478BCF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 120372,\n        \"account\": 571630,\n        \"ophash\":\n            \"34D60100EEB80800C9000000516389EFCB95697E58914E734CC5B4DA9AF6EB42\",\n        \"n_operation\": 201\n      },\n      {\n        \"block\": 134020,\n        \"account\": 669575,\n        \"ophash\":\n            \"840B020087370A00010000003CEED020A8715A3E2298F501BB403232BD4B8DC1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 128483,\n        \"account\": 285630,\n        \"ophash\":\n            \"E3F50100BE5B0400C3AD1C00AFB2AB4FB9E75A7FB76FEE05776CC7E23A862168\",\n        \"n_operation\": 1879491\n      },\n      {\n        \"block\": 55228,\n        \"account\": 274075,\n        \"ophash\":\n            \"BCD700009B2E04000100000075C854FC4C1B55CB59920BE511297065795428E8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 68681,\n        \"account\": 285630,\n        \"ophash\":\n            \"490C0100BE5B0400322E02005D01D1D0477EBB3DF8B01807CEE82BA22D93A7D8\",\n        \"n_operation\": 142898\n      },\n      {\n        \"block\": 208524,\n        \"account\": 1042060,\n        \"ophash\":\n            \"8C2E03008CE60F0001000000F3DC304CE960FB3BB106D4DCB1843D90554B1970\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 214374,\n        \"account\": 571630,\n        \"ophash\":\n            \"66450300EEB80800782A00001BA1A05A134776FBBCD673702F816B1C55472C9E\",\n        \"n_operation\": 10872\n      },\n      {\n        \"block\": 240583,\n        \"account\": 1202385,\n        \"ophash\":\n            \"C7AB0300D15812000100000001E3EB52CDDCFDAA5A1D9A9DA5074C96E02E7DAB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 272262,\n        \"account\": 499123,\n        \"ophash\":\n            \"86270400B39D070002000000E3C1069E796EE5F10743BC1E898FCAA3F0CE6762\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 189188,\n        \"account\": 110027,\n        \"ophash\":\n            \"04E30200CBAD01007002000093597F8C4CE789F00BB0DDD690B2D65C2C4AD048\",\n        \"n_operation\": 624\n      },\n      {\n        \"block\": 55907,\n        \"account\": 279005,\n        \"ophash\":\n            \"63DA0000DD41040001000000D7D3D5CE0C4828155C09BA1988EC36F9462DEB82\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 225327,\n        \"account\": 1126060,\n        \"ophash\":\n            \"2F700300AC2E110001000000B6249D63D51C4ADBF98D23C8AF8DCCB5A5E46532\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 162807,\n        \"account\": 813490,\n        \"ophash\":\n            \"F77B0200B2690C00010000000E2C596E6DF63EF4123CA19C9D076BFD92802725\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 117108,\n        \"account\": 285630,\n        \"ophash\":\n            \"74C90100BE5B040086B5140086545A0AFDD880EA29D5A58EC0DF0D34BC47B09A\",\n        \"n_operation\": 1357190\n      },\n      {\n        \"block\": 255033,\n        \"account\": 1274610,\n        \"ophash\":\n            \"39E40300F272130001000000C31A9382CC74A8B656B33ABD6DE63BF01C46D7C7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 77597,\n        \"account\": 285630,\n        \"ophash\":\n            \"1D2F0100BE5B04002724050071C47BE73A7BF47B9816A45D9F19CB5F0050207F\",\n        \"n_operation\": 336935\n      },\n      {\n        \"block\": 66643,\n        \"account\": 285630,\n        \"ophash\":\n            \"53040100BE5B0400549D0100E0B54073C66D13319BBE0DB4356F955D9C0E0602\",\n        \"n_operation\": 105812\n      },\n      {\n        \"block\": 175254,\n        \"account\": 285630,\n        \"ophash\":\n            \"96AC0200BE5B04008D1B3700863A05EA1C2148724E0A1F0B8760856D357FD19B\",\n        \"n_operation\": 3611533\n      },\n      {\n        \"block\": 160261,\n        \"account\": 800755,\n        \"ophash\":\n            \"05720200F3370C00010000008654CDE5BC7BAB05983EC459A539121FC3276BB7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 231726,\n        \"account\": 571630,\n        \"ophash\":\n            \"2E890300EEB80800CA2D0000AF3FC5EB975D172E43CDF50375DE4A6408B74877\",\n        \"n_operation\": 11722\n      },\n      {\n        \"block\": 99975,\n        \"account\": 285630,\n        \"ophash\":\n            \"87860100BE5B040060D40B00BF793A68F0BBBBE295F55F975D3FB59B0199BBAF\",\n        \"n_operation\": 775264\n      },\n      {\n        \"block\": 260154,\n        \"account\": 1299805,\n        \"ophash\":\n            \"3AF803005DD513000100000050E00622DC2339EFE3AF8C3896AC80F75BD60C7A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 59738,\n        \"account\": 285630,\n        \"ophash\":\n            \"5AE90000BE5B0400386B0000ECC49734ED0973B4C5DD3C7EDEE21E02FFD135FA\",\n        \"n_operation\": 27448\n      },\n      {\n        \"block\": 68526,\n        \"account\": 342085,\n        \"ophash\":\n            \"AE0B010045380500010000007F03901A7A7A3C5C7C922E34712598D9DA83E7C8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 195277,\n        \"account\": 285630,\n        \"ophash\":\n            \"CDFA0200BE5B0400E8464100B203C197029D8933FAAB6599160252E6D1C46ABE\",\n        \"n_operation\": 4277992\n      },\n      {\n        \"block\": 280710,\n        \"account\": 661981,\n        \"ophash\":\n            \"86480400DD190A00110000000B6E978CAA4F52233C897FB392FE80050548A246\",\n        \"n_operation\": 17\n      },\n      {\n        \"block\": 168536,\n        \"account\": 126308,\n        \"ophash\":\n            \"5892020064ED010007000000F104FC4708F7ECCE214F949D735737EF1D4A019C\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 233553,\n        \"account\": 1167190,\n        \"ophash\":\n            \"5190030056CF1100010000007A75F676593423A94812E3E23CF54F6E16764A67\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 68163,\n        \"account\": 285630,\n        \"ophash\":\n            \"430A0100BE5B040035FB0100024815FD4F69666A1FF90D9CC17136087313962A\",\n        \"n_operation\": 129845\n      },\n      {\n        \"block\": 111932,\n        \"account\": 285630,\n        \"ophash\":\n            \"3CB50100BE5B0400D98411008347F882E45FB4E31DE1E6C79ACED29D9CCB5D74\",\n        \"n_operation\": 1148121\n      },\n      {\n        \"block\": 169051,\n        \"account\": 844695,\n        \"ophash\":\n            \"5B94020097E30C0001000000978389F49EF0C8AAEAB63F2632A451014C45B4BF\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 236686,\n        \"account\": 1182920,\n        \"ophash\":\n            \"8E9C0300C80C12000100000061897271E7E64884AE7BEF47C5535A68AC2C3AFD\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 201120,\n        \"account\": 86646,\n        \"ophash\":\n            \"A0110300765201006E140000DBCE2E3463E5FD7FEB6BF72BF6D0E863EF05D9F1\",\n        \"n_operation\": 5230\n      },\n      {\n        \"block\": 69512,\n        \"account\": 290760,\n        \"ophash\":\n            \"880F0100C86F04006170000085C83EBCE8DA33885A8818CAA6B1F1FCF048A7A1\",\n        \"n_operation\": 28769\n      },\n      {\n        \"block\": 289396,\n        \"account\": 1446445,\n        \"ophash\":\n            \"746A04002D12160001000000E7122678E2BC9C345BE2AC64F3AC9A7019A84BBE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 144650,\n        \"account\": 384560,\n        \"ophash\":\n            \"0A35020030DE0500020000004E6A3E95B1FAB429FF0E25DD4A1A8C36CB7A4F93\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 71260,\n        \"account\": 355780,\n        \"ophash\":\n            \"5C160100C46D05000100000002C665578F44B5980ED40DBDACB1C940E548C347\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 203501,\n        \"account\": 1016970,\n        \"ophash\":\n            \"ED1A03008A840F0001000000BA67CCC961C5D117D63D4C1F3C8B103777E23EE4\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 203251,\n        \"account\": 1015730,\n        \"ophash\":\n            \"F3190300B27F0F00010000008E23D20DEC93E8EB4724A985FE12852CEDDEE8A9\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 106213,\n        \"account\": 285630,\n        \"ophash\":\n            \"E59E0100BE5B040020710E00E63C6D7A80B0DD148BCD32140A8269EC0D3BAD05\",\n        \"n_operation\": 946464\n      },\n      {\n        \"block\": 60985,\n        \"account\": 304390,\n        \"ophash\":\n            \"39EE000006A5040001000000F706DEC9E3EA773F5B2B1217E74707CA7DAD7743\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 216985,\n        \"account\": 1084400,\n        \"ophash\":\n            \"994F0300F08B1000010000008B98970042A1DCF3A5F6B04899D0C5FD9812FE1B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 60900,\n        \"account\": 285630,\n        \"ophash\":\n            \"E4ED0000BE5B040047A30000A6BC21E517D3AF7DEE9D13F444F97EB80DC40315\",\n        \"n_operation\": 41799\n      },\n      {\n        \"block\": 229390,\n        \"account\": 571630,\n        \"ophash\":\n            \"0E800300EEB808005C2D00004FDE2CB28A2C485884E7B7BC5A44D5A3B21EFB4B\",\n        \"n_operation\": 11612\n      },\n      {\n        \"block\": 102737,\n        \"account\": 285630,\n        \"ophash\":\n            \"51910100BE5B0400B1CD0C00291A37EBB07CE6517F5B47A0543B0EB6DD378492\",\n        \"n_operation\": 839089\n      },\n      {\n        \"block\": 84790,\n        \"account\": 285630,\n        \"ophash\":\n            \"364B0100BE5B04007E4007009938B3A091C0BB80E88E7C763FE040DE64CDFC8F\",\n        \"n_operation\": 475262\n      },\n      {\n        \"block\": 216260,\n        \"account\": 1080765,\n        \"ophash\":\n            \"C44C0300BD7D1000010000006C5A83DBF3B7FB025086D9873F4E287E2FF19165\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 58934,\n        \"account\": 285630,\n        \"ophash\":\n            \"36E60000BE5B0400D9460000BACDEAE7645EE80EDC6EA8C08CEF9608C6373756\",\n        \"n_operation\": 18137\n      },\n      {\n        \"block\": 204466,\n        \"account\": 1021800,\n        \"ophash\":\n            \"B21E030068970F00010000005A059C81BE705C8821F8E9BCEAD3337D0EAFF90F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 101407,\n        \"account\": 285630,\n        \"ophash\":\n            \"1F8C0100BE5B04009E590C00D27F7ACFD113B10523D2A500CB3716F9771AF365\",\n        \"n_operation\": 809374\n      },\n      {\n        \"block\": 169031,\n        \"account\": 77,\n        \"ophash\":\n            \"479402004D000000120200008E7C7927576CB27600F98F85640D5D69CB3CBBCE\",\n        \"n_operation\": 530\n      },\n      {\n        \"block\": 165395,\n        \"account\": 331889,\n        \"ophash\":\n            \"138602007110050002000000A563C275A7C25E5B7C4D83CE2C803392C073194E\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 78398,\n        \"account\": 285630,\n        \"ophash\":\n            \"3E320100BE5B04003F600500D2852F8F7296BB55E74D2993AB91E0CE1549B708\",\n        \"n_operation\": 352319\n      },\n      {\n        \"block\": 264717,\n        \"account\": 6038,\n        \"ophash\":\n            \"0D0A04009617000001000000E2BC62CB7BF016F8D064404488A84581138F272A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 97460,\n        \"account\": 285630,\n        \"ophash\":\n            \"B47C0100BE5B040070060B0038E8D1BE57770C06DE486548A0018FFEA1551D45\",\n        \"n_operation\": 722544\n      },\n      {\n        \"block\": 48933,\n        \"account\": 242570,\n        \"ophash\":\n            \"25BF00008AB30300010000001F567E14BCDBB928B164774E0AC362FCB9AE8EFB\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 186115,\n        \"account\": 930040,\n        \"ophash\":\n            \"03D70200F8300E00010000003F688555B86F398BECE4F2A2939DA63F6B3E7E1F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 135945,\n        \"account\": 679195,\n        \"ophash\":\n            \"091302001B5D0A00010000000CF5E8D1E0902790E734C4DACC4591F25012EDD5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 70418,\n        \"account\": 285630,\n        \"ophash\":\n            \"12130100BE5B040042C802007BEEBAD4E179F66C95C90CFB6478FE8EC8328E38\",\n        \"n_operation\": 182338\n      },\n      {\n        \"block\": 181565,\n        \"account\": 907290,\n        \"ophash\":\n            \"3DC502001AD80D000100000033CCB3AFF81BC94520248982CDC6BFEE5340B28E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 44216,\n        \"account\": 218550,\n        \"ophash\":\n            \"B8AC0000B65503000100000018CC7C7B947FC1701E0031AE2382ED641FD43786\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 115158,\n        \"account\": 318320,\n        \"ophash\":\n            \"D6C1010070DB040003000000FB2F7D10395860EEB8D9E473405C4134C849CA25\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 114567,\n        \"account\": 572125,\n        \"ophash\":\n            \"87BF0100DDBA08000100000085191F92C351553A52BA7771A1E7C5EBF3E7B136\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 69236,\n        \"account\": 285630,\n        \"ophash\":\n            \"740E0100BE5B0400105F02007D7D481C6FE6AEB5F27FA4A9053531052713D188\",\n        \"n_operation\": 155408\n      },\n      {\n        \"block\": 78087,\n        \"account\": 285630,\n        \"ophash\":\n            \"07310100BE5B0400DD480500458EE942481D16F03A1E6650226598278E336A6D\",\n        \"n_operation\": 346333\n      },\n      {\n        \"block\": 66277,\n        \"account\": 285630,\n        \"ophash\":\n            \"E5020100BE5B0400E58801002C58C245CA5B6DD5AC39215E085FE24E465B470E\",\n        \"n_operation\": 100581\n      },\n      {\n        \"block\": 165529,\n        \"account\": 827100,\n        \"ophash\":\n            \"99860200DC9E0C00010000000E4708E92B1F7711D8566703D8AD3FED19AAB002\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 204759,\n        \"account\": 938265,\n        \"ophash\":\n            \"D71F030019510E005B00000080F36AFEE7FAA3E33DEDA778D2084505AF1C07D4\",\n        \"n_operation\": 91\n      },\n      {\n        \"block\": 59919,\n        \"account\": 290760,\n        \"ophash\":\n            \"0FEA0000C86F04005F1D00007C8A6566E23432F0463C560AFB2D6EBB0A8C22BB\",\n        \"n_operation\": 7519\n      },\n      {\n        \"block\": 180417,\n        \"account\": 300124,\n        \"ophash\":\n            \"C1C002005C940400433000004A9A5FE94F94B19DA3581D4E5F7B92A7E74FC9C2\",\n        \"n_operation\": 12355\n      },\n      {\n        \"block\": 281558,\n        \"account\": 582406,\n        \"ophash\":\n            \"D64B040006E30800490000007D4828D9EE866D2C1BF0A07EC0B50AEA4175BD15\",\n        \"n_operation\": 73\n      },\n      {\n        \"block\": 137464,\n        \"account\": 285630,\n        \"ophash\":\n            \"F8180200BE5B04000B462200D2B45959DF17E967BF3B8121EA6741D3C9067886\",\n        \"n_operation\": 2246155\n      },\n      {\n        \"block\": 160505,\n        \"account\": 800475,\n        \"ophash\":\n            \"F9720200DB360C0005000000C8241F5C842C2C4CFED7A7F4442E800F29B1D1FD\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 96765,\n        \"account\": 285630,\n        \"ophash\":\n            \"FD790100BE5B0400CCC90A00B77431A0C685B31D42AA250804E2C427D17ADB89\",\n        \"n_operation\": 707020\n      },\n      {\n        \"block\": 161997,\n        \"account\": 809455,\n        \"ophash\":\n            \"CD780200EF590C0001000000B750F65E7BDABBDC103CBDAEE19CBC8F2D9682D8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 103739,\n        \"account\": 285630,\n        \"ophash\":\n            \"3B950100BE5B040032300D0050F71276BC6689D439B490AF9E7F94507CA4C616\",\n        \"n_operation\": 864306\n      },\n      {\n        \"block\": 60091,\n        \"account\": 285630,\n        \"ophash\":\n            \"BBEA0000BE5B0400027C000084D09BACF1796444B1269C9AD98872F0F65B8063\",\n        \"n_operation\": 31746\n      },\n      {\n        \"block\": 96747,\n        \"account\": 285630,\n        \"ophash\":\n            \"EB790100BE5B0400ADC70A004876B0CD8FAA81AAE9F521949A1E094E1F84D9FD\",\n        \"n_operation\": 706477\n      },\n      {\n        \"block\": 146684,\n        \"account\": 732865,\n        \"ophash\":\n            \"FC3C0200C12E0B0001000000D7FE4F0D4CE6D8E80F05EE6FAA83464FBB9EA606\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 299377,\n        \"account\": 1496365,\n        \"ophash\":\n            \"719104002DD5160001000000785D54E293B2C50D7FE57A29CC29E549B3A4C21B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 93863,\n        \"account\": 468720,\n        \"ophash\":\n            \"A76E0100F026070001000000F7706868A208A32C4E11C83CF01AE51059907CC9\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 266927,\n        \"account\": 1320300,\n        \"ophash\":\n            \"AF1204006C251400E502000031D6A1C7219D262560EAF8F5AF8607D6BBC2B232\",\n        \"n_operation\": 741\n      },\n      {\n        \"block\": 249971,\n        \"account\": 1249285,\n        \"ophash\":\n            \"73D003000510130001000000BC2B8C94116FA3D4AEA1A3FD07D7AD7E852105ED\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 135148,\n        \"account\": 332823,\n        \"ophash\":\n            \"EC0F0200171405004100000020E5181760F1EA17C40FFC87BFBE771DC73F535A\",\n        \"n_operation\": 65\n      },\n      {\n        \"block\": 286604,\n        \"account\": 1432490,\n        \"ophash\":\n            \"8C5F0400AADB15000100000029A02686AF586494A5D94672F9BE33399325FAF8\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 223749,\n        \"account\": 1118200,\n        \"ophash\":\n            \"056A0300F80F110001000000A179E27A0C8E20C23A98F3161168DF5AB5093222\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 190587,\n        \"account\": 67050,\n        \"ophash\":\n            \"7BE80200EA0501003B00000072A592725EBABD3DF1C34F83A93E263DC2B2F57D\",\n        \"n_operation\": 59\n      },\n      {\n        \"block\": 136240,\n        \"account\": 285630,\n        \"ophash\":\n            \"30140200BE5B04000582210004F6DAFF9A8169D265230E131A76191E80F97178\",\n        \"n_operation\": 2195973\n      },\n      {\n        \"block\": 170572,\n        \"account\": 126586,\n        \"ophash\":\n            \"4C9A02007AEE0100080000004E696F9BEAD389A53CFD9618EA3A23DE248553AB\",\n        \"n_operation\": 8\n      },\n      {\n        \"block\": 240961,\n        \"account\": 86646,\n        \"ophash\":\n            \"41AD030076520100AA160000A88638293F8AE0F002EAF2CDA08B5DA2F0812331\",\n        \"n_operation\": 5802\n      },\n      {\n        \"block\": 71084,\n        \"account\": 168570,\n        \"ophash\":\n            \"AC1501007A92020036000000E9B0EEC83BD7AB2A0537641E8DD6536083E08763\",\n        \"n_operation\": 54\n      },\n      {\n        \"block\": 75834,\n        \"account\": 285630,\n        \"ophash\":\n            \"3A280100BE5B04005095040043E72AA8A9888CFF24BB5548ABF3664A3AC229AC\",\n        \"n_operation\": 300368\n      },\n      {\n        \"block\": 212751,\n        \"account\": 671468,\n        \"ophash\":\n            \"0F3F0300EC3E0A0003000000493B24447042445667F08C2E65223F27AEF432CE\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 223241,\n        \"account\": 86646,\n        \"ophash\":\n            \"0968030076520100181600009D095280783348C2E51DDF30125A41C4D13FAC96\",\n        \"n_operation\": 5656\n      },\n      {\n        \"block\": 146993,\n        \"account\": 734450,\n        \"ophash\":\n            \"313E0200F2340B0001000000420CEBF53F3BE40D776F3630D69E7D8A09B670C5\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 206527,\n        \"account\": 571630,\n        \"ophash\":\n            \"BF260300EEB8080005270000FFBFCB14892664E65187388A3FAF401676443453\",\n        \"n_operation\": 9989\n      },\n      {\n        \"block\": 256960,\n        \"account\": 1284260,\n        \"ophash\":\n            \"C0EB0300A4981300010000007B68B39C8F505AA77296391FE4D0A09AC1BD3C1B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 172905,\n        \"account\": 259630,\n        \"ophash\":\n            \"69A302002EF6030006000000A6CC8907BFC8DDF522B00A6881A6DD77FACB2C63\",\n        \"n_operation\": 6\n      },\n      {\n        \"block\": 208131,\n        \"account\": 1040110,\n        \"ophash\":\n            \"032D0300EEDE0F0001000000A429B621D58A954CD8749DAA7E3FF32BB602289F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 297225,\n        \"account\": 1485620,\n        \"ophash\":\n            \"0989040034AB160001000000EC725C0E4E7DE38DA0D48DDA317CF9613AC4EE47\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 206382,\n        \"account\": 1031395,\n        \"ophash\":\n            \"2E260300E3BC0F00010000006004A45FF1B9EBA46B28A26B51408B656BC8F7C6\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 179511,\n        \"account\": 896871,\n        \"ophash\":\n            \"37BD020067AF0D0001000000E130CF96B86E2E8DA390AD2147C975EF358CDA5E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 105150,\n        \"account\": 285630,\n        \"ophash\":\n            \"BE9A0100BE5B0400DDDE0D0002CE92289F7D5D2F7012B1FBD26C29780EF16678\",\n        \"n_operation\": 909021\n      },\n      {\n        \"block\": 285276,\n        \"account\": 591320,\n        \"ophash\":\n            \"5C5A0400D80509000F00000001DA436139651B8EF7A7EC0283D98D26BB26428A\",\n        \"n_operation\": 15\n      },\n      {\n        \"block\": 139750,\n        \"account\": 110027,\n        \"ophash\":\n            \"E6210200CBAD01001F000000E34135897332911006913803D9B0D2F54DBB032A\",\n        \"n_operation\": 31\n      },\n      {\n        \"block\": 120092,\n        \"account\": 285630,\n        \"ophash\":\n            \"1CD50100BE5B040042EE16001449BAC5979828CA234090988D0EBDA140C4A65C\",\n        \"n_operation\": 1502786\n      },\n      {\n        \"block\": 157226,\n        \"account\": 300124,\n        \"ophash\":\n            \"2A6602005C94040086230000454FED24EDF145A233792AD27726DE57C373363F\",\n        \"n_operation\": 9094\n      },\n      {\n        \"block\": 113250,\n        \"account\": 285630,\n        \"ophash\":\n            \"62BA0100BE5B0400873D120063BC943C5E932A53DD854D04CAB7F02EB3A2E542\",\n        \"n_operation\": 1195399\n      },\n      {\n        \"block\": 163189,\n        \"account\": 86646,\n        \"ophash\":\n            \"757D020076520100820B000086F6059A89632BD66BBA71E1AFA8D90F4A0B2FE1\",\n        \"n_operation\": 2946\n      },\n      {\n        \"block\": 102875,\n        \"account\": 285630,\n        \"ophash\":\n            \"DB910100BE5B04004ADB0C006AF55F9DAD8FC743DCE9E76A5BDC72DD84E5B91B\",\n        \"n_operation\": 842570\n      },\n      {\n        \"block\": 271877,\n        \"account\": 1358755,\n        \"ophash\":\n            \"05260400A3BB1400010000006F7D36CC17E65CB9D55AA4FA251A304F1203812F\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 195483,\n        \"account\": 976895,\n        \"ophash\":\n            \"9BFB0200FFE70E00010000008EAD0F9D8BD2F70EE6E0713C5FF1DCDEB9AF70F0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 74112,\n        \"account\": 168571,\n        \"ophash\":\n            \"802101007B920200690100001AD05DF2FBD70CD8EA2F2F1BDF6922EACC4E1908\",\n        \"n_operation\": 361\n      },\n      {\n        \"block\": 273976,\n        \"account\": 285630,\n        \"ophash\":\n            \"382E0400BE5B0400CECD4D0074D40389572CE47DB2ABFFE9041101F2BDD0434B\",\n        \"n_operation\": 5098958\n      },\n      {\n        \"block\": 176699,\n        \"account\": 77,\n        \"ophash\":\n            \"3BB202004D000000430200002042C157001FC1C7AE50573FDD25E7D06932C2FA\",\n        \"n_operation\": 579\n      },\n      {\n        \"block\": 291028,\n        \"account\": 1454620,\n        \"ophash\":\n            \"D47004001C321600010000001D83CE912708A89082606F2E6761F1B83AB03676\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 139428,\n        \"account\": 273569,\n        \"ophash\":\n            \"A4200200A12C04001000000047BD0B865BEDE097AB81E218BBEDA36FB1306D8B\",\n        \"n_operation\": 16\n      },\n      {\n        \"block\": 92276,\n        \"account\": 285630,\n        \"ophash\":\n            \"74680100BE5B0400304F0900C3BDA561C79E09168ABB226684EFF1699BDE3259\",\n        \"n_operation\": 610096\n      },\n      {\n        \"block\": 65866,\n        \"account\": 290760,\n        \"ophash\":\n            \"4A010100C86F04004659000073CEF7C4F96CB6482A5525B2F6291EF8432CF64A\",\n        \"n_operation\": 22854\n      },\n      {\n        \"block\": 270008,\n        \"account\": 1349500,\n        \"ophash\":\n            \"B81E04007C9714000100000069628DFE07124310ADB6779B5917870CB2466977\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 91346,\n        \"account\": 456060,\n        \"ophash\":\n            \"D26401007CF50600010000005675992D7EC60AB2F8E00A722D2639F76386477E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 111388,\n        \"account\": 192168,\n        \"ophash\":\n            \"1CB30100A8EE02000300000094EFB3755715554605A8D8B24C350F32976EB7C8\",\n        \"n_operation\": 3\n      },\n      {\n        \"block\": 185446,\n        \"account\": 926720,\n        \"ophash\":\n            \"66D4020000240E0001000000BC8FFD0EE461466381395DD4C1B00101F4398698\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 144019,\n        \"account\": 285630,\n        \"ophash\":\n            \"93320200BE5B0400860926001CD15BD616B6E7141E45107E0A5A2137705DC0AF\",\n        \"n_operation\": 2492806\n      },\n      {\n        \"block\": 167179,\n        \"account\": 472841,\n        \"ophash\":\n            \"0B8D0200093707000A000000B3CDB2787D3098CA8A5A05AA7091E3CD43498006\",\n        \"n_operation\": 10\n      },\n      {\n        \"block\": 198194,\n        \"account\": 990445,\n        \"ophash\":\n            \"32060300ED1C0F00010000006F556D9CD02BF0E2C715CA3102490FDAADE31A26\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 116676,\n        \"account\": 571630,\n        \"ophash\":\n            \"C4C70100EEB8080047000000C937111C99286440592E17D366EA7B076192079A\",\n        \"n_operation\": 71\n      },\n      {\n        \"block\": 145282,\n        \"account\": 725855,\n        \"ophash\":\n            \"823702005F130B0001000000C63046CDDF7BB3B1669B18F2B97C358259167309\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 68302,\n        \"account\": 340965,\n        \"ophash\":\n            \"CE0A0100E5330500010000009EBE7CB5075B0578BBC0AE08A3816DF19FDA1F38\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 292762,\n        \"account\": 1463260,\n        \"ophash\":\n            \"9A770400DC531600010000009573DE0C18B02945D7A3055E365A18AA42655412\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 77600,\n        \"account\": 285630,\n        \"ophash\":\n            \"202F0100BE5B0400C7240500F77A89B9E5A089B8393E59D5182A568F9F77E0FE\",\n        \"n_operation\": 337095\n      },\n      {\n        \"block\": 118042,\n        \"account\": 86646,\n        \"ophash\":\n            \"1ACD010076520100CE05000077EDEBB2089E78EED08FB599C9E79AD512D2A083\",\n        \"n_operation\": 1486\n      },\n      {\n        \"block\": 298966,\n        \"account\": 1494315,\n        \"ophash\":\n            \"D68F04002BCD16000100000030442ECB809F1377F49E77192D0E66BA358F1FC7\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 58067,\n        \"account\": 289805,\n        \"ophash\":\n            \"D3E200000D6C04000100000095019C32A5EC2006735384B6C35A6A6CD9E8B7E0\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 120005,\n        \"account\": 285630,\n        \"ophash\":\n            \"C5D40100BE5B0400B6DC1600E051D6404FB61DE779C740D5FFF48DFCBE492B1C\",\n        \"n_operation\": 1498294\n      },\n      {\n        \"block\": 115238,\n        \"account\": 94501,\n        \"ophash\":\n            \"26C201002571010005000000B738645D33DAD8FF81AA285679AEBD930EB20E5E\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 91946,\n        \"account\": 76300,\n        \"ophash\":\n            \"2A6701000C2A01000200000091B55A0BAC27F596FD1EF90EDE41A64D5D5C963F\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 180741,\n        \"account\": 903180,\n        \"ophash\":\n            \"05C202000CC80D0002000000B3AA3FE8477862DFD68C5B2434D0E47458F329E8\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 66419,\n        \"account\": 331575,\n        \"ophash\":\n            \"73030100370F050001000000CF9EAE73030817DAAD531D4BA6B87E6D230A731E\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 169444,\n        \"account\": 207854,\n        \"ophash\":\n            \"E4950200EE2B030007000000E78B2B7E4BCD3BA996B20A3570DB1579C7278ADD\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 283576,\n        \"account\": 1417325,\n        \"ophash\":\n            \"B85304006DA0150001000000F60BED19AE89964F3A38D2DF45695792368659EE\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 222016,\n        \"account\": 86646,\n        \"ophash\":\n            \"40630300765201000D1600007CAC29D3190053347BA08B124E7C30746B89D0D0\",\n        \"n_operation\": 5645\n      },\n      {\n        \"block\": 91763,\n        \"account\": 458240,\n        \"ophash\":\n            \"7366010000FE06000100000028B96EAE3DE72BBED27B086FFF6A88A9E280290C\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 286503,\n        \"account\": 819643,\n        \"ophash\":\n            \"275F0400BB810C0002000000833DF0B7DCAAF5030BAA8A4C0C4537F49B02BE72\",\n        \"n_operation\": 2\n      },\n      {\n        \"block\": 259299,\n        \"account\": 1295955,\n        \"ophash\":\n            \"E3F4030053C61300010000000AE0A7DF1DA7E810896469718A79BED6BD59ED70\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 261956,\n        \"account\": 285630,\n        \"ophash\":\n            \"44FF0300BE5B040021464C0056786C064E5383A85E9420DF2B2D1357B3C13252\",\n        \"n_operation\": 4998689\n      },\n      {\n        \"block\": 152105,\n        \"account\": 55095,\n        \"ophash\":\n            \"2952020037D7000005000000887FCD010B3D37C4719A067D6F8BA688293A315E\",\n        \"n_operation\": 5\n      },\n      {\n        \"block\": 76945,\n        \"account\": 285630,\n        \"ophash\":\n            \"912C0100BE5B040097F30400AF689F4C5591C3439B2E84EDDEA834CBF231A074\",\n        \"n_operation\": 324503\n      },\n      {\n        \"block\": 143841,\n        \"account\": 285630,\n        \"ophash\":\n            \"E1310200BE5B0400A5F8250089E6D365A09A0769003FDDC9F9EAD9C6ED4AB27D\",\n        \"n_operation\": 2488485\n      },\n      {\n        \"block\": 82416,\n        \"account\": 411530,\n        \"ophash\":\n            \"F04101008A47060001000000E6A873B3756D2ED10A5F7BB1350031A7AB4DC79B\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 189835,\n        \"account\": 273710,\n        \"ophash\":\n            \"8BE502002E2D0400250000009AFAFF3FED70727C022DB3C711308A6533A49117\",\n        \"n_operation\": 37\n      },\n      {\n        \"block\": 300414,\n        \"account\": 285630,\n        \"ophash\":\n            \"7E950400BE5B0400676A4F00EBCE0F72FC983BF288D50D463D8E229583B410FB\",\n        \"n_operation\": 5204583\n      },\n      {\n        \"block\": 85122,\n        \"account\": 425050,\n        \"ophash\":\n            \"824C01005A7C0600010000002C5166BD73151CCEBAB832715261EC8583FCBC8A\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 126650,\n        \"account\": 285630,\n        \"ophash\":\n            \"BAEE0100BE5B0400576F1B003F07B68E90D66DDA1D8C53DE1E1DF50D3C8D232C\",\n        \"n_operation\": 1797975\n      },\n      {\n        \"block\": 117044,\n        \"account\": 584700,\n        \"ophash\":\n            \"34C90100FCEB080001000000DDC1909ECE9FBBA6ECD590A375B42A31F30AFEE1\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 237186,\n        \"account\": 1185375,\n        \"ophash\":\n            \"829E03005F16120001000000AC576564B2E704833BE0AC1DC64D1D17B0928F09\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 63660,\n        \"account\": 285630,\n        \"ophash\":\n            \"ACF80000BE5B04006224010015B1A21D0B260B3454B775FBF55DB109C0BEAD85\",\n        \"n_operation\": 74850\n      },\n      {\n        \"block\": 108643,\n        \"account\": 285630,\n        \"ophash\":\n            \"63A80100BE5B0400CEAE0F009C4B9D7F452096D95F221F07C7FD9BE3A0BAB586\",\n        \"n_operation\": 1027790\n      },\n      {\n        \"block\": 236689,\n        \"account\": 300124,\n        \"ophash\":\n            \"919C03005C940400883100008C4F8AB91710E50E1A798C6D68F3E26D542FBAB0\",\n        \"n_operation\": 12680\n      },\n      {\n        \"block\": 299499,\n        \"account\": 122202,\n        \"ophash\":\n            \"EB9104005ADD0100070000009D08E63FB13698F54EAE3A0A56FE31C25FBE4C0B\",\n        \"n_operation\": 7\n      },\n      {\n        \"block\": 218185,\n        \"account\": 1090395,\n        \"ophash\":\n            \"495403005BA31000010000009D7EA3A6742ED11EA662C3FEBB1437899B21FDBC\",\n        \"n_operation\": 1\n      },\n      {\n        \"block\": 75206,\n        \"account\": 290760,\n        \"ophash\":\n            \"C6250100C86F04007E860000BF643C17B6A3CAA028F281D50721F4B9D6B54700\",\n        \"n_operation\": 34430\n      },\n      {\n        \"block\": 217951,\n        \"account\": 54358,\n        \"ophash\":\n            \"5F53030056D400000D000000AEB66B7BDEB05199D769AB37293AFE24225CC11B\",\n        \"n_operation\": 13\n      },\n      {\n        \"block\": 103462,\n        \"account\": 285630,\n        \"ophash\":\n            \"26940100BE5B04006A140D00FB862B96154EE4C2A7E65DD1DB8201BA16F06410\",\n        \"n_operation\": 857194\n      },\n      {\n        \"block\": 203048,\n        \"account\": 285630,\n        \"ophash\":\n            \"28190300BE5B040041124400C50190D5D5BD25918CA8C0E04E2D4F325BFF21E1\",\n        \"n_operation\": 4461121\n      },\n      {\n        \"block\": 103757,\n        \"account\": 285630,\n        \"ophash\":\n            \"4D950100BE5B040020330D00E767C90D8499073DF8982A30A6E6F38978D2E9D0\",\n        \"n_operation\": 865056\n      }\n    ];\n  }\n}\n"
  },
  {
    "path": "test/common/fixtures/privatekey.dart",
    "content": "class PrivateKeyFixtures {\n  List<Map<String, dynamic>> curve714;\n  List<Map<String, dynamic>> curve715;\n  List<Map<String, dynamic>> curve716;\n  List<Map<String, dynamic>> curve729;\n\n  PrivateKeyFixtures() {\n    curve714 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FED4A37ECAD2BF13FF24A66DDA299A57632520447B28B9E642C4B2A301CACC217FBD7713F6282C20CCCFDC5FFD2AB93A8E48D8C2C81704D36\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"3GhhbopDPbi883HVV6Hxun6q6AN43CB1yUD9km64cDoZMhgM1KkLy3N41vT1H1zqw4kHdqM64NHMSpSNviVkUP7fCrisZwYzb89dDs\",\n        \"enc_privkey\":\n            \"CA02200046B7A086680D208272F6982F574FE226042F30D049F9A226283FC3346506411D\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FB3431FD46EB80DE81273E0181F170552DE01506A9C91D47269312A81841C82B7F55014CEA471A7D8D3187DA2D10B4F9A8481DA7911CCC1A2\",\n        \"password\": \"test333\",\n        \"b58_pubkey\":\n            \"3GhhbouATXfrARGuHA8ymY2DoPYjKY9i7xBvdpyHjNWtWwdphWwkSaKaKx3tRNV47yGFhnkLZbJkL8crjE129FHUvrFod6dZQt3H8C\",\n        \"enc_privkey\":\n            \"CA02200066C8426FA1DC0980DBDEE7F8656AE6FCA9EF746975E3FFB9EB425B53638C0175\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FFA7AEBA0EB6776EA2D3BCDADBD5908F1B032B78DA75193A9D8040B94E49CA95920E130BD0CB7603DB72D2639AEA95E8D75CB31AEBBD6EA19\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"3GhhborMr2ApiQC19ah4EMkFBj46WymwABvqJ8hMwVkVA5TB58Dver6cfosn8zVKpNnJZCsn8HTdnSobopiMgVe4R8S5ap49NvNsEP\",\n        \"enc_privkey\":\n            \"CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73\"\n      }\n    ];\n    curve715 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FE1C85F75A6E3D75EF916DD9F60E14660F9C63A8AE407060EAA6F7CF373CB830B6E50D27EC46B013602A75305BD3D6433669607846D7335C9A1849664E8A35DD8E5FDECF40CAE5325\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"gD8AW4fgASg1cneBp3csnKeF2x3F2q8LpT4VFCyjEBPG8FraaoRHRJfFtBaGSQH3Y2tqqjJbjAAFWvPgVpL5RvA1xokiN9oVeARsi5jPYdmx7FxrZ1XrtyrDPQPArCJyHsq11wqJVhMgfiAjJ\",\n        \"enc_privkey\":\n            \"CB02300015B2267604593566FEB5292B32F60C3399540C7EB83F3AABB7255BC73B3809E2B742BB971B6274DF452862D6D902466B\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F28F251B908FECEA1DFA33CB727F44E43E95D67DEE66536DFB08D20DF62B69474FF8C36167B8BBB9C5B00D042EC338FFE5A701A8A36F7087FB49007110207B1F880B876467D17F195\",\n        \"password\": \"blabla\",\n        \"b58_pubkey\":\n            \"gD8AW39i8QV2g57X1F19CGHPF8b6oQcDqw9Q5LAq4X6JofJsg1hJhN1i7yhhkeGZQW86bWKeWSssTZVUvmxU4yFu5ivPpU5qMQk6oHofMKKwmoY4uLjzGWnmCsmNdbtK7k6MnhHkeDJqZiRwt\",\n        \"enc_privkey\":\n            \"CB023000FCABEC25AAA049A524CEA1D69360711C1EB4E83D86D2CB45B0EFA1F69B218CCABE3CF0A16AE8ED170919B7B39D1C390E\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F7C4731B8A43D75E23C7F77FB51C44DCCA59394ED2B06F1291849D248AB096A32C93A3E76F32395158E9624AFF2B6AB543CD5C0DCC3735E4879A1E7063F74C11251618A192082F9F4\",\n        \"password\": \"zulu55\",\n        \"b58_pubkey\":\n            \"gD8AW3uCN1tF8FRNNvnGMcSdgNS7uzQErW4mHXpBgG4RCcLhZ2VcGAUuqiW6MrYV4Fsxfbo5n3ToRmn7WaMGCzMFcJX5SCrTY4fvEGrE2q5XTw2gasapYvRYe1c8UKmQoxE6VmKgvDkaiVC51\",\n        \"enc_privkey\":\n            \"CB023000225EDA615DBF3F296B295E76454444024E5F1CF17D5275135C00CDCADF966889890F5618874D95A9EEFF22B6DDCF9C4A\"\n      }\n    ];\n    curve716 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FD5B6C81AE89043F4ECE78CD21F68BFD0FBCC3C6E5BF4BD10B199D53F1DE8C8DFC6FF8CCE3AE309734C268337B1E80A5C70256480482EC8D99D52A8B448BD016C72D3FA482DE6C2F4CBBF604B2D3A7CBB78745AA9057486A0\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"JJj2GZDjhAHPKfyJ4GyEMhFNfUZPAUFe7oqfChPY5HinqNY5NPsCydcY2XEw8iwqhxSuaoAg6hf7qFagZJQ6HTYCGdTdgBxNangcV4ZcbcKwesZ5QmX6sVvLDPvGosfjk8LnrVgVhwJnv26dzKbPceNUzPHR8Pm2zwx6kjESRa3bKajupKngZGYyGmVJNuuyJ\",\n        \"enc_privkey\":\n            \"CC02420001F4C77C1DC868F62A96DD74343B9C03C594F6E42DA3A0139D6988D45D75FBC167E6D98D1F101D4FE8F8D58514F7571399E4548A017645609F5F575176849A38335B\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FA78798633EC647B4BCCC1240730C24E5852B649C3930EF7F9703018D4ED62000B254A875A021B32CFB7B8E87C2C19099CF6E7F1F9E76556F4391A00B118EB6A8EECCFB4CA19C4333B2A7393EF1A88D200D257E3A32DC4C0B\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"JJj2A5Fyw46yWMLegHqvHpUgeBgx957FK2kCRy4nA2qYGbmwMP9tNHnaVJFX6Yha8bQPbNyjLtdrjsqgTFRbFKAWhzx6s9hCjCmVwUsw1ZrE8MB1MkrqgobAr4xxZNmw4i3osKvMwE9LWafSQC5DWCRsx636u6h1Vdpt1CeGthDZfRU35DcKusZ7ZD2W2Pfns\",\n        \"enc_privkey\":\n            \"CC024100E9551B5AD9D9084DD878E224BE718E2929892FC03A5420DCC9A8B9AB5260B47A039D3838DB32D003141AEB1C2F53A285A78470D65AAD2222B2A4C9B279AF76CBF1\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FD8FEC5F2D15CF8997170913FF9F1D715481431196F35BCB60B8A127440D0B7E9D67F908FF857E4EF7B9EFA6BC5A4F8B8FB8F1AD40B9642A2E20BDC5F1B08C3D6128BE2F67CCBAA2CD2C91E287CB4FA298317EBCC872919EF\",\n        \"password\": \"zulu123\",\n        \"b58_pubkey\":\n            \"JJj2GZDo19rm39iih31cyJns2PBUqkTqFvpLZ6tucYNrjf8e9yWr4hckXP9C85x4zBRNJk1YqA6HSkX9AaTUearmYs9qFVzRzwX7X2gEt1gFhHq1dJaeLmDyRXVbd7cmiuxD6tjjXS7V4Jt3A5esgHTpZRQ6PXReDkWmx4fmcURcHFiWwtwWdQrz5ZTEQrQ3r\",\n        \"enc_privkey\":\n            \"CC024100231B27482A4ED27F9CECBFA1D6E610146852D720A5F7623E24D348499B46F31E02B46572D55A7C97CD303D4361242B11A5789C2FEB9A793B0C285B5DF4EBC08984\"\n      }\n    ];\n    curve729 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5F096AF812ED1B1275E123BAF0F351A50554CC62C50C6181AD6313B5E6A319F6ABAF9A1CC29FFA47162355E5A731F379420B7FB6ACC92F9F82\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"2jR5AN61cbT1MmPmhdBPCcYCUidSf4hSzKHycfw6Kk8DFqcxD4MS1y7YezmsoC19S4QJmQvwnDnVDjnHgRaeX8PyE1pWvFzBWVnDBNuawD1wQ9iaa\",\n        \"enc_privkey\":\n            \"D9022300252A9478A7C732CE80E1BE5E2F529050F8521D8F7FEC3C0C8EA2936307244AF9F38E55\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FE327D1F4C88764F6D6F5CD48BC563D5E53D31E641AF18BAE52DDCE43AE7252D2BA294BB1D1F7D6C66195D2021C77B72E95C36D659ABC0BBF\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"2jR5AN5umYFQ2Xgh2p4Scva1NTbipBXtDe4NgTZPd7SSoQkRkPBp6b7AizVZ5nXLboHH6h4fDhAxmUCVkfZ6NGv7GNuoRnqQ1WcwnEEEf2NyiBmVc\",\n        \"enc_privkey\":\n            \"D9022300BD97C143CB26947DE0DF445972F929C1C76DA86B2B33C5B486C8AE926872D77DB4042D\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F36404950AA92E7632F88BE903B9DF3DBFA5CDDE67E776655C95773F80ED982DB55917A685B50F514F813D091C6768280E98C66F996CB7127\",\n        \"password\": \"zandura\",\n        \"b58_pubkey\":\n            \"PkWwgfjhzQWM3sBjXFWRdXAq6ge2Wrr4vXGMp3vMTzj3yVbdqhWxfTwo6ySRAiVP39LZRoH6T9sZq7F5bCHMTD7b92fEynFwSV6xGqTDikNSnoc\",\n        \"enc_privkey\":\n            \"D9022400011FC78E156FFB72C1C830740D34BD711DBFF03AD0F2A272D160D41A28FCB0C1000CBFED\"\n      }\n    ];\n  }\n}\n"
  },
  {
    "path": "test/common/fixtures/publickey.dart",
    "content": "class PublicKeyFixtures {\n  List<Map<String, dynamic>> curve714;\n  List<Map<String, dynamic>> curve715;\n  List<Map<String, dynamic>> curve716;\n  List<Map<String, dynamic>> curve729;\n\n  PublicKeyFixtures() {\n    curve714 = [\n      {\n        \"ec_nid\": 714,\n        \"x\": \"6E75266E1865288874BFE1C3A9686BCF4D22CADCC250B134EA2C470A9E3F912B\",\n        \"y\": \"F8362CB5EE97113D93880303E99B63208CEBDB62D49874D739E33DFFFD3C4162\",\n        \"enc_pubkey\":\n            \"CA0220006E75266E1865288874BFE1C3A9686BCF4D22CADCC250B134EA2C470A9E3F912B2000F8362CB5EE97113D93880303E99B63208CEBDB62D49874D739E33DFFFD3C4162\",\n        \"b58_pubkey\":\n            \"3GhhbopVb9wfo4HzecYwKYMWRvLCssTeFWjocfnWv12Yt3GtaW3seeatH9GqhVmnYrF586RKLwjFFMYn7Txq8X2D4qT7CbqrZgbdRm\"\n      },\n      {\n        \"ec_nid\": 714,\n        \"x\": \"1FD6019F7FBFCD9A34491643287402FB0CCB77F2A4F99482ADC11137CDF1FBD6\",\n        \"y\": \"46924461A9069850A64E48E8EDB9C88764D3A0DC74AF929E335719F8A65B809B\",\n        \"enc_pubkey\":\n            \"CA0220001FD6019F7FBFCD9A34491643287402FB0CCB77F2A4F99482ADC11137CDF1FBD6200046924461A9069850A64E48E8EDB9C88764D3A0DC74AF929E335719F8A65B809B\",\n        \"b58_pubkey\":\n            \"3Ghhbom3CjrhKPrcumjaucV19hDkNWnzqxvW2pgqdmSqgKQCQmdLFe3CPSGeYE99mk9gBhKfuKXhy8nTcRz93oDLz41DFSkJ1xHQPm\"\n      },\n      {\n        \"ec_nid\": 714,\n        \"x\": \"209E3EF49EBED0BE1D9583589CD4B8F365966592E3644FFA243A1941480C676A\",\n        \"y\": \"61DEA0745D3892C2A056CA4C071A8C1F38AB1CAA99EAC43636B800D71B0553C2\",\n        \"enc_pubkey\":\n            \"CA022000209E3EF49EBED0BE1D9583589CD4B8F365966592E3644FFA243A1941480C676A200061DEA0745D3892C2A056CA4C071A8C1F38AB1CAA99EAC43636B800D71B0553C2\",\n        \"b58_pubkey\":\n            \"3Ghhbom5CNJKVeJn3ujKLha4sek4QWWv5MvZNQuGgXDkMiXYxHnWVUkzvkE9hAxTL85tgighg4Zham5VvesMckfAfi6qyrquwKgATC\"\n      }\n    ];\n    curve715 = [\n      {\n        \"ec_nid\": 715,\n        \"x\":\n            \"BB536B465C54D36644BBA2F42DD664EB4AF7E441D5F80892E4FB4DC289E3D8E826A736114D7BC9F5E89FB4C498611520\",\n        \"y\":\n            \"A062FC5AD7995A21478D57B403B11D615C028D215B7B5BB37C8207DCA3932F0D5860D7F3D885D13E714671F816F91FC7\",\n        \"enc_pubkey\":\n            \"CB023000BB536B465C54D36644BBA2F42DD664EB4AF7E441D5F80892E4FB4DC289E3D8E826A736114D7BC9F5E89FB4C4986115203000A062FC5AD7995A21478D57B403B11D615C028D215B7B5BB37C8207DCA3932F0D5860D7F3D885D13E714671F816F91FC7\",\n        \"b58_pubkey\":\n            \"gD8AW4sifppye1utSGPZn2TpTkTXd1EAxGiGTfEEZe87JXCx7oCKFw3ew6hz8E5RB66NuMjSzp59qWu4YrwSEjBh4P9RSsb2Xhc5z7rA4feG5eCAz9mQYqCTQRYsDQHwtftCxMRB625c5X7b4\"\n      },\n      {\n        \"ec_nid\": 715,\n        \"x\":\n            \"EF4EAAF2F5AEA04C8B7E846C7E97D1BF591D66C4751C0C306C9B583637C106604D5A4FF08B87AF6DD44710E7C7B4C766\",\n        \"y\":\n            \"FEFDBF5649030F19D4F1725B29C1B9A3C677EEFEA56CB8D084479DCC5A307A04153C6297971ED72E39FAEA31E9000E34\",\n        \"enc_pubkey\":\n            \"CB023000EF4EAAF2F5AEA04C8B7E846C7E97D1BF591D66C4751C0C306C9B583637C106604D5A4FF08B87AF6DD44710E7C7B4C7663000FEFDBF5649030F19D4F1725B29C1B9A3C677EEFEA56CB8D084479DCC5A307A04153C6297971ED72E39FAEA31E9000E34\",\n        \"b58_pubkey\":\n            \"gD8AW5Z5NgdhARmyGeBcEA8NcECXNQCUgqCtZh7MDoxr9vDkyTjBYQVjybeH5uULg5oC2FwBqpzdGvC9o543uzSrC5DpTdujQGbt9tsCG1ZJ9wun7LgNXqNgkC3gNdp1MHwGRZXbCfXY2BRc2\"\n      },\n      {\n        \"ec_nid\": 715,\n        \"x\":\n            \"FEAB4CE80AA556DF0A487B67F5EE043D5AA977B1DF9A9B5379ADB4D8E981FDFE89FFBDA6D07380FAE7F811A51B5B0640\",\n        \"y\":\n            \"DB340DDDA596C9A0563C339B17B40F431F3AED1F5A9D79B9F3A72E0C08C74987813A5D929161F35E1E1D9B9DDE946C38\",\n        \"enc_pubkey\":\n            \"CB023000FEAB4CE80AA556DF0A487B67F5EE043D5AA977B1DF9A9B5379ADB4D8E981FDFE89FFBDA6D07380FAE7F811A51B5B06403000DB340DDDA596C9A0563C339B17B40F431F3AED1F5A9D79B9F3A72E0C08C74987813A5D929161F35E1E1D9B9DDE946C38\",\n        \"b58_pubkey\":\n            \"gD8AW5khyLy3UjwNcqfLFQGowZTtGPGH412aNwDYEHNZdBUbbFCwcYAzjE2bVucStxzBMW1r8JHDXYX5AsjrHs1PCKLa9G7iuv28oBzSqsN7uzLLsQ5FQvhpm2HgbT2TdAbjLhwyPAD2kkpg1\"\n      }\n    ];\n    curve716 = [\n      {\n        \"ec_nid\": 716,\n        \"x\":\n            \"0182EF9FEFDC476E4CDD19874FB40B42CCD192BA507C964861E393B9AD7FD68F2516141AD3A9264D8C8D4C695086F45EAF6E878FF5B9FC11B317E5871A4F71CBB81D\",\n        \"y\":\n            \"450B01A829CD036553859C48DDE2E7DD832FB4021B5CD07FEE3C46F5B238ECA935C046854C6DA89DB3BF9212F2FAB53A93B20C09BE54CEAA176AC493982328FBA4\",\n        \"enc_pubkey\":\n            \"CC0242000182EF9FEFDC476E4CDD19874FB40B42CCD192BA507C964861E393B9AD7FD68F2516141AD3A9264D8C8D4C695086F45EAF6E878FF5B9FC11B317E5871A4F71CBB81D4100450B01A829CD036553859C48DDE2E7DD832FB4021B5CD07FEE3C46F5B238ECA935C046854C6DA89DB3BF9212F2FAB53A93B20C09BE54CEAA176AC493982328FBA4\",\n        \"b58_pubkey\":\n            \"JJj2GZDmBCwbQuFLumucGMqWALmqpNxuYDEpPYi6aq4y4gvdFv1JLJYGgQyt5oUa1sgyUoAK8m7adARBa9JfGuKRtJQsiegEWQ41WcsyQAZ9iUcnFRVgKe89mqmbuU8hPF7ewisP49HdJCpfHxiwiz95JGWoBP3XdSf4TvBQShjFeVuMEB6pXCMQCfcnG1uBi\"\n      },\n      {\n        \"ec_nid\": 716,\n        \"x\":\n            \"2A33CFF7E6F75FA4F0EA32A5DED773ADA3C18D67A334DD89820B658BD5E38EE101094B00A1558136F8F2F53BF9778AE92ADA48E2F77F03A3A4F0B2A50D3A3798B5\",\n        \"y\":\n            \"BE20E8BCC886C01ABBA58FEBCDABE0EE17E6D0A4695A70D753EB82D6074EE8868BF0562E0A615B394FBB5537B90A1C15CE98F9D21DABC45A8F1CBBF9CD0A740D71\",\n        \"enc_pubkey\":\n            \"CC0241002A33CFF7E6F75FA4F0EA32A5DED773ADA3C18D67A334DD89820B658BD5E38EE101094B00A1558136F8F2F53BF9778AE92ADA48E2F77F03A3A4F0B2A50D3A3798B54100BE20E8BCC886C01ABBA58FEBCDABE0EE17E6D0A4695A70D753EB82D6074EE8868BF0562E0A615B394FBB5537B90A1C15CE98F9D21DABC45A8F1CBBF9CD0A740D71\",\n        \"b58_pubkey\":\n            \"4vQZtSkqEV2ukA7CCji2BZTg2DkPj3d32wwzr2nWmSNrmeKxTgK9mqLzonGwKxDfK2uAmrkjosp1C6KnhLBT8GWpUyx1G5cixM1UL5BnYckNDdut4bVNabDvkEMaAt4nZwLLDWNnWwTAD3BPoBnzoiGiBa4h4RmhDnB1Eh8ZacP6ZCiHNkTEroZwdxzjo1b9\"\n      },\n      {\n        \"ec_nid\": 716,\n        \"x\":\n            \"010992690C56A6AFFDF7A4D3757B4F08667085DFC4805C06BF3104EE285696A746469CFC3178DFC9C16023036E40364DD5DA02FFD3F26694F34F8820D82EF9541833\",\n        \"y\":\n            \"010A75148A885BDE17D930057A9F868FB92A7A3B8643FDF971830649324D4B59606D0856A7A917B4B06B200C426B5A27F3A96E7DEE0227D3216FEDF19163A30AC4F5\",\n        \"enc_pubkey\":\n            \"CC024200010992690C56A6AFFDF7A4D3757B4F08667085DFC4805C06BF3104EE285696A746469CFC3178DFC9C16023036E40364DD5DA02FFD3F26694F34F8820D82EF95418334200010A75148A885BDE17D930057A9F868FB92A7A3B8643FDF971830649324D4B59606D0856A7A917B4B06B200C426B5A27F3A96E7DEE0227D3216FEDF19163A30AC4F5\",\n        \"b58_pubkey\":\n            \"2KPEUbfCdWs9TcCCzUwzDSMeaBQKxcb1yfGJ2egofZJTqoZf1knfmKWumhMvQ944goU3jFosEq2odUvNqJGzizL9ySLJ9oQVopGYuXHtFNZu3kZz44bErDAhMBr92VwKPB7rqPTiio6KbwWA9sLjscKxmZ8DGQ7mTdLoh1sVRFMdk4N6U1HeQBFjHkZqApQeNUi\"\n      }\n    ];\n    curve729 = [\n      {\n        \"ec_nid\": 729,\n        \"x\":\n            \"0101F596D1D86DED3882C21A6E9912BAC0ABDA8C717D8729F11923DABAD313950C9D6AFF\",\n        \"y\":\n            \"0494BF2B4C630036477F4904BDD7DD2D293F590C572F59B523215FB03915B49A62F3A94F\",\n        \"enc_pubkey\":\n            \"D90224000101F596D1D86DED3882C21A6E9912BAC0ABDA8C717D8729F11923DABAD313950C9D6AFF24000494BF2B4C630036477F4904BDD7DD2D293F590C572F59B523215FB03915B49A62F3A94F\",\n        \"b58_pubkey\":\n            \"2jR5AN5ogKAq5jid8fqQJCUNU27irJs5ayrXDZ2ZiC4ywhuWPyUf7z2LPSVLuWdt7CvHsZPGoQFA8eZXyqoY4dvtQnuG8AsKHK4E4veB1PVc2tptw\"\n      },\n      {\n        \"ec_nid\": 729,\n        \"x\":\n            \"07C6FD9F07F4F13B5FFBEC8D85D1F20D87C001235FEDC4730AC019DC687669A04D1108A5\",\n        \"y\":\n            \"03D1746173F9F27AA751A583FD588861C7544C1E870EB4BFF2707E0262F90F6B7D0324B5\",\n        \"enc_pubkey\":\n            \"D902240007C6FD9F07F4F13B5FFBEC8D85D1F20D87C001235FEDC4730AC019DC687669A04D1108A5240003D1746173F9F27AA751A583FD588861C7544C1E870EB4BFF2707E0262F90F6B7D0324B5\",\n        \"b58_pubkey\":\n            \"2jR5AN62R87v3Z6AANSMZfx7Kmp41cVaB4XaupbtX6unJmTSLLxHESjamiPuS7gEuekDFEBkeSiqxKcDWzQGoHxTp6tthbM8oJTw47qk6bay6eHEj\"\n      },\n      {\n        \"ec_nid\": 729,\n        \"x\":\n            \"06D5F0F67401DCB8B923B6202D4D8FB0F0F6F76CAE235DAEC163ACCDEF7F4DF57731F545\",\n        \"y\":\n            \"035C917A8D63AE33D1FFF193BE5555DD7C52E5D36338A31B77B9009D9669668625B0AD3C\",\n        \"enc_pubkey\":\n            \"D902240006D5F0F67401DCB8B923B6202D4D8FB0F0F6F76CAE235DAEC163ACCDEF7F4DF57731F5452400035C917A8D63AE33D1FFF193BE5555DD7C52E5D36338A31B77B9009D9669668625B0AD3C\",\n        \"b58_pubkey\":\n            \"2jR5AN5zeMvr1ZFLcBHXnC8fJYLvfjPSK8YVub3Y7qBDGEGwdhKn9WxHfXGgV2MG6UafxJBcjYNHeBVjkGga58Fu7cN2KVhZnACHeSFeY2ywEwSXH\"\n      }\n    ];\n  }\n}\n"
  },
  {
    "path": "test/common/model/AccountName_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.model.AccountName', () {\n    test('can be initialized with a valid start pascal64 string', () {\n      String startStr =\n          r'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-+{}[]_:\"|<>,.?/~';\n      AccountName name = AccountName(startStr);\n      expect(name.accountName, startStr);\n    });\n    test('cannot be initialized with an invalid char', () {\n      for (int i = 0; i < 32; i++) {\n        expect(() => AccountName(String.fromCharCode(i)), throwsException);\n      }\n    });\n    test('will skip empty validation', () {\n      AccountName a1 = AccountName('');\n\n      expect(a1.toString(), '');\n    });\n    test('will throw an error if the encoding starts with a number', () {\n      for (int i = 0; i < 10; i++) {\n        expect(() => AccountName(i.toString() + 'techworker'), throwsException);\n      }\n    });\n    test('will throw an error if the name is not at least 3 characters', () {\n      expect(() => AccountName('t'), throwsException);\n      expect(() => AccountName('te'), throwsException);\n    });\n    test('will throw an error if a wrong char is used beyond 3 chars', () {\n      expect(() => AccountName('techä'), throwsException);\n    });\n    test('will escape certain characters', () {\n      expect(AccountName('(abc').toStringEscaped(), '\\\\(abc');\n      expect(AccountName(')abc').toStringEscaped(), '\\\\)abc');\n      expect(AccountName('{abc').toStringEscaped(), '\\\\{abc');\n      expect(AccountName('}abc').toStringEscaped(), '\\\\}abc');\n      expect(AccountName('[abc').toStringEscaped(), '\\\\[abc');\n      expect(AccountName(']abc').toStringEscaped(), '\\\\]abc');\n      expect(AccountName(':abc').toStringEscaped(), '\\\\:abc');\n      expect(AccountName('\"abc').toStringEscaped(), '\\\\\"abc');\n      expect(AccountName('<abc').toStringEscaped(), '\\\\<abc');\n      expect(AccountName('>abc').toStringEscaped(), '\\\\>abc');\n    });\n    test('will get a value identifying an escape sequence', () {\n      expect(AccountName.isEscape('\\\\', '('), true);\n      expect(AccountName.isEscape('\\\\', ')'), true);\n      expect(AccountName.isEscape('\\\\', '{'), true);\n      expect(AccountName.isEscape('\\\\', '}'), true);\n      expect(AccountName.isEscape('\\\\', '['), true);\n      expect(AccountName.isEscape('\\\\', ']'), true);\n      expect(AccountName.isEscape('\\\\', ':'), true);\n      expect(AccountName.isEscape('\\\\', '\"'), true);\n      expect(AccountName.isEscape('\\\\', '<'), true);\n      expect(AccountName.isEscape('\\\\', '>'), true);\n\n      expect(AccountName.isEscape('\\\\', 'A'), false);\n      expect(AccountName.isEscape('\\\\', 'B'), false);\n      expect(AccountName.isEscape('\\\\', 'C'), false);\n      expect(AccountName.isEscape('\\\\', '1'), false);\n      expect(AccountName.isEscape('\\\\', '2'), false);\n      expect(AccountName.isEscape('\\\\', '3'), false);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/AccountNumber_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.model.AccountNumber', () {\n    test('can be created from a non-checksum pasa number', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an.toString(), '77-44');\n    });\n    test('can be created from a non-checksum pasa string', () {\n      AccountNumber an = AccountNumber('77');\n\n      expect(an.toString(), '77-44');\n    });\n    test('can be created from a checksummed pasa', () {\n      AccountNumber an = AccountNumber('77-44');\n\n      expect(an.toString(), '77-44');\n    });\n    test('will fail with an invalid account number', () {\n      expect(() => AccountNumber('-77'), throwsException);\n    });\n    test('will fail with an invalid account checksum', () {\n      expect(() => AccountNumber('77-33'), throwsException);\n    });\n    test('will deliver the correct block info', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an.createdInBlock, 15);\n      an = AccountNumber.fromInt(75);\n      expect(an.createdInBlock, 15);\n      an = AccountNumber.fromInt(80);\n      expect(an.createdInBlock, 16);\n      an = AccountNumber.fromInt(0);\n      expect(an.createdInBlock, 0);\n    });\n    test('will return the correct account number', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an.account, 77);\n    });\n    test('will return the correct checksum', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an.checksum, 44);\n    });\n    test('will detect if it is a developer reward account', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an.isFoundationReward, false);\n      an = AccountNumber.fromInt(1050000);\n      expect(an.isFoundationReward, false);\n\n      // first dev reward account\n      an = AccountNumber.fromInt(1050004);\n      expect(an.isFoundationReward, true);\n    });\n    test('can compare account number objects', () {\n      AccountNumber an = AccountNumber.fromInt(77);\n\n      expect(an == AccountNumber.fromInt(77), true);\n      an = AccountNumber.fromInt(77);\n      expect(an == AccountNumber.fromInt(99), false);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/Currency_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.model.Currency', () {\n    test('can be created from various types', () {\n      Currency c = Currency('1');\n      expect(c.toStringOpt(), '1');\n      c = Currency('1.1');\n      expect(c.toStringOpt(), '1.1');\n      c = Currency('1.1110');\n      expect(c.toStringOpt(), '1.111');\n    });\n    test('can add', () {\n      Currency c1 = Currency('1.1');\n      Currency c2 = Currency('1.2');\n\n      expect((c1 + c2).toStringOpt(), '2.3');\n    });\n    test('can sub', () {\n      Currency c1 = Currency('1.2');\n      Currency c2 = Currency('1.1');\n\n      expect((c1 - c2).toStringOpt(), '0.1');\n    });\n    test('can output a fixed decimal', () {\n      Currency c1 = Currency('1.2');\n\n      expect(c1.toString(), '1.2000');\n    });\n    test('can output a optimized decimal', () {\n      Currency c1 = Currency('1.2000');\n\n      expect(c1.toStringOpt(), '1.2');\n    });\n    test('can output molina', () {\n      Currency c1 = Currency('1.2000');\n\n      expect(c1.toMolina(), \"12000\");\n    });\n    test('can handle negatives', () {\n      Currency c1 = Currency('-1.2000');\n      Currency c2 = Currency((-0.0001).toString());\n      expect(c1.toMolina(), \"-12000\");\n      expect(c1.toStringOpt(), \"-1.2\");\n      expect(c2.toStringOpt(), '-0.0001');\n    });\n    test('can make a negative value positive', () {\n      Currency c1 = Currency('-1.2000');\n\n      expect(c1.toPositive().toMolina(), \"12000\");\n    });\n    test('skips when a positive value should be converted to positive', () {\n      Currency c1 = Currency('1.2000');\n\n      expect(c1.toPositive().toMolina(), \"12000\");\n    });\n    test('can compare values if they are equal', () {\n      Currency c1 = Currency('1.2000');\n      Currency c2 = Currency('1.2000');\n      Currency c3 = Currency('1.3000');\n      Currency c4 = Currency('-1.2000');\n\n      expect(c1 == c2, true);\n      expect(c1 == c3, false);\n      expect(c1 == c4, false);\n    });\n    test('can compare values if they are lower', () {\n      Currency c1 = Currency('1.2000');\n      Currency c2 = Currency('1.2000');\n      Currency c3 = Currency('1.3000');\n      Currency c4 = Currency('-1.2000');\n\n      expect(c1 < c2, false);\n      expect(c1 < c3, true);\n      expect(c1 < c4, false);\n    });\n\n    test('can compare values if they are greater', () {\n      Currency c1 = Currency('1.2000');\n      Currency c2 = Currency('1.2000');\n      Currency c3 = Currency('1.3000');\n      Currency c4 = Currency('-1.2000');\n\n      expect(c1 > c2, false);\n      expect(c1 > c3, false);\n      expect(c1 > c4, true);\n    });\n\n    test('can compare values if they are greater or equal', () {\n      Currency c1 = Currency('1.2000');\n      Currency c2 = Currency('1.2000');\n      Currency c3 = Currency('1.3000');\n      Currency c4 = Currency('-1.2000');\n\n      expect(c1 >= c2, true);\n      expect(c1 >= c3, false);\n      expect(c1 >= c4, true);\n    });\n\n    test('can compare values if they are lower or equal', () {\n      Currency c1 = Currency('1.2000');\n      Currency c2 = Currency('1.2000');\n      Currency c3 = Currency('1.3000');\n      Currency c4 = Currency('-1.2000');\n\n      expect(c1 <= c2, true);\n      expect(c1 <= c3, true);\n      expect(c1 <= c4, false);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/OperationHash_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.model.OperationHash', () {\n    test('can be created manually and returns correct initialization values',\n        () {\n      OperationHash oph = OperationHash(\n          1, 2, 3, PDUtil.hexToBytes(List.filled(20, 'AA').join()));\n\n      expect(oph.block, 1);\n      expect(oph.account.account, 2);\n      expect(oph.nOperation, 3);\n      expect(PDUtil.byteToHex(oph.md160), List.filled(20, 'AA').join());\n    });\n\n    test('checks a valid md160', () {\n      expect(() => OperationHash(1, 2, 3, PDUtil.hexToBytes('AAAAAAAAAAA')),\n          throwsException);\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/keys/Curves_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('common.model.keys.Curves', () {\n    test('can be created from a number', () {\n      Curve c = Curve(714); // secp256k1\n\n      expect(c.id, 714);\n      expect(c.name, 'secp256k1');\n\n      c = Curve(715); // secp384r1\n      expect(c.id, 715);\n      expect(c.name, 'secp384r1');\n\n      c = Curve(716); // secp521r1\n      expect(c.id, 716);\n      expect(c.name, 'secp521r1');\n\n      c = Curve(729); // sect283k1\n      expect(c.id, 729);\n      expect(c.name, 'sect283k1');\n    });\n    test('can be created from a name', () {\n      Curve c = Curve.fromString('secp256k1');\n\n      expect(c.id, 714);\n      expect(c.name, 'secp256k1');\n\n      c = Curve.fromString('secp384r1');\n      expect(c.id, 715);\n      expect(c.name, 'secp384r1');\n\n      c = Curve.fromString('secp521r1');\n      expect(c.id, 716);\n      expect(c.name, 'secp521r1');\n\n      c = Curve.fromString('sect283k1');\n      expect(c.id, 729);\n      expect(c.name, 'sect283k1');\n    });\n    test('will return false for sect283k1 supported', () {\n      expect(Curve(Curve.CI_SECT283K1).supported, false);\n      expect(Curve(Curve.CI_SECP256K1).supported, true);\n      expect(Curve(Curve.CI_SECP384R1).supported, true);\n      expect(Curve(Curve.CI_SECP521R1).supported, true);\n    });\n    test('will throw an error with unknown curve', () {\n      expect(() => Curve.fromString('abc'), throwsException);\n      expect(() => Curve(100101), throwsException);\n    });\n    test('will return the name on toString()', () {\n      Curve c = Curve.fromString('secp521r1');\n\n      expect(c.toString(), 'secp521r1');\n    });\n    test('will return secp256k1 as default curve()', () {\n      Curve c = Curve.getDefaultCurve();\n\n      expect(c.id, 714);\n      expect(c.name, 'secp256k1');\n    });\n    test('provides constants to access the name in a controlled manner', () {\n      expect(Curve.CN_SECP256K1, 'secp256k1');\n      expect(Curve.CN_SECP384R1, 'secp384r1');\n      expect(Curve.CN_SECT283K1, 'sect283k1');\n      expect(Curve.CN_SECP521R1, 'secp521r1');\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/keys/KeyPair_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/privatekey.dart';\n\nvoid main() {\n  PrivateKeyCoder privCoder;\n  PublicKeyCoder pubCoder;\n  PrivateKeyFixtures fixtures;\n\n  setUp(() {\n    privCoder = PrivateKeyCoder();\n    pubCoder = PublicKeyCoder();\n    fixtures = PrivateKeyFixtures();\n  });\n\n  group('common.model.keys.KeyPair', () {\n    test('can be created from a public and private key', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey priv =\n            privCoder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        PublicKey pub = pubCoder.decodeFromBase58(c['b58_pubkey']);\n\n        KeyPair kp = KeyPair(priv, pub);\n\n        expect(pubCoder.encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        expect(PDUtil.byteToHex(privCoder.encodeToBytes(kp.privateKey)),\n            c['enc_privkey']);\n        expect(kp.curve.id, 714);\n      });\n    });\n    test('does not allow different curves', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey priv =\n            privCoder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        String b58wrong =\n            'gD8AW4sifppye1utSGPZn2TpTkTXd1EAxGiGTfEEZe87JXCx7oCKFw3ew6hz8E5RB66NuMjSzp59qWu4YrwSEjBh4P9RSsb2Xhc5z7rA4feG5eCAz9mQYqCTQRYsDQHwtftCxMRB625c5X7b4';\n        PublicKey pub = pubCoder.decodeFromBase58(b58wrong);\n\n        expect(() => KeyPair(priv, pub), throwsException);\n      });\n      fixtures.curve715.forEach((c) {\n        PrivateKey priv =\n            privCoder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        String b58wrong =\n            '3GhhbopVb9wfo4HzecYwKYMWRvLCssTeFWjocfnWv12Yt3GtaW3seeatH9GqhVmnYrF586RKLwjFFMYn7Txq8X2D4qT7CbqrZgbdRm';\n        PublicKey pub = pubCoder.decodeFromBase58(b58wrong);\n\n        expect(() => KeyPair(priv, pub), throwsException);\n      });\n      fixtures.curve716.forEach((c) {\n        PrivateKey priv =\n            privCoder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        String b58wrong =\n            '3GhhbopVb9wfo4HzecYwKYMWRvLCssTeFWjocfnWv12Yt3GtaW3seeatH9GqhVmnYrF586RKLwjFFMYn7Txq8X2D4qT7CbqrZgbdRm';\n        PublicKey pub = pubCoder.decodeFromBase58(b58wrong);\n\n        expect(() => KeyPair(priv, pub), throwsException);\n      });\n      fixtures.curve729.forEach((c) {\n        PrivateKey priv =\n            privCoder.decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        String b58wrong =\n            '3GhhbopVb9wfo4HzecYwKYMWRvLCssTeFWjocfnWv12Yt3GtaW3seeatH9GqhVmnYrF586RKLwjFFMYn7Txq8X2D4qT7CbqrZgbdRm';\n        PublicKey pub = pubCoder.decodeFromBase58(b58wrong);\n\n        expect(() => KeyPair(priv, pub), throwsException);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/keys/PrivateKey_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/privatekey.dart';\n\nvoid main() {\n  group('common.model.keys.PrivateKey', () {\n    PrivateKeyFixtures fixtures;\n    setUp(() {\n      fixtures = PrivateKeyFixtures();\n    });\n\n    test('cannot be created with wrong length values managed by the curve', () {\n      expect(\n          () => PrivateKey(\n              PDUtil.hexToBytes(List.filled(35, '00').join()), Curve(714)),\n          throwsException);\n      expect(\n          () => PrivateKey(\n              PDUtil.hexToBytes(List.filled(51, '00').join()), Curve(715)),\n          throwsException);\n      expect(\n          () => PrivateKey(\n              PDUtil.hexToBytes(List.filled(69, '00').join()), Curve(716)),\n          throwsException);\n      expect(\n          () => PrivateKey(\n              PDUtil.hexToBytes(List.filled(39, '00').join()), Curve(729)),\n          throwsException);\n    });\n    test('returns key as ec', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey pkey = PrivateKeyCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(PDUtil.byteToHex(pkey.key), PDUtil.byteToHex(pkey.ec()));\n      });\n      fixtures.curve715.forEach((c) {\n        PrivateKey pkey = PrivateKeyCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(PDUtil.byteToHex(pkey.key), PDUtil.byteToHex(pkey.ec()));\n      });\n      fixtures.curve716.forEach((c) {\n        PrivateKey pkey = PrivateKeyCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(PDUtil.byteToHex(pkey.key), PDUtil.byteToHex(pkey.ec()));\n      });\n      fixtures.curve729.forEach((c) {\n        PrivateKey pkey = PrivateKeyCoder()\n            .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n        expect(PDUtil.byteToHex(pkey.key), PDUtil.byteToHex(pkey.ec()));\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/model/keys/PublicKey_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/publickey.dart';\n\nvoid main() {\n  group('common.model.keys.PublicKey', () {\n    const List<int> curves = [\n      Curve.CI_SECP256K1,\n      Curve.CI_SECT283K1,\n      Curve.CI_SECP521R1,\n      Curve.CI_SECP384R1\n    ];\n    PublicKeyFixtures fixtures;\n    PublicKeyCoder coder;\n\n    setUp(() {\n      coder = PublicKeyCoder();\n      fixtures = PublicKeyFixtures();\n    });\n\n    test('can be created as an empty key (used by pasc v2)', () {\n      PublicKey pubkey = PublicKey.empty();\n\n      expect(pubkey.curve.id, 0);\n      expect(pubkey.x.length, 0);\n      expect(pubkey.y.length, 0);\n    });\n\n    test('cannot be created with wronfues managed by the curve', () {\n      curves.forEach((c) {\n        Curve curve = Curve(c);\n\n        expect(\n            () => {\n                  PublicKey(\n                      PDUtil.hexToBytes(\n                          List.filled(curve.xylPublicKey() + 1, '00').join()),\n                      PDUtil.hexToBytes(\n                          List.filled(curve.xylPublicKey(), '00').join()),\n                      curve)\n                },\n            throwsException);\n        expect(\n            () => {\n                  PublicKey(\n                      PDUtil.hexToBytes(\n                          List.filled(curve.xylPublicKey(), '00').join()),\n                      PDUtil.hexToBytes(\n                          List.filled(curve.xylPublicKey() + 1, '00').join()),\n                      curve)\n                },\n            throwsException);\n      });\n    });\n\n    test('can return a value only containing x and y', () {\n      fixtures.curve714.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.ec()), c['x'] + c['y']);\n      });\n      fixtures.curve715.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.ec()), c['x'] + c['y']);\n      });\n      fixtures.curve716.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.ec()), c['x'] + c['y']);\n      });\n      fixtures.curve729.forEach((c) {\n        PublicKey key =\n            coder.decodeFromBytes(PDUtil.hexToBytes(c['enc_pubkey']));\n        expect(PDUtil.byteToHex(key.ec()), c['x'] + c['y']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/sha_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('Common.Sha', () {\n    List<Map<String, String>> sha256data;\n    List<Map<String, String>> sha512data;\n\n    setUp(() {\n      sha256data = [\n        {\n          \"input\": \"\",\n          \"expected\":\n              \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\"\n        },\n        {\n          \"input\": \"HashLib4Pascal\",\n          \"expected\":\n              \"BCF45544CB98DDAB731927F8760F81821489ED04C0792A4D254134887BEA9E38\"\n        },\n        {\n          \"input\": \"123456789\",\n          \"expected\":\n              \"15E2B0D3C33891EBB0F1EF609EC419420C20E320CE94C65FBC8C3312448EB225\"\n        },\n        {\n          \"input\": \"abcde\",\n          \"expected\":\n              \"36BBE50ED96841D10443BCB670D6554F0A34B761BE67EC9C4A8AD2C0C44CA42C\"\n        }\n      ];\n      sha512data = [\n        {\n          \"input\": \"\",\n          \"expected\":\n              \"CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E\"\n        },\n        {\n          \"input\": \"HashLib4Pascal\",\n          \"expected\":\n              \"0A5DA12B113EBD3DEA4C51FD10AFECF1E2A8EE6C3848A0DD4407141ADDA04375068D85A1EEF980FAFF68DC3BF5B1B3FBA31344178042197B5180BD95530D61AC\"\n        },\n        {\n          \"input\": \"123456789\",\n          \"expected\":\n              \"D9E6762DD1C8EAF6D61B3C6192FC408D4D6D5F1176D0C29169BC24E71C3F274AD27FCD5811B313D681F7E55EC02D73D499C95455B6B5BB503ACF574FBA8FFE85\"\n        },\n        {\n          \"input\": \"abcde\",\n          \"expected\":\n              \"878AE65A92E86CAC011A570D4C30A7EAEC442B85CE8ECA0C2952B5E3CC0628C2E79D889AD4D5C7C626986D452DD86374B6FFAA7CD8B67665BEF2289A5C70B0A1\"\n        }\n      ];\n    });\n\n    test('SHA256 Test', () {\n      String result;\n      sha256data.forEach((hash) {\n        result = PDUtil.byteToHex(\n            Sha.sha256([PDUtil.stringToBytesUtf8(hash['input'])]));\n        expect(result, hash['expected']);\n      });\n    });\n    test('SHA512 Test', () {\n      String result;\n      sha512data.forEach((hash) {\n        result = PDUtil.byteToHex(\n            Sha.sha512([PDUtil.stringToBytesUtf8(hash['input'])]));\n\n        expect(result, hash['expected']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/common/util_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('Common.Util', () {\n    test('test hex to byte array and back', () {\n      String hex =\n          '67EDBC8F904091738DF33B4B6917261DB91DD9002D3985A7BA090345264A46C6';\n      Uint8List byteArray = PDUtil.hexToBytes(\n          '67EDBC8F904091738DF33B4B6917261DB91DD9002D3985A7BA090345264A46C6');\n      expect(PDUtil.byteToHex(byteArray), hex);\n    });\n    test('test hex to binary and back', () {\n      String hex =\n          '67EDBC8F904091738DF33B4B6917261DB91DD9002D3985A7BA090345264A46C6';\n      String binary = PDUtil.hexToBinary(\n          '67EDBC8F904091738DF33B4B6917261DB91DD9002D3985A7BA090345264A46C6');\n      expect(PDUtil.binaryToHex(binary), hex);\n    });\n    test('can concat one or more byte arrays', () {\n      final List<Uint8List> hexas = ['ABCD', '0020', 'FFFFFFDD']\n          .map((hex) => PDUtil.hexToBytes(hex))\n          .toList();\n\n      expect(PDUtil.byteToHex(PDUtil.concat(hexas)), 'ABCD0020FFFFFFDD');\n    });\n    test('can convert int to byte array and back', () {\n      final Uint8List h = PDUtil.intToBytes(714);\n\n      expect(PDUtil.bytesToInt(h), 714);\n    });\n    test('can decode and encode a bigint to little-endian byte array', () {\n      BigInt a = BigInt.from(1000);\n      Uint8List encoded = PDUtil.encodeBigInt(a);\n      String hex = 'E803';\n      expect(PDUtil.byteToHex(encoded), hex);\n      expect(PDUtil.decodeBigInt(encoded), a);\n    });\n    test('can decode and encode a bigint to big-endian byte array', () {\n      BigInt a = BigInt.from(1000);\n      Uint8List encoded = PDUtil.encodeBigInt(a, endian: Endian.big);\n      String hex = '03E8';\n      expect(PDUtil.byteToHex(encoded), hex);\n      expect(PDUtil.decodeBigInt(encoded, endian: Endian.big), a);\n    });\n  });\n}\n"
  },
  {
    "path": "test/crypto/encrypt/aes/cbcpkcs7_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('crypto.encrypt.aes.cbcpkcs7', () {\n    List<Map<String, dynamic>> aesData;\n\n    setUp(() {\n      aesData = [\n        {\n          \"mode\": \"aes-128\",\n          \"key\": \"2b7e151628aed2a6abf7158809cf4f3c\",\n          \"iv\": \"000102030405060708090A0B0C0D0E0F\",\n          \"input\": \"6bc1bee22e409f96e93d7e117393172a\",\n          \"output\": \"7649abac8119b246cee98e9b12e9197d\"\n        },\n        {\n          \"mode\": \"aes-128\",\n          \"key\": \"2b7e151628aed2a6abf7158809cf4f3c\",\n          \"iv\": \"7649ABAC8119B246CEE98E9B12E9197D\",\n          \"input\": \"ae2d8a571e03ac9c9eb76fac45af8e51\",\n          \"output\": \"5086cb9b507219ee95db113a917678b2\"\n        },\n        {\n          \"mode\": \"aes-128\",\n          \"key\": \"2b7e151628aed2a6abf7158809cf4f3c\",\n          \"iv\": \"5086CB9B507219EE95DB113A917678B2\",\n          \"input\": \"30c81c46a35ce411e5fbc1191a0a52ef\",\n          \"output\": \"73bed6b8e3c1743b7116e69e22229516\"\n        },\n        {\n          \"mode\": \"aes-128\",\n          \"key\": \"2b7e151628aed2a6abf7158809cf4f3c\",\n          \"iv\": \"73BED6B8E3C1743B7116E69E22229516\",\n          \"input\": \"f69f2445df4f9b17ad2b417be66c3710\",\n          \"output\": \"3ff1caa1681fac09120eca307586e1a7\"\n        },\n        {\n          \"mode\": \"aes-192\",\n          \"key\": \"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b\",\n          \"iv\": \"000102030405060708090A0B0C0D0E0F\",\n          \"input\": \"6bc1bee22e409f96e93d7e117393172a\",\n          \"output\": \"4f021db243bc633d7178183a9fa071e8\"\n        },\n        {\n          \"mode\": \"aes-192\",\n          \"key\": \"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b\",\n          \"iv\": \"4F021DB243BC633D7178183A9FA071E8\",\n          \"input\": \"ae2d8a571e03ac9c9eb76fac45af8e51\",\n          \"output\": \"b4d9ada9ad7dedf4e5e738763f69145a\"\n        },\n        {\n          \"mode\": \"aes-192\",\n          \"key\": \"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b\",\n          \"iv\": \"B4D9ADA9AD7DEDF4E5E738763F69145A\",\n          \"input\": \"30c81c46a35ce411e5fbc1191a0a52ef\",\n          \"output\": \"571b242012fb7ae07fa9baac3df102e0\"\n        },\n        {\n          \"mode\": \"aes-192\",\n          \"key\": \"8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b\",\n          \"iv\": \"571B242012FB7AE07FA9BAAC3DF102E0\",\n          \"input\": \"f69f2445df4f9b17ad2b417be66c3710\",\n          \"output\": \"08b0e27988598881d920a9e64f5615cd\"\n        },\n        {\n          \"mode\": \"aes-256\",\n          \"key\":\n              \"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4\",\n          \"iv\": \"000102030405060708090A0B0C0D0E0F\",\n          \"input\": \"6bc1bee22e409f96e93d7e117393172a\",\n          \"output\": \"f58c4c04d6e5f1ba779eabfb5f7bfbd6\"\n        },\n        {\n          \"mode\": \"aes-256\",\n          \"key\":\n              \"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4\",\n          \"iv\": \"F58C4C04D6E5F1BA779EABFB5F7BFBD6\",\n          \"input\": \"ae2d8a571e03ac9c9eb76fac45af8e51\",\n          \"output\": \"9cfc4e967edb808d679f777bc6702c7d\"\n        },\n        {\n          \"mode\": \"aes-256\",\n          \"key\":\n              \"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4\",\n          \"iv\": \"9CFC4E967EDB808D679F777BC6702C7D\",\n          \"input\": \"30c81c46a35ce411e5fbc1191a0a52ef\",\n          \"output\": \"39f23369a9d9bacfa530e26304231461\"\n        },\n        {\n          \"mode\": \"aes-256\",\n          \"key\":\n              \"603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4\",\n          \"iv\": \"39F23369A9D9BACFA530E26304231461\",\n          \"input\": \"f69f2445df4f9b17ad2b417be66c3710\",\n          \"output\": \"b2eb05e2c39be9fcda6c19078c6a9d1b\"\n        }\n      ];\n    });\n\n    test('passes aes-cbc vector tests', () {\n      aesData.forEach((aes) {\n        Uint8List input = PDUtil.hexToBytes(aes['input']);\n        Uint8List output = PDUtil.hexToBytes(aes['output']);\n        Uint8List iv = PDUtil.hexToBytes(aes['iv']);\n        Uint8List key = PDUtil.hexToBytes(aes['key']);\n        Uint8List encrypted = AesCbcPkcs7.encrypt(input, key: key, iv: iv);\n\n        expect(PDUtil.byteToHex(output),\n            PDUtil.byteToHex(encrypted.sublist(0, 16)));\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/crypto/encrypt/pascal/ecies_crypt_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/ecies.dart';\n\nvoid main() {\n  group('crypto.encrypt.pascal.EciesCrypt', () {\n    test('can decrypt an PascalCoin payload', () {\n      KeyPair keyPair = Keys.fromPrivateKey(PrivateKeyCrypt.decrypt(\n          PDUtil.hexToBytes(\n              '53616C7465645F5F1CD34699BAFAD73EAE8A574154F08760BF8E8B9A554CA9691819BA06962D4A3774B9ACADA4B75471A85A10B2C418A56B1AFFF8F560AC6F66'),\n          'test123'));\n\n      eciesTestData.forEach((d) {\n        expect(\n            PDUtil.bytesToUtf8String(EciesCrypt.decrypt(\n                PDUtil.hexToBytes(d['encrypted']), keyPair.privateKey)),\n            d['decrypted']);\n      });\n    });\n    test('can encrypt and decrypt a value', () {\n      KeyPair keyPair = Keys.fromPrivateKey(PrivateKeyCrypt.decrypt(\n          PDUtil.hexToBytes(\n              '53616C7465645F5F1CD34699BAFAD73EAE8A574154F08760BF8E8B9A554CA9691819BA06962D4A3774B9ACADA4B75471A85A10B2C418A56B1AFFF8F560AC6F66'),\n          'test123'));\n\n      Uint8List encrypted = EciesCrypt.encrypt(\n          PDUtil.stringToBytesUtf8('test123'), keyPair.publicKey);\n      expect(\n          PDUtil.bytesToUtf8String(\n              EciesCrypt.decrypt(encrypted, keyPair.privateKey)),\n          'test123');\n    });\n    test('can will throw an error if decryption fails', () {\n      KeyPair keyPair = Keys.fromPrivateKey(PrivateKeyCrypt.decrypt(\n          PDUtil.hexToBytes(\n              '53616C7465645F5F1CD34699BAFAD73EAE8A574154F08760BF8E8B9A554CA9691819BA06962D4A3774B9ACADA4B75471A85A10B2C418A56B1AFFF8F560AC6F66'),\n          'test123'));\n\n      expect(\n          () => EciesCrypt.decrypt(\n              PDUtil.stringToBytesUtf8('Hello'), keyPair.privateKey),\n          throwsRangeError);\n    });\n  });\n}\n"
  },
  {
    "path": "test/crypto/encrypt/pascal/kdf_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('crypto.encrypt.pascal.KDF', () {\n    test('generates key and iv without salt', () {\n      KeyIV data = KDF.pascalCoin('test');\n      expect(data.key is Uint8List, true);\n      expect(data.iv is Uint8List, true);\n\n      expect(data.key.length == 32, true);\n      expect(data.iv.length == 16, true);\n    });\n\n    test('generates key and iv with salt', () {\n      KeyIV data =\n          KDF.pascalCoin('test', salt: PDUtil.stringToBytesUtf8('123456798'));\n      expect(data.key is Uint8List, true);\n      expect(data.iv is Uint8List, true);\n\n      expect(data.key.length == 32, true);\n      expect(data.iv.length == 16, true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/crypto/encrypt/pascal/privatekey_crypt_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/pascaldart.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport '../../fixtures/privatekey.dart';\n\nvoid main() {\n  group('crypto.encrypt.pascal.PrivateKeyCryptor', () {\n    PrivateKeyFixtures fixtures;\n\n    setUp(() {\n      fixtures = PrivateKeyFixtures();\n    });\n\n    test('can encrypt and decrypt a private key', () {\n      fixtures.curve714.forEach((c) {\n        PrivateKey pkDecrypted = PrivateKeyCrypt.decrypt(\n            PDUtil.hexToBytes(c['encrypted']), c['password']);\n\n        // encrypt and get private key encrpted\n        Uint8List pkEncrypted = PrivateKeyCrypt.encrypt(pkDecrypted, 'test123');\n\n        // decrypt and get keypair\n        PrivateKey pkDecrypted2 =\n            PrivateKeyCrypt.decrypt(pkEncrypted, 'test123');\n\n        expect(PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(pkDecrypted2)),\n            c['enc_privkey']);\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/crypto/fixtures/ecies.dart",
    "content": "List<Map<String, dynamic>> eciesTestData = [\n  {\n    \"encrypted\":\n        \"21109600A00002F5441AB2530130FF8CA8CC9C2737E34C35EAFAED908747E93EEA0D890E774AF9B02198396FE01755965ED87B0A00D1AD37A52E77C735CE0EB8FA1B92FCCB92AFA37DD88854069D57707E5FCF6459CA3B98FA6EB2B52C52C53A6B6768862E58C9082DC7B59E709D8F347184C771A4BAF2709FD84B89868991E21FAFB04AC3E0C3B0E0FB630671E2B7CB2F280032ABF241883626932C60E324802C57F7D4733D47FF415F916CCE69B7C0A416FEFA048FA536BECF3E9EECA0F1768A35C3FF08F6FC24CAF4272457AF23E2028A3050519E94\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109700A0000328EE5EBA3FC11EB9ED4FF81492EFE85F4FACCF9007CD55189446906F5609261064D41434524940988926A87DA6EE5A187AB59F4FB81CB2E4ECB8F848CB10B1FE3FE7DDF5B48AD52117DA31CAEB547BAB7A2FBD0C2EB395206F0B7D3FB10823E7BC78B997B2939824571EED01CFD69C8912754A20EC12897D69C7FDE513AEDF2F91AEB78972BBE51D2535E592BD852927C5517616CDFCE220F85C78B549FA14C3AEF9C2D85D7FF0F05F9854339C03065222F79A625FC20197072B168DE8024368C48EBFF1091AFC210325C635AEABC685\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109800A0000361D2638E2F96A0107506B7DC231F9EA12617B67CFF4218395F315001727F4C2B5F90BB73F43FBD83FBF36938A61930D342080AE3052B43FC9C38098CD394B07CDBAC33FE9FEA55CBEA4D4EF3909802DCCE7F0EEE75846D2FF092C56079696FAA143E6678969FF2924B52BEACA3FFF319CA186B884598D67678FA7598AA9BC9F8FC6910B38609E4AFEC08208D5E992FBAB0E7FF92BFAAA4AEEB5FC2341BE6F5862C4656656896FAC01A41E690CEE89DB05E51C818B49DF2E0025D44FFD7EDEECEB7ACCB471626C035E833799216AB5EBB\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109900A000038B69A3E98F70B03DB7B0A6CCC9F22D67D727A728A50E035E79B505D43621A8045EC09802BF614324A208C45F075E0F0A7EA05EC924A9B7575D40EAAACEF71158454B64FFA9256FA232668652F0469873C3F92F9FCC59B908D6DD6BE9807A69751322750D9ECC67B762751BA9EF53AAD4DBE1A1A433727FA420E3BC1F1B41C97CDC6EAAF7CD11B71727420295E4FF6507BCB7BA255942B7183BFCE80B5ED2A6CD12B8D06C284B8B700AA2CC3BD0BFF0EF1A0D0D83E034BF882B94AFCFE79683A70486D01DD2EA8AA6D4DB5A8F8AB0C4DD\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109A00A00003D51575543F97BBDF5EBBF1923D83DE66D5FA4C643618C11D2CFCA1B9E3AF873BDE3EB2EBAABC735A64FDD21626FDF95F5C17E12EF70C1E1CFCFFE14180F87C1FEFFDBB304E84037B01700B0C5937D6F8CB3475CF1ECEA474E52141C89D28B42C88E672F8F6D84851623CF441FB7043C5569F7A90D171381EA563D85A6E5C7E08722B9ECA17FBBA128E95FD46E77F4F39BF711D1A9DE129A0F6CF43D07FF95A2F3CF6632BEB87B60E8ABB5FD3CCF551F64241D7C3163A2412E310DCE6048D577C83337D33F5145824C48FFBC513981C95\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109B00A00003C80AE7EAE5C736B7200609B98191B93C55DF8CBD9C181234BAA58428650798F405147A3E3FCB9F65830D42E1142823976888A6F3D292ED7915B53297429F8ED08B84D9368AB366B5BFFDD09330162E016FD3F5DCD76434E698E26C92E84D511011ADF8B3E07CA64800291FF671119FF0B074B7755644CD730ED5F0E2364F6393AC1C04D466EB686DF1A2D5F1D4E8CF9F4A306EFCD459FB0D97CB5F4CDD67B790D85D66FAFC52549A1B0F863AAA83D64409300D63CC0C1A85423712F715FA13F456DE82DBB15E99CF48DD331C7323A86C\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109C00A000025CBEC0F4505AD429CB0E2BB349D7BD80221E961B950980969F42F6C054519D4717916754CCFE1E41FE41769A620122D021102886FDD54B9A902D16E435FFB779F5798AF6E6D7ED27C992B22576A92F73C71BAE8DDF9EB39F7C3E7020F2CA5177DDDF3C6E6F673069D67967D694DC4F661DB68B440D0EAA87541996CAB2C10F0DD47DBD54E24E45EE19C0467C4684CA9C7A668D20B4516755F18ECF63B7BCF2E1540754FF2BE116108DE71615E26C4507C4C7027983FFB45E8871C52EC251E63A645D25033D8C611BBC00BB91E1EA89F5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109D00A000035F3794C9940A3AA167C2EF173EA93E0CCA9C2DA18ACFE1DBA53A11439D181D8C338699BEEDD5373A649814CF2145033A57D3A5955A48F6510B38E606CB6C763FBE983717144CED18A935143B171135A32649913847EF25DE48816581D7B88B300F0AC7D7E1B5EC3C1B81E58DA8E10105B957A5D81461756499B30DF39A0EDA33B3D3E16330C93BD6DA9B695783C7A852B7212DD94CD5596EC96853A8AAD10EB3A4169C5964C0A4322A4437D344025A3DCB701DA483FB387E97BBBA9EB55A7AA98DE6C20449B7EA5BEEB99510272B7EAC\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109E00A000035D3407234CDE57B8AA6D760381FC30AABDFA15960923B82A911BCC845B064D8EE69D7C96E90FB8357E06302EA2BF69409F6F986CCA4537251A21551C2AE3F619FB860D9A8D19E51F37FB12F73A00C9AE9B6D2C24326EC2A2336DEE04BB5384D3048D942664E7D6D8B0796C1C16D84C0BEAFFF1EC4FFD5A437F93845905D8CEE1B053E92DF277E9AD63648DC31BD70A9769168A8A037299CF38D5A7BE2ADB50704634E955B0ACDDC6A1AA2F701B32587A356A1B96CFB917DC4141EA1EA45EE24FBBCC246F4F4A07DAFA00B6621B557625\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"21109F00A00003B6E5B25AFC3E13A0698E41E0EFDF66D5824A1A37D5C6F809A2A96E75E943906C4D4AEA11B5A66313607DB383B532358810CF3413178C0D0FCBAF003759517DF1AE567DA4063BDB4777E1FFAA0C8CDD6BFE806FD9A7A8B5F3DE1D4B3BE51A80591F60F77407081E7E0529A50603619B31919CF9ED6439CC09B61B0829A1F85D9A97D1C7D861CE62996B6E9E6DF314C538285438914B718BF7537559061AAB838AF6286912ADF2583E0D86084C05B086A78E70E6B3AD5E71F1C9246219FE0516F52D3A0802FFFC0AE3B2F37DD576EE7175\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A000A000031A95E74485AFF91F635DBDEBEBF0AEF70C3CBC1B8D7C872881B715E3DC34A5CD5ED3DD56F5E4AAD035225E0B0A0CA0897DCFEB00139140F62B798EBB352279E461A0D35A8868476A8C10DEAA7F83E7ACA5F0C30E0E25E5055462D0D411B4D20B974A4D0D82F8EFD566E526954FE15B34FDD48A5D1FF7B2279855156A69D20D2691DF735538F5CEB77A3FB7B67296BB53A4DD199895DF43C7A992A28C1E5400478722F1A61FADD220C1632428945D6C803A2D5766DEE19D38765852522A38B6E75D561318FE86B877BB52B3C58E4DB9C1\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A100B000025693FF78AE08E71F5C6AD98483279B3FEAC64B842F40B41C094B11328DD73E994810F21F496A13FBB1DC45428BBC4DE17D7BFA9B38DADDD68290A6D7F7CBD3DE81BDE51F565425C77EA18B079B8454D64E1217C064CCC8DE29F5BEA064380CF098044534CEE3DBFF131FDF79DB4C6D02E16F4012E244C263B8DDD77066A698392FC301E3FE93EFE0E2B9884E98EC02C63B11B7AE3D11E0F1F1F53BEE73E1F9FB16381F29D2BEE2E74165AEC46B88DAFBF97413284153E93D2C2FC0C868004FE7456047E698F05CFCD3B410735E9AB23643D689DDD234C91089965D1687C98ABF\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A200B00002C8CB4BAC2A0D5A44BA198202F0B807A2140F278FD339C26897400ED3E24FA1BFFF6283B29E1A6CA750489D85E8BDC6F2AD7BA211A1219C35A17B5A30632E4198E89C4095CCEF7DC24B75373D14A6ED653928C393FE9AFD462924F9B3E8D2BA9CA4CEFB552B3B5A92961E5541CB9E901DD5F2C964C5621E3A0BF3038D0AF34B49DCD84B9C350622826BCC8FF265B8694FEB4F8440669C9F534BB75BAFC60AF680B1C334E289E8276D57E9CC1AB26EC9DB7F609FC7E81D58FB58E9A835050415EF5C55FE97F5F2D42B3F8095DF22A22CBF4BC0372FED680E039ECFA5D74B133860\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A300B0000285E7BBA7F35B7225E01B92E4F9D29255979A199CDAF8BE1368CEFCA651687B399BAA18946E2B62D5455CC1AA18E2C0F40D94068EB026ADFF318F632E8F40316C0135A780B55EB8183A9B67A9FB03524F86A37550FBF38DFDF8C93FCD734330E1B69106AE2F5C84EB342B3B80B258C69A39D5165B68EF3CEF31CC03449620B8F39DAC9C49B72AD8DA004F8FE58A9C3106A073483121F951E8A6BF7449FB818AA49E90C75956420A47FF8E77191202D497231837FD5D717AEBB1202C0BC2A59E115056624B46A9FFAD5EE310E7AC0AEE94406EFF526DDC367C8BB8715DDA3D2D15\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A400B000031B1A06085B30730C2AE5D78AD43A45DF38F7006908A98C0D02C62789D2640E4DCDD0A4B172A74E61DC18D9E851E02E1E589AE52559C22F5941602BF5EB7B0F4337AB3858E0FE614A5917FE7CE0FE222932F863629924DC6904552C1FF580D115239075A391A190303F00A02EA90170722E490015A2FF1A8D7842994DF145666FD702279750ED093ACC03E09B8C423C821FFC81AF556398EBD5362AEBFD56A06D2590357C1629FCB48E14E85E9BBA73747BD057A2CDC07C5F526C6BD52CBF027EDA986D061384029A863C22A8B5C3BD53B653F422829CA3E8013D0434E0D389A5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A500B00002F9212FC6DDD56511AEBE4D2419D81DAD3845137610AEFBD888A740AC8337BA746766A17B98D6AC2D65801DAE23821836A0F46F5FF19813FFCC5B40710677208CEDE835EE8EC2751DBD4BE18DBF86B5C389ABB261BFA4FA9F0E11D30542281FCAB55B4DB9B5D288A1B10C2CBC87434FDCD405D94698633F3DB86440736DC81633DBC3846D57A99F9BA17D7D3C85993A190576E4EA338F99C9338A066EE7A6798FDBBDB7AC606A65A708B6DD47CC30583988F56E92F7E9FAC2E152707B774379063B4A1F803AC071822C5EC9A97D8E339ADA3E3C35AB430E42CA201719C3DFD2C9\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A600B000036411A55FBCA66AB20CF23E61768F42BAF053F1D29B631770A7F14F34C27C7C11D7C3D1AC6341B5905EA192C1BDB722EAA400B74CCA921BA27DD865B111D53A7ACC4CD2A1EFCB0CA8D7DFB682E9DEF9238A2EC46CF0FB44BA04890D7FB0434CD7CED2009E7CFBF054119DD84F3951EA5C97F699CA21A0D257A7C14DE38AC269DE497C645DFD9E6C73D7B2B1C0E67C34EB390039464B0ADBC2E04FE62A0EAD7B58ABA977D4DD2432E6751E2287BCCC5B445D4C7D1F2DDBE3B63EFC1D3984EE60ACB88458127391684BE661649E02BAFD42E8396EDADA7813AE76938B964448845D\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A700B0000298A12D4E3928D902B142C3602F827BD84A12ED9C5FDBB03EC76154094C84375E36D3A7CC52BB9ED5C6A45030C9A0D5FB42A14A07DC188676C8806BFF6A8C80679A7375781BBA7E963A670261C2DC9242C33B014BB59F2F85235646E10C4B613ACF772895D57C7E82BC67A1041135D9551F36C84FC298A9320396B68DA68D6466AA36CF05C61D3583346C1CAAC0F758823A650168DD7B60004EB72F048F5FAA42F97E2406E39CADDA75B327D9EFDE8AD56EC801EAC05BDFA127E8E8A0915E5FE76A2A6393338492106FC17560170149121E90B85F8CB3D4B26B02D651CFBCAF83\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A800B000022F276540E5F963A5BC91E0DDFD2D9634D3F2C9B5D3513DFFA4760EDBD97D95413A5475ED68456CF9B2CF72E1433873EB963AB540ED59247AC03C9861228F34FD832CF9F7AB4557C9C048A59E1CB50545E1B2A3E84C46A0C59B76A85F57991174B39BD3811FEE00461FA042B983AD2543BA3903AC35EE9BB7E5ECA577138A055233C6A0CCBDA020A6B5D1FD0F0B2AC5CB74EA0180BF6AD53494E6733F65065734C46BDBC586C142FD1391C908C104F926E848AAD328DB093CEAC0245AC924A9E418529A1925EC166E29CCB2BBC90DE5C89A2A4EAD9E79D09B6A9F5AB8098DD7D0\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110A900B00002A365139F5C29957ECD6481A1BFBDB0AAF814596FABB961043D230C86A951E71B5E58C2041BC66BAC58B76AFC40265E01518FB1AD9EE3423FA57E12BCE867CDFC03564E696ADC2355A9AE0235DFEB06CD0FA14FEBB25BB2432DF1BABFF95ECADDA3543A5C27F1D431016AD7C3F9E6D40AB0693D0D442779245EEBA91DE04866E5AB473FED5E2084800499ACB8A21C5BC10A5EA010C3DF393B85A240BFE144E3013797BA2A7A592C6999F32DF19EF6A1C64110689B385A25EF46B793D58355BAC9D489387BBCFA5726E2F45692B9EFC1F66E814CCE6EEEF530F70DFA55852C6F19\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AA00B00003A96F3F2E08EC5BB9FB209C347DB786D0E00CA57A7B589E848FC1E3D601D8C9846C244DA1E64B081710CF51F78B8C508D6698487B390FAA98BBF416D084A5B10DBBCBA02880445FD10D03DADCD2AC80442AAC0FA88475FAF53F5C9D1EC0C557A0E57272FCD0C361D544653E821A2A77EE229BE131E8889AEF2073452F7E1F8D7DC389A50B482F9A75DA42810EA59F2ABFD3378F490158F5B3DFC34C765C06B7A662D2AD2B5D673CC1AF4D78EA7102625DE6EA97589BD9A85CE06276913120F59DA8917FF31D01C550D933D6CF24EA61349BE70FCB3F0FB0F8DA20FA558F201D44\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AB00B00002EE3FEB28A7276896FD8C50E3C73E2F3E48BBB92D2833DCF6564FEA7F635715E7EF6934F26D5FF228C4DC845403BB370B196DED49D5D64E1F30D0E0E79D2A92F4AE1D3986AD3BC831ED6456E0044293C90563786F04C04D82B0B124FB879B37B388E6211CEFAF626655860BBE78EFA21158B7EDF41D6B673ADB97B2D88CD109D4722A4CA700EAD277094456753060421112F07B68F5490B6C76588D7D7807F821FA9BE66673B1B39284E38C3D7A52F73A393785E6B0B252C64202291D53ED6E25BD8ECAC8C22B16D13597F3B612E222CB5343DC6B409D82E73B11AC13A6F7DD5F\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AC00B000023909AE7DAC7F9A978ACF4190E4EC8EB03B953C87C0AEC2E21F7895A63EEA5EE8B32B8D692849F591FDED5B1CA0FA1DBE4E365568DD3759D7A8869D0C12C3412E0540902EC2A2C82D11CDA3A27F4AE9709D1D8F08FC02A00F27BC7072F4E8139E9DD777FE76BDD291043C9EDF3F64EE53241384262D00518FB78264D18050B6A83A2E2B89B8D56ECD2939FB5A8E6546B5958C32249830EC91C71E160A78F368E0242D23506D8A0809DA230A672F8E2BE9FE18B22BBF92522A8DAF157A0EFC8A913AE67E1F8C499363744B89ADE51C047304B36DB02E3DD0414240619AB7CB2979\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AD00B00002E3012FDB1D2E468A6F02DC6C67995427A6E7937AB74BA988C73A8F8C1C0A545BF738CB86FADA287D29EE57EE0E805CEDBA1FC0299A0EB068C6CD252A87FF8A6E0B01A1F300496903314FD1EEDE0C0466F563B245BD53DCEC57EF21C21465F5AEDEF6B0F57269DE97D020503E2CADE1C8BC428F2A7AE1943754591B4BCCF0C9973530E8938CF83753E0B2227363DAD9E4E5C0BEFE92D0D5018118A48538295780B1D9F67486E7E5B3D401B4C2271B038132B3D0E6079D45FBF175FE5AA29E7030ED1274994BC0ABB2D1D7CE063B5BC6224F00C4A610B39CCE093764DAC700E206\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AE00B00003C43AA8C428A814FC2B36B2874DC38AF5BA562D7CAD256E7E01BEB1C7701F343916E98D59019A8D082B1070FF44175CCCC6EB2A96774B178641EEE5CECC23C86360054DC76BFDA858DFEA3AE121C1FAE58514CFC6E328499F989245A76143263DD5B9F1AB3A9AACCBF8F4721F4D962DDCC916CACB0EADB9419BD88B798E7344219AF4322BC91FFCE9DE3C1E940A25F738D1ADEF42EFC150936B6CB7974AC29B43AEF9C0133EFBC465FFFFFA9B48DA6669AD7C42A8172CFE3D2D1CA2EC4B5021DE9D4F68C7177ABCFEDB77B2959B0E625CF25A04556B643D0163411D762603EA39\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110AF00B000031D566D01B1A5A33C8CF06810EBC2F2AEC0AFDF147C49365BB5E66EE1CFAEDB6B53F4E3CDB7F8777705CECAEA2A4DE114E68CDBF9ECB18FD072A0FE425DBD0208A323D4BF3E4D0EE96BFFC7945F89DF1F62DAA8D4991E705BB1476291BD731D0F40C64D47EA5439CC1AA23EEFEBB3B887361750EBDC9C9F1503956CE9BC803BA09ABEBAE5D03220CAA27B87FE921928AF21080DD070B65A3C8C862312823AFB6D66466DE6E00144AC008EBF40564DEAECF63288E1F5938455B304085C594A18ECC56AE334780EBC041E2DA69AE3E8C97EE69AD430D65646A1FECEB52F8746ABD2\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B000B000026C36931463B13DBE9FE5B9F8771DAF99AEE55C23D6391752E13F79BBAE32BD604977AE7CE4D97BBDEB236A1A54AEC045CDE4A5D3E945435AED28B814CB2EAA5C628C1DF6C8BC165E0608C9B916C6381134AF02562C6521AB94C01A1D6D4709E5C4447ECE9144D322093D240618D7C5F31A86BFBD783E9C5A073900B2979DDC16A8CB626357013C18C8CDD0F4A2BE55488AF90F2D11E0599D2D03A5817EFE4093A8580AD49365DA75C7DF17D4AEB47C4F4E7FE9A3FC8D0D324EC3891B0F4A90F379BB9E5407524D8C7496E329541A1BC11723D9AD4266E42862FA4D98321BA8B0\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B100C000025F1C0E37FAB6FDD573841A1C1A4377B039F7C2DE61D796AFC15FE0467B7F15F441282348A4A17789F2EC903E029E2B93C07D1BB2C8DE6433DB3ECD5C93844DAF8F7B758DCE485145E3BAAD5E0AA1F9284B274475765F952D0BB00BE9B1E4A5C684474F4DE7DE402B7D0D2BA11667876C6EB99C0D9DB3AF551EB5879A81DDD4D6C75A107E71E87609552233C2AC4282BBF0EC5470F1E40F2E53EC1DA2B1F0562C077513F1FEBB34F843EE844FDBAC307938EC3A79B8B268F97F4791D30249740B93C8EBAC02D4D2828CBDFAE29FFC6D769252D2A1BD5942313BA7945F7A7E6B49D20CB54DABB7C94DC774EA622678820D\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B200C00002C1719E153B7073803E84FAAEAEB0A04A37212EA4481F94EC5D6732A8ED37E46B2C18C4C3449FFC4D2598874C40FDC55CED750A37388B45684F90EA098419F6EE2A296F930A2D7531C4B95702779E0FA4CC0BC8FBDA086E8A4C149280A3F5B3041BFB63C9C31E0F4D1F812C7858D61A92E8172016889C623F1C9B7DEF39F35DAAC1648F4228AD8D1A93C72BA6928E116F0A463A23683723648C84A765BB56535FA518BB77DF823E45A42409888BE1A935EB5AEB447EC056686EE2DD1A665601E0E0FF892A16B9EC5B478DDEFC9BC68C4B26C5995A999179506C5CD0CD363FC992DDB05F9D605606F6E7D9565B27D484F8\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B300C000037FCB508B7D707FBADD9E4EAE88EBCAF3FF53FD2F129EA8528C1AE4F79B62BD0BF952A3C29308EBD64F0EAFE4B63551F06D74C9684B23D8710578DE54CF9314C3A851B54D32F55B04E55B8BACD6BB0FC7EBD5B5B1E5FB8B90E71E45AE4B8ECD1DB749BBA477E2A4D6CDD6600AC637853A7E1ACA1C78421D5DCA49C3BC98334F7CD0A2CCCF6E7AAB22CD9F23297F81610395D2EF52719E432DFA3930D2B2C74D749E880CBA7CB316FC2530A9B969659265FBE0A3B48ED381DE1C5F28BBC741D58D1EEBE502FDD25EF6093C85E187A507E25DA066D99EB8BC0070CE6D4CC65D4D3A675B9206A04A0B6233CE542389DC22E5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B400C0000233E8E4E8285A62FFC35945437F34FEAC4B438053ED7154424451C5DD8A409EA6B56081CF032B2EE7798589E690580E13164942933DAA5C2AF4903311427243C33989037552056147C0D05E7CDBB1C310344E34F74A24909D319FB58CA6D409B003ECBC2F0C73BE01E98B6D898DFF7249BF0A19DA5708E8CC058B213A69EFD70CB498239C90FAC0EAC0B0B9607FFDD44B82599FCC168DDC6164D95631F2AE6BF49DFB52ABB8E2CB98148DF967F00CE264972DE0755D01971F9602DCC4881D433BCBE421D3B64AFE0D2C58F9291F9812C05E9D49B133547E12FB45D7C1780B015B239260C584E1BEBA77DB2563076A85D5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B500C000031DF17BE88ABD5F52D04B58C6FB103D9BED9CE5137C4425E7A010092D38D1995AB3DDD855BD785047B653F7732F30A42E6684FA6BD8907EBDAF78DA41DEE46545E6C6C6A36E7DBDBD6071B2F03E82AD2D7FCE75A9DE719FA067B87CE026F4126E1656876925CC2E2EBEDE406EE35A47C53D9423415D79E41065975F13FA89F32C893E2EC7283376BCD0BE0E81924ECEDA064FA67E4C751E87D0748ABE1CB913416D48B71153DE5EDE2ED7CD55C82786896582DF76FC06BE60D4B2534FFECAE12801DDB682DE4772E77D751F3257D2056481DA3A5BC3ED6D563F0DC165F4FA54BE3DD424B74B72A882445CB9C5DF2A23F0\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B600C0000329BB2EA43B2CCA8A518B46663B560248673A297B1FF886C1128A0F193F7465F4497B9393A365238E381198EF71B226BD41F400F76960E9FD8E7530B1DC2AAF1064934890F0A9382A38473BAEDEBB403B9BFE114493ED9C9F1E2936CB4E5AD2124BBA4B34EF9D779B33620F9F79CAE73DC0543D98759D8CFF55889F4A959B7B764C0918C0174C878455815F820E2F4520101855F81C884F4A1B3551D0C83A22D50971725AF5E44947036043088C8085A95DC86D8D36F46D549B278CA4ECF9F1AF2600B28506FEC21E842772779CE68CE94104D8684C7811C69639FF04CF2C1EC087F75862AE5551C4895D278746A1F514\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B700C0000247F673CBBF000A37419B7BC1F274A9B8741C74E6C482027CB6700D63B0273F0A87DF3F2C40D0BDA643A68B05B8FCD6DC6EEA99977DF52004E05E5C762BA7AFA173BEF0D32357EBD1B9C0110210CE1D00C5F28D6A631F6C5EA4E999D860DCA413D894E0447FC67EEC7203A505E7AD1BD3416E17E2AEE4CDA60FF2CDC0314B2C8B26B2F51E0C33B43057DE5AA6C05485356436B7D9B65417E090235D4AC63233A5FD024385CE8B8460E2F5BAAE7D0D1A0D5A56F595E1E1E87A952D167529265D359EAC14174F37F611E5A3E1DBCEBEE606B1770AF29C6D816F5CF3B250B9E2091FB43185DFD25BAD075667158F17173C62\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B800C0000222E43CDDC775E2AAE4C706CF75938341925F69188F158F73F57D9FBC6CC7714787A5D63B003980BC085138AE982E0AC7F1B9DBE2A362E0730282511EE1A6945639A4C24929FEA686F6D5BB13073D339E7214AB39D72DC8B1382B0F467A403FAF87ABD8EB912D966123A7513DCDB5DD4A39FDC366DA83ABA547676CFCAE3AF0C422B4AEE8703EE31B0B15E6318066BCD36A4B7BC92DDB922113EBE21B690C5C0E9ED3DF9109C8E29B114C48F856E7895DE12DC8CE29B26A236491CEAEDDEC2310DEFB5BF205D60311F5084785B956FC6944793A0D0A887B1795779383EB74DA4F8E0BE053B28255C35ABAF5F3F90A61A4\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110B900C00003B0D6C26A9595CA3690A26057227CD3B18D38957ADFCC878912DD6A7D19523F9A4807746CD904D6E1C988DB2CD24B6A1F6A8FF98E55EB32EF5043F076F1A0426C30FDF70393CED8CF60AA278529740E73A9BB41FFAD39103E7B897BEACC5E96334A4E099E507F79DC6AFBFED51D16CCC3DD18F55ACEB8D9781C447073265008CBF4FF880F84E65587B10390195CC97FFCA8A2EB36E3CDFD841C0992DFD2223B80EF5563DA3D3F7112ED645005CF4E8619D122936EC55DA4F1C82760273789F44B89281BD37E544D62C9136D6076868CAC3A59A8BEBAB45762371F18F19372BA8DE4763CC58335FD43D403A6830E0EEF2B\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BA00C00003C00B795287AF8D9F47144197E1367BA8A36DC387153516419C32C61A03A2B14D18317999DA96331B09C7FEEAB496AC16E3A665715FA180EE7BFD266BEFA0D061635F66F2087E74D2101AC1232680774F10710CA705757F2D9C9AEBA4B598DA29C3B390064FA38BF829C9ADC91F51031AD0B0B302804213BE526109146F5A7C2E02CFF9A2670A96B5950944B4DB315A8292EB0472468EAAA37A02D4DE134F629884A01A9AC0FAB5269CA29545C36236141677BF69329997634C57C9DD821F26294E27E1D53202B869F8453484B014D49FA848DC0A5F2C2B5D93649690C40B3C68A089B1FCE1569ADBB7283CB615CEABDE\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BB00C0000256D1F43BF111FCA31FF8CEC8D478108913ABE1512E65AE542740876770A976B6B3E6959796553752A3B4D86939DEF0E0BACC27B4EEFA310A73FCD468C48BB47CDFEDEEF3E8EEAB8AED713F60B82B38CA519289FAF7FE67DCEA980A09CED7E901915C810B842A8402432A47C2AC32420E28A8B8F855BF3A6E659839A79638F14C2DEC5832139AEF185B4010B023B2A14F186EFA33D25B3E41D472A41EBF27E1DA97648F14A6CBE93836A95723D3CF2F5BF465FD8AD723CFA564A88D37C568B1EFDC22C663D1A7019BD3F86C2AD05C68B56CC57D7DB1C9D25E0D4B893BA387E093CDC4BDBC617080F430D0652F1A8D2866\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BC00C000039266D02E577FB8B0EF58865C59007F4428E28F215DEEBD7FA545BE474D6BA8E080FC59530A3D2EBCA71C10B7CDF8917110B2A3BD22425E4E8CB82C847E175530A1BFF7E7CDE54F2632B554D6471847BDC4B3A7F3ED1C8A95D66642DF9FE5894453F222B9C0EE62BF9E57D4899050B28FF33E3CC04EC3AE904927297A67B33D916A15150653AE278ED7B6C778BE0F0441A08F638DF6221C8F2FD18372E84F6BBE23FA1E77D08651C211B6D354196342BB8571F09753897481C55A2DD2055A99A9068A0D1ED9AAE2A2FE5087A98A6798E8264362370A52F34690041E2F69CD38C011668E4EC6BD270C98CD8F711AD7E5C3\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BD00C00003A9BE116480308809BBD0E5D4B07EDBC54F4C9D8F10999288571A56A1F8DAA1386B704DA270AA27A1B6A5D0D4F39E7ABF056934FB677F89D46F0231E126DCB01BCFC27471DCEE3365C6E4EB0D1A7AB91D5A5D001E88F8DF022863322E797FF0DE85A51051BA14670CC48E7E64801649BE21E0CCBDD3B08222AB1F3D1B66A3EE0FD13C9567BDBE9C3318B8DB256985B0B2CB7CBFDDBA8BCE7A401405CBB9CA8449D30CA6DE056CFCE3BF7D16144FA50D0F12858FD894D2CFF8A501C046CECEA6740315D1A938F53265B8B1B91AD1F33BF6A50272AFB571FE649B47B13DC4DE72BF6F87256000F294988187D86817ABB307\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BE00C00002207F7834DE34868B9EE12AC3681125A0F0041E774BB726195A47875098D8E28DA389FDCA50D7CF65C02D1D9D630A0428A70548AAED48218D0DB70A9FED6F43E4201785C9CF12A374BA759AF02951F51BD60B629CA5E97DB9F282D831FE847165C11AB4311EE68B15B5A8399D93146E9D54DA6A815FC9A0194FD2C86A93CDFB93ADB7176DCB4A3E5A8C24F949F95E8D2621E9E1480F4FABCCCB6528C0D4CB1DF34385DEC659435E187454296A637D3F71AAEC73A5763AADA25B02348BF08060F12BB00217625D028CE33C68CD863F3048E31F325498900266AE46738F3E7A26B327F2EACB22384963E20CA256E3D2B889\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110BF00C00003529441066EE82EB28EFCEBEA845CF4DBF11E668FBF3454E653FEAD8496D2E91CEAC406DB2ED68B9533774682399AFB25382BF99682BF076FDBED5C96FBDC33F850998579302381E15FB626ACADA877C558FB7835564755DC4F046181F588A0D7503F36F5416116608A1ABA51D8CBEB5BD1DE8964E5F43EDAC232C6D8AF1AA81A350AC01E39D924D6CCF96B9C0A085C0272DD70F78E8227577BB336275D23917E9A9E3F20D862379508DCE6DA2D9329EC5CE9BA5B72988AB5C95EB73FC13CEA83F833F6C778254ECEB3039CB9A97BEDB2C146D7A4CB33ABBF44CF63EDBF88E4C03320E90784984011EAAB9AF816CD1D86\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C000C00003EB72D2D4A8B3D2859692FDB66EAACC5E77C54C3D2D5BC516DE5A7C4A3401695304F55C4A32BA68964B2CA9A1F1F1F8537620EF728BFAD04ECE09D20518DD27DBEE077D16C778B87026E5CA48E7B78FE18C151069CFA20507C72BDC56FE3B1A5CB154E5D2C28429AB3B8FA35464B839712E1C4149F57DBBCF9A17ECB96255875210277AE9C4CB2E81992BF129A3B4D4209B905AC878043C0F6F1DCC47A2CA86003FA74BE46258691FC2503A3DE6BA4024988A8010891BDE994F5518642EB9F7286B3C1BAA76286C7351D6DF9998A69AC5038B55BE7908411D8C4903E6437904D6727BF3DA2043E17B47130BF0D13818A4\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C100D0000209D4DCB3B7E7116ED6847BDBACE0A7F23A1B4AAEBE40B6C85BA67B52D22EE36FD200A2CD2FE153C2D8D6DD5E91FD14303DC76C4F91202CFA37821040F78B4C8052F7A85317EECE9FD05A8AB20283C644BC9D8D2B61A4E7EA5A052CDC1E57C877E1568C41CD0ED69E59A7962BA050733EF01A368FBC7ED2EC234882A288253247E67CD0F903C821F224BEF78B4BA4BB1847FBAC5162B1111EC8523B486FEFF8332681275EF95B1F93B3D90ECF357AA92F89B6D679CE93BF3C6E31AC250E5E0B26191E47246EF1EBE19ABA5F01C793FEDB6D8AAAA244602D4097BFB5A5E4CFC0C0506BD6E9C1911092BFC12FC19179BA156E5D859C349A3C864226E2E80EC83B87\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C200D000020730DA494E2254141764BAF26FFE09DED42298A9FE5B4184C3FB0E5DABD0617B8300ADA39D2F7DD57B37140A2561AA50DA44135E10110C5EF996D27FE8CD37FBD5A01AE703D7FDE0F7823E088F8787B39C361101D4A1BCF4F032D078EFCB7076A31B6D2B1B17B89326B29FDCE1DDC842592744D555FFB256DEE0B28947B1FC13AB3D106A3F0076B6BC9A153B6926236BE9156D3DB9CFD7B1A4AEDBD5F472592C44E47163F10B9B71DA57DAE42B2339A2811E3B4BF9EA229B81AAF951325A6A9C49690D81EA6C916F810163E28D06334204077A0AEA6471679BD7884E48EAED23699B2A7108E29D2D8673631BC699CF25E0751B252061B72A355D1657B81129F6\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C300D000022899048D2829D3568D4CEE3BFCA948AF9D74B12ED057E85FA3C3FB780E802249B20E4B1E3DD6088DAB93DDA0390D382028597ED08D792F7DC034F700DC1D010880964F2C60947E639B64B852E902EB7DBE3F8F426D7A1A9C7A4C8BEDC0F784A235FA574489BD54260858CB49D3F6215B6181B076CE955A22FA1E73CE9F73E15502E24DAEA676322D05E0B6DDB990EFFA7614CFACE8DF4268F013A45F693D5830E91E2883C3A70B9487E55FA20BBBA0C6DFC47CBC939D8701E283EDD40D4B47941F04875158713DC404924003811A1D16A237C819D9112B72470F8F76FDF8F4BFE22A901491173B4829284AEBE77F84E281FA88D4A3935D1A2AE16EF010454651\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C400D00002AF79B20C7AFBC634C90F93FF01D55CDF5CDD523FA74C2AD14718DFDC22925CB5156C37E0B23DC4B5C1569D4694B960A443BA0A3C11B97C1FE3EE3140862569342B21E161BA46E69502CFC2EB1861058112C870158B40E700668620D6EBDA96CD01B43C883DB152DFA16A75879678EFB0876242DCB99284250E2410EEFFC7D6E39F8332B202E70F4F718FA3B24E6FF012CB39F1DA502DEFF58A92B3BF744D149B2F96796D200F8EDC244CA7E6155EDE4356AF78232212CE52E3677C42D8ECC30FAC5AE1E1BD92D5B81340D1B6B025417B055CB0C5F1449ECC944D45B96B11C448F830AE1ADD85E4F5ED003D9D11CED3B823A7967D45CA742293045DD61F3670E1\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C500D000039DB7D3FE54E9ACE83AE68C02E2D3DB879F41DA0963B7A4A25E6592014FDCC58AEE8E70F063FC5766C9045F54A28107E3F8A4EF203A7C2CCD41BE4543EAE0AF73FF35248AF455792456477E4FCAAFCAE903C755E2CFF500C7DD8200C4049990B86C401A9920126D811A67E256F7DC635E72F619352BA2D047D2BAA46E4A2E93FE4DFCAE3FB1C30E80C9EE292C53EAE64F79019948E890CCCB408EABD4A0AF7541935B1B337635E4AFF49A5643B5028EDA480662F316484C5A6E60EC8EEBC5FA6E24FEB071AF2486975E9239CD26C59F700C8D55281071F32BBEB5A776A0ECCF69684B6DCBC5E51E18127264A3AF425B53FCDCE6F191D123ACA9BF4D019FDBC602\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C600D00002C924A1CA68F027FA6FDCDCA1027E0E746A9ED145AF4BA62E965BC0CC35A4FCCB82CA3577998BAF3CB46D0F122AF61F036D5DD4C276568D5623E213D13281DC2B16375EBBB5F267BA0FBDEFD709F2F373AF8370664CB4249FA02DD673189B249B89181C2430998FEBDB909D50E8E7979DFEB6EC842F506C16A13979EB5D7BFB9A545E643D28C5AFCFC3496F6810E2C3E76209DDDEB3F91BE8C429E6D88EE6F842475341EFD8B45C7D8DF93D4C3757C3FAE95229A0A0E37698A3BE689171FAB6B847FD6F4DEED90C2F5C60CE6ECE2663ED4C88B165DA423D15F4376E5F0C7AA55F2ED22896CB2352F9B05FBE47741A69535161F832B41FE7AF2CED1AEBF02C8AD9\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C700D000035B477E066A252D1D14779CB676572582BA748133EC943843AD2E98CD8DB6A9B0AA5F289355DE3A6C93A4E18878CA509E495A966E2732DEF757A448FAAEBA7C2B875CD77C3618A73095777FEABF420779F3949FAFB1DCBAE7DEE86DAD31195F2032734D543441BFEEDE4C8419EEA398CF1C2C26BA65AC8B7F68705F9A79E51C69BE7607D90D7F4540C3A6AF8411081CDA6ACE9616358647092CD37E8ECC490F3A1D0B1D99F67F1B1D82A39079F6E0B4699AF15C8B5D35552FE8723B1A23C13225735CBDE09DE9DFA7640456D4E25A20B2F9F6F3902E3982156D734E931918B613756278F88073DC5905E480801E6E811A7FF68EE6FF85C7BEF2F6E455287BBDBE\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C800D000039BF0C49403D0211F0C4933AC1991B638D58112C298CFC66D77BD3C16D7D6180E193BCE74779B147C5E1D5A16D4E5EF309A1AB9E3D71AE72139F53A31A3AAB5A59B99016D2CCFB7D6A444FBB86F416F0F76533A07A32EFB078CA01180521D018893C2F7427783B3E174175BE80325B0CEB2CB9DDAFCDB59319FA5A3520A5EF856B4034639D73632ACD97BCEA3A4ABFE6CD1A0B0BBFB2537DACEF7FAA551776951A1F8197B8A51F47D8653D44A27D68B0B0C0021F39C6870F18116ACD7CB6C0531E2D320B36DCE0EFB6808208A575AA76529EBDB02980E7942E62C91D454DCC85B9FDD1F57AD52DCF10F74D97FDEC8F362AFA630DA0F7500E766A3AF78DD7626F6\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110C900D000028309598DF33EFDA54EE05A076B5187EFD0C1DDE0B6FC2F6CD9575763DB47DCA3BC2CB0400F736025C704C7C30B848B5940AA0B998028DF827BDBB7C74565B036D410283F4699B3C48015D44DA92EB918228267A510F438C090F0F6F0FC188B535563FFAD644289035F6A04091F31F5D55F147234FF69F9ADCB0BECC3EDD2EABFBE4935DF9B133DEEF83247ECE259A1E9D4F1D1D44672B6F49CD065FF233CAC858F085959E0AA590DA00D35714BCE868A406A562F35F1632E3C9299A66EA064A67D489EE930F1B9DF447FADB633461F00E464E475F5E0EBF61CAB3E57F6E2B1B8D7BF184418432B0C24C1A8AA9FCE0C4D8E629CD5BB93EDF47C63428C38AD05EC\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CA00D00003A50FB366DA44EC96A0D228439FEDA2C1FD15D8F8365BB34607021497B874469FE44B1494A9CB6BAF3825D0BFFB829C2E0CFF9C55C9423C1BF64255B0C07A644FF1FFB324BAFDB7266AFA82869A2AED2B2C5E1D9623203014F356A9BB1ED73ED3494195DFA0A76564A269CC5D36C8B69DB4F3FD8C77C1F1839C3275441C847E1D1BB8D45511B2C3E0C4500AC7AF6F66E986993F24DF8F03480417053464F71B66A18C4CC97AF67A1C7E7E68D62A4085DA84A0A689D3A2F348EFF14DDB73E7DC8BED66000115EF43F748F28D6F989AAFB720E4D341DCDE1D14CFA1CC7566EF039D2E3ECDF42A926EED5A10B2CED686B59CF7D7094E1277B52A1EA33BA6BC8E6750\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CB00D000020C8C4BE7BECF69A8BB863BA236204991366B446D27C3702494287D836D4E98E4DEF45A375CAF37CB87058BDA87DEA49B6AA65F0F0D523D2D163609E2299F2100717C5083EAE30519B3C5EA2C525DF5EDDAA2B5F89E0AD4CE7D5D0353793FCFF559A70419C701DB12A0D6833FEDE16280BC26B0217CA7D64B40C3A0B376E28605632AD49855608EB8AA4505BBBC615F034CCE66C20A75D1A791179264EE0B0AB373CECE469401B9A2A74E39D31D3C59A68C5124FE500DF5E9C26308543702EAB3B62B7F54870493CD1EBD5818391FA4239564C942E2F9725FCC78E96E5DF6C16C8E9B3995F2C23FB980F75F4C05E30B66A0273501BA4D0CA51AF68D4D05C52560\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CC00D000023D395D4F7A00CBE4FD3A6063A0933687EC57652472DBCF94EC9ACF8B32A4869A84977EBF1105C915CD499C0245151CEAF89DEFA61657E3182DE583944B3937B32E67CCCCBBD5F55B968446F74B3F2F86ECD6685EB901ED9B3AFD28D7BF1F1AEF43B670D1B01C68C2CE1D55ED85213AC8504695F0CE7EF9BF3457BF87CBDF9259116C7548A2F3D79AE513E4104F436052372D457D8CA3EBFD30DE14833A4110988F40537535B34583367621C3F44A3FA719062AB68008920251E65F291E9ACD92A3BF79A65F77EBF2048FB65735E0894BD8BE579E4C0850B2941C0B718971CFDD630753FFF0D731B6B0FCAAF9AC42A33D9EC19A5210055E49C58318448982C9D9\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CD00D0000221E2C71947D072E18D7565AACB96CBA78CA6EACE807A70EA11F312CB5175D2F826CE7CB499B009549887C6DF26B7A865895C28274ABF5783CB07BF7EAAD97AECC229F67892B5A6084EC790742C0DB48782BBE8286F635E9ED3AF2F86FEB4B67B3BC0DAEA2904E11F813EE21140F468E2AFE14D149B437C0439F0CE3CE7E7D5291171DCC38A17B221FB97B57DE0FB6C3D2B1EC9F82E4175CA95514CC4D0495A5D13F4276F0064EF0CCD16D86890107A541B61978E5E9D0390EA33A373E030F45A4D355ADAE6A212CCA8766594FEF72B9746460B7FF5604069F9FB21AF57C457B40393FDC8037DD1778A6F77A0C8F91A4519E02D7D3753C850F576C54733DC9523\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CE00D00003DC0F340D733BC6B4C02A574A18563D2DCDC3FE92C1EAEBD03454C2E8A7A3DEDEAEC136B480C177C4855397A8B6D081C5C5A498D315E6D3097E4FB6B33797A07C5005B0AB05C3EC75F62A9FA54180AB5F8A03A0825145BA4A9F79B1664FF657D6A4E1F3E6138226289A7A8D805A198BD960E766B40568394BA57CDA2930870915C109A7564914CAEE2118AFCC56828E7D16F38E42AD0257668448ECE1EDBB0285FD04FFAC7F8A6A9EED7723C7038A8438B16D85499CA9374ED873E10BB3AC82647BB8BECC99DF1C1B8ED8392166014FC1ECEC4F9289AC44F36F32940F45393795C0AAD28CD2216AC2CA309184FDC12E739A44D6B16157AF47B785471496E89C78\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110CF00D000036E6F403B918088B95395FBC66FD7814BFC69E2070638C78C42767D6EFDD8BABC59BC9F3B82A84F610E31E16381905B82641933B5F9C60A59606818E86569EF21D7BC25B0FA1AEE3ED8EB9C773E7496AF9A74F1C104AB02657D9BB24E40535879F1BD04EDAE471FFDA838E60EF9E97DDD1D3710C3CBF13F685E098AA36E90EA5436B0141FCE2E8BB8B11E3A3A1731300FB0336BC286AD0D7E8D807BCE8B32FA10D245887421C543057E9F6DC22E0D612516CC75CF2603E44C2BF14B9A5CDE3D5BA9BA2E1354D21C80A093B95AC9B29E6E1806C96BEF44AF9AEA6B133BE3A7548D7F7ADA7117BD0EBD5636BEBE0383D762811F2D2CC9F723D147A8814C1DF9BF27\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D000D0000237A751BFEB58EB850D7F8B24755CF7951264F48C3F0422B577CE0E72E600894A55189D360ED6FF4786E903E1A303464AC744CA8EC3E8974A0D370D8B6B4B36DF799F8658A14903FCB65D8F9BD08532C3F1ECF9E1A98962E144FAFB114378C1CFF758243E06BF99987FD40D29B5DA715523D1F7830BFE70CDE008990B8AD943CD2BCEAC0F79A7940B3D270FCABA83842B8B37C365A2CCA23F553727D4DFE117172A5170CE335AE1FFFABBAD677AF6CD787F47269C195471A3C413EB305BF47FA047526C8E9EB28D4B825F9B1087123C44598D41416FC557B54C671401B191893B676B9B088438100C1E961A7DC0D310807D5B3A34CB12D93D5AD1C62DB376FCF3\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D100E00002874789C9ABC57955BB9AD3D2E34AF4AD79281710F0E114EE95E3C222C57BD3E8CFF0CE91C04803708DF2DEA2792301D2F2F1E538C60A27CDCE63BBC3B049F62F1169822382534DAB2A33872BC14F5A5DDDCC9787D3163EF9FBBF67B0CD693FE3A8A54C44A7B9ED6189F889202101BDB366E41BB7C57AF13F95CA52FB6C26A67D14F7A7E72942957581B4B9621FA8DB9358D062642D560365EC803EBEC0D666E6A334765547C1F342BFEC5C461E66FD98AADD0B1D366430D46A9093F97C48700D32ED15E3BFB02D5CE4FB2E18F431FC3118A37135BE77A375926CF136DD5EF150D6D52F49C318C4D6B53F89F15392AFDF081D763F8F43E1EC96CF35FA5B91D48084268B903315DE303FD6F3A4C65FDF52\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D200E0000299414C7433A0C93EB22A972C636E7EAE55C8293A86E1F286C3D8C8449EA8C1D534380597A8BE5C8305F2E7A1F512403C505A7B55FB45AA00142C9745309D9C2B7B6C9C2CD91955F538F7580D2CA823C44592E2E9CD7B000B218A51D1EAD5AC2E14E78F2730B928589181987A43073C2B7A09FFEDCB61C8B1B7BA33A437433BAB8A71535BC62D786EA286526305A913090ACF1DB9A8B66751B963674AA02D5F679C4664968A818485C213CCD6F68612F00A787F5EB066D308D82C4AACA6AE838C9FFD8244F14048EC336B60941BC0909A555DA400069D0FF8AC35B2914D21A1E7D5499DA91F4938077845985251205D9CAC442C47B09DD0DFE73DCB554C20AE53758C14953556BECE0C0DB80F3ADD5C55\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D300E00002E288C2EC9B0709B391868522D22B3589DD6E7C6255812F4250D10FEDAE47F7F6EF21FD16A86CA455AC281C6086170A08459FCA32FEAF82872E724A0D14AC586F30B882AFE7E767F130465ABC2648CE20FD18EA21A26A9889ADA6F49C99E4478FD7E6CE88A7D07AC737231F4510D8E6550C92FD43C558BD2F96DCE3B6DC7C12938CAD0AB1EEA96E83F75E6611190846029438875AEDCA664CCFF01F08E2FF0223A04696147E8825DA71472487F0650EBC55D3CBD0D5AD84425F367E18D3A5E94853CF8BF3C4E035685F2D92BA2D020198BA39ECC7948877401AEA2F1E1F2CA13D95EDA2F01B8D5928335729A9831446B9CE976E80D6088A1488A15BED14E65D8BA55B4C8497B070A29206B4A863999C54\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D400E000032E8B134A68256EFAF38BE9736B2147C1481B86191B57DFF28678C06F0176F467C8BFA5D3985D341D136F8E36D604951982D4E7C99E336ED7F1672FBE76E4BE27A4BFB2108C8BB08E6600451B2540FFDF8A4679AAAEF9BC8BB213B104BF0B4BD0CE0A975AB7E2A3AA82AC4EEAC0C5479AAF0B8F343BDBB0F259D5BF8C5931802A2F589258B55AC9152DF238A4EC3EE54A5E1BFF9BDF77354AE22B65750BA89A1BCF22FDEEB5840B2C691361B1C5A9F6E131E1F9D5C1B5B5FE277B2DF8F86F6EF036BEC93A19657210B837D81A6553DBD72060574F453556E1B60B06A8C534A4F01DDE2567F8D3B76817D5035F4E7E3181BE5131A15F08E63D1E8E4C04256470A594B3F064798D30EF80E916F63C281874\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D500E00002C91FF4CF58F7FB7149591D72BC9E8F4656DBBA4A83CA6ABE967213F88F9C9223C0F22DD684CD2854621279B44BA903DB2D6157D1EF9642E1A6718D7376EBA39E8A63D45EFB767CCC05B4F0A69B26888379E0ECBD692234DC83D0FAC38DB38785AEE8EDBD3488D3C67C4F9A2675A2108630CB3948AF2EA46CB5851D16529FEE3F6202B5480367A76EFEF69F99EE6BD413922306307A20DA3A187DE97F12996905AECBD416AB0AD4E4BAECE25A786374CE1356A686D6EEA13EF91A4181F35C00759060A237B2B108986A9A98162C756E28B9ECFB3F44FA0FB51EDB0324B338C36CBAFF5A797DDCF84CF2E4462656C81E3375D56D0964987F1F0841D05DCC846F532FFBB79F134B5AA20389F6D71E00FB8A\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D600E000035CF7C5437E304CE5B969EED9185075D8E29ED25FD490207BF364DEF5CE68DC197E513FB8B2A911F56EFAE101B8DA838E808E53CB7AC13EE2DBF518BC2104FE795CA7F6799858E9C1CE35F7AD458D0197088D389C4B3E00A4C6020DFB4D1C0E35C0A5826CDCB43B73877CC939202E5E6CA277DEF70E6C9C7BB3C375B61138EF2E873FBB14AE364C15D7EFF641B06644EA4979A9A2B8EDE9E5047E49EC9426CE9303B5372650180D75333AF7E5E875E2A45236FBFDB6FD9531FD5118F1AC2F8AEA78F749CC79D957FAFB640DB8211809EF9CB2CEA01B286EEBCE0C48CDDF2C9F15384D95C1679B06278A8AB366625F353439029A27337A0CC54C520123209A4FE4150502CC647394DDB451CD25DDA2869F\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D700E00002430D230A9CAD71E9F9D3A5F8EAF138319F667623249AC2052FCBEA5F73941917D148CA7ACE8DA8239CCDFD1B794CA098DEE4632B93D1A9DFEFAC9FDA9C265D4EBD0086901A846032304DCC90AA8C31C53871794D3F7D30CF1E16E004C76927266D807D019ADECBB7794243717E5AF91BCE62F77E0940ED3D6B7A1C24F572BF3C784B1D6E2DEC0F037D9210857CA6FEA00DAAE2485CBE0F80F81807DFABA84DEBE624CA0D97F37CE4FE3B151A45CD26FAFC93DC2AA4263B2CAA6F9D83CA9F0BB3F4BF3C81041ACC941F06295AC8DE7F347A897A18FC3D169DCD88FDEE5977F79AD1EE6E78BD68A8AF0E9C30E2ED654E56C9AB94F12EB1685C542AAB112C312726EA986A9BB6832B12E1539DAA26DE1537\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D800E00003861218FB13EA4CA78529DBCB7A581070F021D0A844DA2FDF13D24283B0685A509D1797F50A12BD03E9B5FF789FB13B91EE3FEE500D669C52D9693679A498504804B71FB29B985A37151E8300235FDEC3954E35613F8890C4052C0DCB7B1E6BD352C5FAC1D7DD000B1679242FE0C73B1120144FDBECD433E4E873EF0A836C0A2FD7071700633CDB9AE31F0A76BA97A93481C5A7EFC072148665AA5CA23D3FC364A110B4873DAA29B728E8B8F87A75A462F2103BBF92CF6DEA43E601D55641EB5990ACC3AEF50DE0FC2755BB6E2620963544BADB0735C5A0BEFCABD3072BFE90FAB37E26833D461CE6FE1A1B6905E9324DD96313BA14CF81439A6FAF18FED630DE13DE396A44A2081DEECB3052F0746CCE\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110D900E000028DAD0655EB1BC9185E2AF3BB6CF3678F0B3A5FD2F618C902CE75BF775141354FD5BD633BC20941B94EAF245BA3C7D70E114B9CC08DFFB5F1BF58770BBC10DF2C4A2E0161D84DE3B6FD8E1E171D50581A5A9FE9EDFB28ED19A4892C71B543FB954F4E6DD6625E535BBC15EBB422C705800E17E8A96EAE188DB6246431F33E40A98500C92EF5B00845B769BF0BB26E34DCA37FB4E261D42650AA6EE851BC38C0C434F87D3A89DA5E94FDBAC9E80BF254CE4EA8B0F4B9BD373FACCE14B0FE9A13FAB1FA37A651514E36DC9EEDB9861AA60D58C718BA93F4C0F454448578F76B32EDC1CFB85B56AAFD7CA0EE5777D48E0F09286C15EE0932D509C1FA8BEB8D4A186CAF50B25117F95BECF83778E1A091154D\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DA00E00002A7F9FDA45FAD8E39A51FDCA87C4E153B1DAC41C5AC20BD041D175F7F07E1656011302540E6672464FF5CAA3BE51A8C789C9AF0B6A32757B9AB5C90DD201F45A09C748759F304ADDF927F6A277BDEA466E03F91AA97C2DB4402C12E53848EFBD445E34786070A293ACD07569A110E6CFE7A321E49C897CC5E58B9CBEC256D4E8D054D702982DEE79E5BFBC0AE51A7EE3512AA23BE2DEE1202B6DEE6BF8ACE202C182D9E70DD82AD37C5CB78090EC39039DE37810F11737132133BC2480A7E57968171A44A1F743FA6C278C6D5B40BA19365E0C4CE6B0DF0C6695B1BC4689D6AC9BCB370B4A496574C01C637657165E49E4299E9B1168F0BBEAB7452ED16FE84E9B71D33791F9A45322A3529F5417D6058\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DB00E000030A05C6C820B781902A81E9D0FF1C27EE02499DC0B2BE14A36C5B3EBF912889F2C67A04A9B23955A86FECDB7915A913F4F4AA5C04DF9E80BB7FE7E553704BE9E1E2BB383A0810315C2C837E2CC2F150D5BB7D3A7C6D3F140BFAC0EDA927194627F6ABE61A2825DCFAEE8FC550945FA0CADCA62BAD893BC275ED7F945B769ED535BCD1BF8B8A61AB046B66917BBF319C90752D7651873B6634A7210B73D94D1F5286FA72E02F16914832C471D1B2FDB48664DFC9F6F029FD039E1239D4172AEFD1DA4C653BFEF5EEBD7D52B67854700F59A3AF251147C23F733B12A19047E590A0BA439AE97C2571CA9B226781B9CE110757F233978D3512BD6886B1D3738D43E9FDC9E7F01676406A1A0A58461B3BD212\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DC00E000025565A4E3FD0680C860A17A56023BA9D59FBF6FF6FA63BEE7FD3EC8DD182D872BC36AD38766340E3D8C43C4D6A2B18C6364104F77C652EA4111E9EBED3272E78459FD98FB8C6B766FA6625AA79E5C8932D595C06FB981363E876DDF725C728E05000EF33E04F90C007CBADB0997B43CBA9F991AC49AC64320FCF35B1060EE64635DF35A1BC0984FE526A9838E1534B418A223A53AA10F6FBCF4E676078402812379A6CDD1F974D2EA31F2C4AA2DFABDC27DFD4AC7DDC25EDB5B35E919B263EE3E37E91D40AF80F90E1383F5A7447E991540554E8C35EF34D17FB9CE3C66B444D8464A4866766235454B9A6847C19017668914BA09405328B1AF92557A81BB203BC3D7D23748C3E599A16DE1D6A6144211\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DD00E000026EFCC3F982C57E8B485B7A3D3BB26B21F1441C8B811FCC122C1DD3CEAE1D8534C951BF9E1197A4BDC5B769427DD1F026768318ECC94ECB412EB6BE019186DDCD8D2C04ECA480A1E03DA41320C438D3C11C6A2F9936441EEAF1D761F21BA4742D804A08E053EFB3CCF7BD4E414C94FF19357A16B66CD8D5AA68F38C482FA735445494D5331E546E928079A235D3DE8AB386554FF2DD4C6815B0A177CC52AE0042D357995C23AA755483CDA6493EBFBDAEA461BCD7CD5286C43030172A79A183867943B123524882D1A5AC7D0C4932B15EAA1B0766FBBD607031ABAA228DC7EC21D3BA6EE7BEF95D1321745C51CBDEEEFD664D8A3AF9D27386A2E9EE7B8BD9A8710658B00E8AB1D7771C08BB12263FA1BF\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DE00E0000343AF6865B5FBDE52876D933E55F77F1296A47A5E1A8799A47C5AF986E59E77B4560EF7E992D1CE3FC6EE7BF5391E454BAAD06B7172678B0449BEA11A0179B2E7BA8270ADAF3B66CBF910AA0D7856BF1F8E93A4041974EFCBA0DF88AA7D6F43C9DBA6BC8682AEADEEE4408EC7FB3A4EA55A3C583A6DE521B7369E1B3464CEF26F6D539570A6589ADD5C26A7387DAC0E2EB474AAD46352B9C7F538FC2358E634DC0AECACF888C447F122883D807D16370AF104E9D5505A23996C1D7860F950105894D069CF461F3D222CD860AD65CA387F95999E2CD6CE895941647C47FD2C8766D11DFF32EB0C9B4B4C7783AC993C9A919F0692D05B642A77B5BA8250647A2BFFFB6D3CC9DCA2328000F765B7563E6D7F\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110DF00E000034D75FFCE1A8F6E625F40129DB189F3A059910598FC32F825BA13D47152A185023BA1CC995552B60E4892109C6A000357228394076EE55472A86E5FA9325408B7C68184D9B44C64F5C05C17F48FFBAA98F561BF7A1E8097B265B436D5FE34993FA89E927ADC12AF64334661F140FDE2C97AA79924A18A22568A83091707BB95B4C37609CED25C2AD1D18B86069427628CF68787284E83FFC2AD8F21F7704B8E55B6E5BC9E46871E619377BFE87F48B9D14B9192AE92B227CFFE7E5D3E29F454CAFC054D1783902176245565A6D7453CDD4D37B5F27EDDE95FA0C8C780F589BE05570DAECA8452C572D062FAEFAAF9367F785F69EAA847C020E45EEF61460B56A76A41E2C9994F03BC22F2F641EDB7C96D\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E000E0000268E51D240BA4BA92DCDAFF7507742AF60E1A66F35D12F2CCD0FBA923F03E15CAD94EDB679189FE6FECCE4D60EE63253F0C29407F3108A64BF23545F533D772CD4041ED8BC3D485580DBFCD3C8D9B61EE54404C036313E230373003C2DCB7647D543C7E88C0F473282212D6A09E569432D7A57B9B208936E8BF4C9F1712EA1BE7F178F44F19CD6A805A4CC2562EE1BA06F0C6237B49222DA11C06D55662927CEF739D59835117C6B3AF8376E4E91B884C056FBE530E517732D25A91EB0B3611A1F5BDA0C84BC89A1CDE9EA54AB1D9866ED9C2B39C3511ED638BA7338DDC879A61F8408EDEB8BB413CE0DA753EA02F515D69809294D22672ECABD787003BFE0434EE400E01B59CC67D133E74F310B7858C\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E100F0000317A071B1F93DBD9DF65D23AEA1B0507E6C810CB402A9215B28FCA19DB066211D421F417BB76B4DBE84C91C4190616E017107F6F0955052D2195C92B006012378F77655614EA75A24232455DB11BC59A5A2E737C027A78AE54C3C15C7321EF93FE88BF5F9BA11562334598F2B09434E95733851E00838D69AD23E8EEFC0DFFC96513BAE3190F33F7EC4728A9E7922C210E3CEFE38B10743154EF120E857D77F101EBFAD55FCE739FD853698AA17125552077E2F32D31637AAA783F4DE7DA6870159CF25B53B71E13D0CE85752C35127702EA4D06667A27A0697844921FEB709206B96C624886E653A15CD5146D84735C4D37F6DFECF1656556BE691A988F5E17CD9D1741047DC0094FC3C15DB9765596CF7FDEBE9A3F4CD60023EBA2B31E3D8FC\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E200F00003B259955A689FD18F88A2566727B96808BB4D7F23D78A67D1DBF1D02A022B65E026517ABF43F907AB44D5DB89769B2835117F2E528EDD3C0ADC63911FBF667F70294F98C3FAFD6796838AA8FE6F719850E17ADC34533FD8ABD4F91F44197FB2AC9F3F6CE44A9F73CD31AAF9C185D2A640B9FB21108EFF19E9F4999275EB4F93E2A8ACD19F032547422F161B0C3CB39542D017C613E202A5EEB200C94CFA2DD664E406A7100B5FCD00B9DF5EF2524649705A847310F5DDB7BC1A6C0E14B8803B1BD1E837028065F6E34EB9A0AD108B640D6738227B87F0DE6ED5F697D64BD93E69D301CD0C0B760087E92CD5AA3DDD5D4336A504994958AB099A62DD137405BD541D2377A18D21D0D6EBE4D264FEF8CE0DCC4466321D9A000DFF4AB91E99574D95\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E300F00002604763A9D37B87F55EF8E20D856F9F760247D76F8875A46725F696BD234FB142BCBA858BA97EDC19A4978B288B0B19665C3AB29506DEECADA11F079633491C4E8C7FBD97E8140ED6737F9F2B6E9E4EC084EFAC161BDF0B1CF63BC31E7BBC1912585CA4EA147C3134858370FE15641E7A7666EE1B48DBE0143C89BAD0B257BCACE0C96646AADEAA42A2C517607E275128068FE8D443504D3E15EBCED18C1346F98122FCACB4392AFA3CF0DE4D8794D2CEFEB0943D975F3DC23B853CBEDCEA628C2C38159B51B7020712E79AFB1C18C52292A611A9108F94C30A9BE97EDB347E57C42FE98CA1A10138F51D33E08E6455121222EB7C29B0D7AC9D5CD652E794BA841A846B2B410301B0CA4EFB6D995F9C46CBBDAFB5CC17B505ECDB8CB9727EDAC9\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E400F000026E8A4C7D8ABF28D6687026145F0E04F09EA2C3A5C1558ADBBE52514EB67105EA4719AF8C8C3D0C25C00FEC185C7012C212E00A7267FC2E3EF173B67D7F5BB821A62F6DEE64412964B67606FEB940FA1BB67796835C108B6F95C41604DA2DD790595CF8237E5520F47BCEAB69F4A596C161E2C149981981922004738640B42A0C3F5747D798353BF0EF6FFFD76C8C31F58EBE7B39596384571D25A7387249822C0D5443362E9AA84091BE3035F659789351753C29CC52D350E24A8DC4E757494574C7BFFE72A055C24878A738E5FBC55B330D673C76AFF32E88980BB8D8E9CBB2470175FC7DEF58C6E0573BC72F2060B2759A3647BC0C22167B71166B986C579E50922695334022555FF91863EE9E62404C7F3ADA04E4D0494FB4F407D6A18930\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E500F000026D9996DD6BF80F67BE4A9F29A3FB7DF674E07ED051FFAE7F30DF09C904863F11A62053C84DD09948E6E55E058FA04A05EFA19E00F647ECE68E436FC0296A25371E27407811CDB5E6D05B222CDA158DC99CEB4F45F33CD885EEF739AA292B38044FBF0655DD590AEE54360678EED9BB613B36C381042C5FF21B52AABF1149AD213B173D1EB007CC6648D76A2E8FD38767512F26E9A207DCEFD218D0697E8493F6B49CE82D1735B4E1452A45BE73A7718D90D5DAEE0E040BF359DE137DCF6B7F3426BCECE7651C65262783703F5DF55BEAD40706E79436BF66A89B37E7F1167D62E66144A7D5A6A1E21BDFD4AC2472A2A28A5279C05C39C6DEFFCF289B3EF6199A83FDF11271E7B2B43F3C7EC7459471E9DA3B59179A25461D420ACB4111DAC958\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E600F000026084ECA8A495C3C13AD64E6625171590AF316F9B2C67FB0779AE5C03655A1BA0D26A6B75DCA01679ABF393FC2C74A01CEDFF5479F17B2360D1CC1852DF9633727DD971B2702812BE23EA8E7CB4E3E1125EA3D56238A46E04B821C6FC372A5BD959496AB0962A4F583FDA90A24B98494DBEF30D4C50B6D9BF78546354D67B59411F4A01136CAF76153F6161EBE366A3F7F7282E21A025D05B09F9FE713E3075AD947D1784FF58EAF4E2B056951519BC3D4955D1327024C1AEA6A17E559EB3A2DFE9F69EFB6D1939CE52039FF18E586820A9770E5916D096AFEA2EC02166DAD49F5308494221F6E5BB076ED886F101EDA5A573B41AEF863E21F103D7CAD97F06C5DFFD127ABCFBC47A4BD20FF3D02E4909E224844A32591F3DA3675951C5DE0FDE\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E700F000022D77CCE169295AB205AB58A79E16E8D7201C1CA95B427030F51F0804135C1FF8AB5B7843C2B1B245056348E3A8E27DF22053EAE3A2CB4A58B868F9E0CA7AE20B3EB5076F3A44B4907B24196B896D85B095DBE7D01A4D2C793294B06B40BDB718A46AFB3C94F84F967B512913FA7294BF987F8AF43B837A8DB288D51756312B1F7FF4D5546C8FF2F8AE2F321FD03601DE9B484BAB2270B354624228509133BA0DFE40F75EF541F1A52D017EC0D1EC5870292B7CAF812F03B500160E0F9FBCB5D1A1372A843558775513D6A72CD60FF071A781A48737E8EA5415740522ADE9CBB7C269420A9B5D3449A2B6612C900C86CB89EE6E315F30A2849F115846E9437B1B4BFA68BE2E8D71C0BEC0B9FDD85ED59B69DFCE4A3834229688009F6A09457FF6\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E800F0000321FD479177C2B8FEEBA99883FA6AFFB6C2CD4A9047CC11907AB284A94FC00D74ABDA607F96A9CBAF287878F4AFBAA3C003D1EFE178F226E0918C020F5C0EBD008B75CEB69FEA05BBB046476028E8E728AD4DF8F49A5729002FFD3E5CAEA8F42201B1A915F456B62A13BFFACD447C70070D45DEA3E5F4FC9EB6FEC13DC581A6E3CEDE0FE2C4F787C89FA84DC489E5826C445A5FE569053C9483FB9E1DCE7FBFBD1E1C40E50EC8175FF5C3D66016FA9CF31A92FA065E50664E608D18CB3ECAA1086E07762FCB9E82BEE6A79ACB4961A2C0FC0D9663F31D08E87B265286CE4883828F0DC596BA091041234B93C96CF11CC44319B80D13D725FE0ED2E740951FCB4F6B765EACCC124BB4C9B44CEDC67596649193AF9DB9C0B7E965F89F43F356C876\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110E900F000025AFEDEEC295EE8B50CD8509C578AE9101F26AA2FA59E9E6F10E39669755F74A672DB6FB3C4A5DDC9FC2A8BA0A182ACB3515338CB3B6C065FF66A8D92154E12B3F33E2DAD4D23485FC560B7799F01F8B7B33317C08E8CFEAC1B029AD63988A2ABF53B125FC15EAD6A2572D33CEA494140144106FE42985564F47615C5207B0FB49351A9C4875A62EDFB11862D4EBD9E6CD78DD8B2C66989E2FF5F2A6FF0F14B68EEAD9E03405A1161C5576DBF3371F362E548123F761E47BBED6A7D8232128FB8E8835D18CA5875018D9F7CEE74E47FC6C034AB4C58E29D14FDEDC45C2988D5DAA003F5181C6EC35B8D67E8B2FC1A445FDD0E7ABEA5F2CAAA3579F52DE0E2E11C5D20F54017730FBAFBB49487A388B1EDC0C31BEAEEC022CB339513CFC53AC34B\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110EA00F00003B011D9DC1F3F93AAB21A34AEAD3063CFF1D7370211553E0FEA8A3DA3C2D68450D28C97C35B29EA7E47F60EA9430902A2BA8413C1C575F27A6622A90E16EC10F0E389BE0B7CBF6DCC4CA13F7353C11A637578063AEC020AFE4CA295EA32D9FCC897D977DB3535A00BA697018A8888DD0917DF07A118411C8939122553CE90F1FF7A13B48195110F781494C24FA25356196C556FE1DA230A7534DF8666D843A0AE1A65329475A4A675FB9FE24D9F3F82CC634B99B43557BDCF9CA7FCE561DEAF2D2819B6FA874E4F1E089DD575F48F9DE9B9BFCF475360C6BC7F2365E9B6E513AFCEF4ADB10A6AA9418A5DB74ADE690A3672B8082D0636273E827959B7C086BD87581D7D5EF3C9D4E3F7AAEB89427453C76F684F40FED50B9117697C4AAAB81452\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110EB00F000032CBF46964DE02250CC0C14B49E68718BA93FFF94B8A3BB3AE90BD89F3B887E973FC8FA730C9C041587FEBBBCBE56D98DAE5BD30CD0B13D2B9FD8D011A667F6D7570B9D4CACDFDD80224C0EB274D77A772E0BAD93630A852E8C2B4A22B2CF26AB865F86AA8C981F7A57F629718104A1DBC89D658489114CF0DB43B4F241D51D11B43EFB6F1C205314477DAF1391983DFE89B07971038F83136FCEAD9606F58BBCD98D2C798E47E44A8B395E8226CE874490265D6CEE6AC09C004A0FCB38672158D695A7A6CCE9C0032285A8E024B619C0F5FD01CF8623A307E47EEB19328B5E606263CB3485E08A932BFD7BBF28E57EA6E46FAEA7859E6372B93E0F27E5EFC32C0B2859B9C196965E3B8799D7FA892AD5EE2162D50C91894E51F9DA49FA554660\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110EC00F00002461FAFCB7CC64B2DC20437E318A1364C68253EAC828968EC4BCD918300D1B875BEAF5C7810B071C009F055E9C4C9C22EC2B9E3BB82CC4E66E85E812C479F1E5CCFE43938EC8ABE5FA798728AA2BE062DFFBFC037C6F2D4FE6762E6A85DB8D0F8AC295FE31DA743B36DF7FA26E7D1B1EE5A2779BEB6579152A90522469313E7049CE2C114D8B9E66483081109C3BBD87667E8A23B3061735C2DDD9A268956E4B275C6DF7384124B81560998A4F4EE2E93F3F244E7E935CBDAEC6D87F72735C01A8B7EC8F4463EAAB4432D0BD2A1A3978A762CCEED317E2B7822EAC5925FF282F7CDA6750F52E6DCD39A1804A63C70B250C982F33F0157CDCEBF8227D03205EA1AE4206A678ACA5E5FBF013A757D86FEB471A2650D58DA54475F36BD72C3D5DC9C\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110ED00F00002BE57167D05A8619169CA45BE382145B5E2DFC2E132EDD80776260A79228B688E0416FC8D11AA72B48C0C73D7FED8F10775C8457474F987EC050697767F45EE4D7BBA529713657273F73F6791BA221BCF2A51AE89319FD82ADE5C3BA95152580147D8470CE43521B1E6C5667FBA4C43F074F8F3178B7346BEDAB3A359AC30F39506BA687F74F0379909E19F373285DBD04E55F1FF3E67773673356370941001DE88BD7726F5DDBB95178E40067F95D5DA85153FDFB0DD85DD50764EF42E9622D985F9AF4D66B06B5340DF0F9BC0B56E4F6741A2E58B5152F2AAD70414EEA3B49AC7560898FA8F425C54DAD4608BFF2070D8DF31D3DE8584FF2C14A9F1B6342EC5C8F6783092C46FA63205D82730DD3FCF92152295B55E624C786AE5A2B3C37F93\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110EE00F00003DD81E90B3FCCE5A640FDA8CE916ACFF9C2EFE4CFCEAD77C06FDAD1A620D40D9FE98FD172811185097DB67D95A8F50558703C5BB08467C38B5A364227DB56CA813EFBF10F319A0377965DA99D7A74778444C072FF2F557891ED54213AED0A239450019EEE8A1C0A20FF5CE17B198DCD12190A32C76C279AD03A73AAE743BAED77F96D60A08AA9D7ADD90E33BDAB2E1DF9CF40B2972E4FDC857D51BBA84252C75EC31687FB56CB262E9BD037BB4194EE7AD8C613C67F3399CF6EFA8944A4C32B223197321568158985EFA5618AF3144C56BBC47E77A0AB6C38A8E6BA9BD8B26E8300C4D668E725330BB453935659723D4498F3B6A2F968BCA175A565BBB3ABD25D20874B7379E80BB58254B228D25C6995032ACDF39A6807526CEB51960FB947FA\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110EF00F00003B6BA6346A89A68498FC66F560F4C5E271C74BBD972FA04D653595649F2ED4A58451A1B8D0ABFDD06707F6A3CA249CDDEF82953033B3404D08CD47AE0EF1885D81B6C11623B22753B8A73F7946CECCAE95487BCA5B844E5CC39F4C2312844CA064D1588B5D179DDFC96D1E9CA93FF740C6063F4DFDCFF9294EA98C58BFA0E08C265BFEC08AB5DFBAC0C768FF3BA8AA22D66FC653B64550460A3E2150F9893BC03095887ABD8B2BF3A041BD26CF799EC5AC1E9FA61440F74DBB2EFDF8D22B96A38CB881EDD8851BF85A6A75F560AEF277C4A00740574C38C26D6316AA7BAD25F8FB58C10781299B062C483B6EE39F7146FC4D93F397C5C39DA2D054750618B3DB8A113DC7DED45C49EF70142A10EC4F5DCF9054BF28C35C688E02F68142B147673\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F000F000032C1E37BD043BD3D6F0FCD3F79C1E2034B69615AA9199F3470A78E4352F8A6EA566D6FD6BC6B902E1364A723B2D1011707CCF3FB9E7F46E7349407D32F61BD6050A8E2B2696F28F2F59227B900EA0BFFB9040609C6A70AD8583B2C6908EF17D64434CDBB7D943B5F921C43CB4F2B5CE807DF087A6C9BC7CC1187C68694518DA5AE4769CFD347ABB0C14F5F3E01D3D823464008E4A561B137E4A6D425BA39C36EE5E43708B4BD0B4E859940DBCEBFCF49593F4F9F6D1E351C8FCE932812D9E4F9933BE204429D749765583BBAFA0F7DA844259AB567165A74DAB24A8F1C3D8BE796B03E50237D7747180EB140F127106CE33C3C30300D166C443C81FEB45D0A8AFD9F002CB5B83F75C6A72E8CAFEF1DBAB8112DD18C44C1DC7160648DDAC4CDA6A\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F100000103DEAA08E0C61DE694DF6BEB2F051169C20F1BA2507258DA51D5C053852846E19C589657634CD0393813A8827D7902EBEBADEF32AF67C594B2190F04FAB66C4938934DDBFEC24593131071D7645EC8E0E94FD92502B5263E1CF511718B96D0A9DFA2DEEE683BA99952817848111246CE2A839E293CD619F6351BCD330591EFE33EF02DB3EE1A058BE3FE1944695223AB2C2888E61EB86EC788A6ED4C0565B5AD2621C7D37672E1B2B54AFE02CF8F2DB62B7ACC271D34E974EEE3EB433760F2BBE574191287FFC34BFC35F07B6A4B91FB4E024B6B1D92C92070D7E710A67D119ABD2828D7BD691F788626D97FA67CAD6D9E6BB0A0F3DDEADDEE1EE5F70C3A324BBFEA013E91807E15BBDDBEBB3B5B30998DEF61C59D34B4F042018BE7B8987A7D625D3FBDD40FEBEE9AB166A6C4C8620C99\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F200000102AEE108D2728235A54E78A27F210D046F770F3587E6A2A2D37C71A0E8B081C5DDBD2219AD3DCE79830CCA79E5D8F74408D4B781278CC3D5E03F0B55A99DE0A4B7D0F278FDF2AEE107B2BE159F8E338BD9E55565DC06E5A3461BCD2DCC3F848F4D59D02491CF19DCEFB54C3A6710903B4DDE6CD037BA71ED8E39B2499D6447699CCD8D759904184949AA7281CC8591CA17E0971405A5B32449C875DF7C2E2C09BD0DB3226BDFE8FA51F2AE62E5204FC0B2F73A469545EC9154273AC05FCC2E7C37FEBF097C7CEDB840E9B153463F6ED5E5C7393E6269E6F33E0E23F33331F3A792BE2B12409ABCFAB4A907DB6EDF7901058A93FCBBA254A7B82DBEF7C6C012C11A6070224848EB58CDB99F7FD693A7FDE33EA7A96DC82D45AD236FDE3B53A19D5116CE1CC38F3942D2F01CE72154D864C4\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F300000102D69F71390DD9A5CA0135F08466435F2B7ACFE6C1AB958189A8030C08F40FB694D7870BD6C2757DD895D200014008D45D970BF345A691E8ACDA8FD2989C01A6BA4663861B685E4CA752A619FD41ABE010159436D1F6F3520E2591EBD1367A288676CA9C0E6CEF68816BB4238816CBDECA853FC290CCE25A7DB462460E38B6C537CAD2B0069C74B89B72FED2E2296F6183A1F0864EF0B1DAD5B5D88189C429DFDF3F632090DB7DE4CEE48B44E6981D2D140E4E84F4F786B5265099EB30F5AFA006ACB733407BC9CCD2332467D48159DFC82CE73E19B182234A112FC5680F3709B39F0BFA259AAA86F003D34E41241B4CBF4446A54061AB0AA51ED39EBD3B71302D16384A1567FBDD447BC6CE0278DF913E18096446EF8445F29D4C53A1A2C0F735AD98A1AB733B5EF8596E8B9299990682\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F400000102365F73AD30A8E109955C85C9460404DA32FD594BA36633D210C8836408F7AA5FCF4C23F144C23A962486E26E7CB5B98F4726B597121A0297D5A8399D4E971514F914322DD8D7A447A4A5D7940143B0ECDBC9A3CA47DFC7A955111ECE56DA8BE6ACE62F5A4EC50F61EF550655A3D29F6D158E1FD0AE208A10A2D7ABAF0BC48B258509EFAE1AB771FB73272AB7559B23B3D15F5681BD10A4A1E0F11B5A29A23010066A5E74A15DC169C787F2F03FFF0AE0DCDAB3F0771D88BCB5F976733A2FABCB16429D04DC6FD165C975ADE7CA131914C0422703F3206FA119A70E898A45F1135F98276C2A979AA23E70E3FDE65906DF0D192A4EB5EAA15326435BD7C1DDF698FEB4DA19DDFE6E6FA9D2C5C098C9497DE0F8999169010123E780CFCE20893A2CE55DE31DB329A070D2DD14D40981E646\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F5000001030A549C6B2853D742F94F9B449B593F7860656F9236A32329B107FC64EDEEAC9D3DFF7690F0BE1DAAB0EC5C55C3F5E1A202494FB2C68D5DC724FC035C18CF7E4AC807E8AD8BDA4C8B2BE032D5344488EFE16EBB62E96E79906A1EA09318CE31086080E7C236764D47E6FE1F9257A0FEB023037C1DA15298A7A6752BBB06358760A1F69B1C7175D76102B557DB31A4BC6609A8F602DF1A447A5E44F58E37EA5DF30C61D41670D1E4BC27882AB453CCEA2CEF238A6D45868A5E3E519961A4A0EA0141EB63ED91562B0888CFABBC58A9EB1FB9646AE09BA72E9144C623B6A142826B5AD13F83C0409E74FA9E408C121D70AA82AF5C82A19FD40CE16439923FCB4DDC5A65D5AC5AF0BBC0D81DB7E7CC1D896E9FDB6B68F820CAF44544E2A9910BE8173AB2340683CEE52F3101F12EAF293CBF\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F600000103AFEE9B8DA0F15F0B22173818D5FCAC7D35945BD361390B3C1E6D8DD441A1050F4FDE6AD2D210D0546AB2942AC4D1E84792C9B576E9971B15793B03E15E17633BD68086768233171B75F58D173B4C9049598727D4B5A6D41F77B307F3513987C16A71B0FEDCBB7381BF1A7BA37F074A15D3A4645FCC6BD649F56799AB4F06CD57058296417F2872C7812D215E6CFDA048141A927D78D13A6F23183A4EFA25AEF044C278587CD7FE2E79B641E1CA8DC0F7CAE40CD2BDEF6C17D46081DD183477D9CB378BF724F0A65B3511E8612CC2838BDA043DBD6C74B5678828D5CFA7A4CA24CDDB9CAF78E66C9CBEC9A1A5BD5B31E52D25787FDB19C73E72CBA18E665B9EFE4D3536F030F03B683CC35C3769D801B119F124E636FA949A91986ADFC92EBABEEFE1EACBD92B27236B5D00AEF81C746A\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F700000103876EE7FFB85231A23DF4659F2B05B9EA90D7C75DB59BF16F6CA958D83999F4891FF071E1A8C5D8648B9E24F9C56923E6D77A7D758DAF1B5DC58AC60E6339128034768FA84293C82DDF75CF0AE24DD8960BC553CF09E6C705A6ED235DE1504B229FEE97B18ECE2C31973F97EC1D232A149F10128A2EF7EC2BBE5B01A4598F150343F107938BCAE369031F77587AC88491B7146221F9B11180E85D5CD30C6EB7CACAF89EBDB1E2EF768E2D976945F6446B1C506CBE7E759719E4F9887F68F326A230019B47C8C21F020A432A5080B18D00029660CA08C75D90870776ABE3ED5F89502D08E057B9F5ED33D8ACEC098A1DC4835A1CAFD763081BE40AF91E13BB7F2E5922F51E94564DA865B059846B0AC6B77A71D8DC3FCF695801E43667B5C4F9379C7FCEE128AF93CC53DAE5FDE7580D64\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F80000010358BF41F25F9A59BAED2368FDC9A313E5EDC82F0AE21647E9EB96C97F9DB8469ACECAE24C89D0D3E2D1C34E4AE5131DC2D97ADD5F7059C3F05DE3431AD302E5A011C63269DD01E40BE9999391927F2B8788152D469FF253099BDFD15F7D4D4415D39A8EB041A9A9665524AC91EAC995643FD11A930CD043E14043826277EF2B461E9B9981496933C37CFDA41902CBEFA4E48E9291ABF862B7C784B3E01E84C475117FF6495A14F076A975903C77E4F55DAD116CF5E09B95045606F91E38041354DD9BA97E2363C1D79336423120A0DCAEE23A04BCCD4F8CA5A516809919874795F3A5872C337DF0AE8743BD09A7E0E72429A110B22FB383CB18D7AD5073F34F2248422E92D993B8C549C8A097B9363EE148772E3785E17C6890A18683D10FD06FCBB305EAB00EB4E2BF016C90664714B5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110F900000103175E64AB75BF41DDE34E71E224583943D12E595A64B73D533E4551F8B30985DF6346D87E729E74DEE581C50BD57C977EA0A214C45BC5969D2B889F79487F3E5E58819DCDB5CEFF12D94861B05664B7024F8F7433687B7F9A95A945201706E11B6AB8D6BCF8533A28F8893270102EC55D54C8D83787D17959FF786F1C1FADC7DA88829F9E4CCDC848C251A16CAEAD22D1053EE7955CEB51AE791A8400F63161BE7E324B3759A2EC9637AA1927771424A3713AA8FEB323545CE700CB81D35D84E71C4D78B61A2F6BC423116F7222724484EC37556FC21753211F3FD1758E7C26D6B72F62F7C5B0D9A54AA5275096BEC25A9A7733B9F64C696AD870B0B1B708114874A07985CAF8C01EAA52B3091CF0BB6EE1AA380EC6997467971820F2FA6CE9A615E6C7E6310A36A7590AA93252D52065\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110FA00000103F4E7C169753CECC06034414D44B2AADDD8C3800D2E636F759BD2284839558E0E2E732E81116351C76394F32B3F4D6D8FE60B1A51B5F04A3FE5C9420BF80B9B31E7DEC51EF8385475A8A4DD0405B7C1F9A420142AD57A3F53A1F1CAB592E73B35880BB1E859C157126BFDA67BBA2AF58C19662895532ECA9D21A34565D442D3349DB57AD3171144E876D2CE694FE243957A4593EAB3997AE8BCC8E395738B259CA2055C422D6BB93E6747A9FCD62BAB0047D1EF52D62969C691E9D5E2AD4D0E9590B1D3EDDA113831A2FD6D6E55EE2C80FFBA9D9CD382C4E24E50FF2D98298C590D94B90300040B1EE4B08EF40B0450C383328E68878A9B8DF9DE6D4A9A8561AF0AFD6D69073ABF8E21ED71B762FCEAC2DCAF1C944C3658692BF6BC359755C3491901A3FBF89633F3AEF144FE0A619373\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110FB0000010221B645750833278CF8A42CD27D11B3AB72C9F38C23720CF6A61A2D6C4E321941A98C2EA9BB1C0C980B5DB67580074E3FC4FEF2D046C711B5B1352B2F434B660BC70D67CFC2AB19DDEB4F4380B602DC47E0B0BCB69E906DC71354A39D9EB4065FE0623ABFF3EA2FB2BE9057E662DD5EEFC03B1A8328D1CAF1C5780AE8965B33179BD2AF3C2C6B47750BE4B79952F1E66E8D965BB1930F94162625C23E0C1A981D0235ECF9DAEC37E04246071FA6EF6157B4C0F4FAA1C33D96B5E52986419AE894FFD991092D79CB6B7157C7D90E4B4510A90469FCE3D2B7B72F2EE64A165FE0036633D9A03DB8A677620159D3F48CE46897E664A8F63A56A30B74EE5E6CC8D11BF6C227FE3604BF80734FAC0F90A0CB8EE890D9524B1713556D2B0EBFABD39FBE4577C2409C3CA1746CA3958F4E28B4E5\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110FC00000103FD3C66F4D9D321BA8B93D821EC14217241DC54F1D6A995A7971379743C248964CB7B5E2FE0F2861B6CB4037C60CF61FC9DC934371EBB733F3561BFFDD167A0CA4DA42C1811EC9FA0099280A12303F6ECA0B5DB3D30199EADC4E2388212DB98FFE3C5E7ADC37C8D4FC37561F4A714259816D1243B26FEB51978B25DCCB3AE4F50EBCC356D1D310487D30E9337D75AAD880D8D71D36C0D8BF7125FF737A2A0986BE2B21B1BBE18DCA058A7D07F733A8E1308E49B7FD6228A77008C21567C04972F165B74D30D581FB6E0FCD842B7D6B1B642BF9643E793064CE437DF8736F5C910566BF6DB6C0F5914C027B1629E2561DC652D5979A5E64D72E750BBB81FC9E0AE082F1E3832F56FA23ED1F018BDB742028043E1A396C6AA8901104A8E01C921EF994892EFBC3B689197FA7277D4707227\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110FD00000103A65E888FE0D8FF4FF58CB1F1AA2EE1B2F17754FA8DA66DD15BF93CE41FF6788B3EC742223CF8D652CDAF9B7123641AA6773D1CEE333E4C7419F0FC451CC90D97AB83561C64DDA61D055691C03E14E0B55728117FE77D1546858D6C2C371BBCC36BFE477DD231F77ABE338900AA25C7391AE7CF41F2CF8ACCE9A9928FCD0C913AF979F7AB2687A6F07A25ACB81AA338BFEB9DE21B686C8086B47D5F638C3B035B55D51AC3709A29EEC1E72B6EB5B534C5223169BC3C2B068C37F52AF18F4FBA6255E482571BFD1132271B74755082AD2D1688B4A5CC7960338F7981007A81E7135E66E3218F11B5D5BE5BE755425A1C163067F0778BDB9BCCC42D1A972A62AAEFC28283D44B86DBE1733D1FF0692DC0AE937973A05C6395747575AA8E7AE66D3B904747D5A706EA14F244E31538086591\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  },\n  {\n    \"encrypted\":\n        \"2110FE00000102D6162207A15505964559DA6D012B5C2825AEAC0E2B8004BCD5BD9947E912DA202FA6BDE50FCDD42A322F2C88B1B4D96C09E4A0FD08B18A461300F8B39A594B0236517FE6D443F2339C2EF83351B6D42088D5981DD3D59A48622C7C1FB3D112ABBA3BA808C72CC37469A20D4AC9736F832943432E5EF015AEC5E1AD48310D6279C284D263077F3F1F78CE98AA69E3CDF02C6D16D8F4DBAB395FDDC95AECFA6BA0B57E5D0483DB4A2D09FD97F399EA2693583E2F1072DD5C1CB33A1AAE4DD850CC4A5A7B7ECAE8A34F8C717F9B0304D799E6AE7FF56E7AEC1F9271722D2ED1594C1C7D165B38B176495CF6F2B68DC83295C4A7F2AFBCED77401A932231B1135496BC9C3F9DB0D7B90DDB66755468051E13F6AEFE72E4B20A7025CBB96A63731F2EA50C5B2543A3ECD969379B6C0FDDF872\",\n    \"decrypted\":\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n  }\n];\n"
  },
  {
    "path": "test/crypto/fixtures/privatekey.dart",
    "content": "class PrivateKeyFixtures {\n  List<Map<String, dynamic>> curve714;\n  List<Map<String, dynamic>> curve715;\n  List<Map<String, dynamic>> curve716;\n  List<Map<String, dynamic>> curve729;\n\n  PrivateKeyFixtures() {\n    curve714 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FED4A37ECAD2BF13FF24A66DDA299A57632520447B28B9E642C4B2A301CACC217FBD7713F6282C20CCCFDC5FFD2AB93A8E48D8C2C81704D36\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"3GhhbopDPbi883HVV6Hxun6q6AN43CB1yUD9km64cDoZMhgM1KkLy3N41vT1H1zqw4kHdqM64NHMSpSNviVkUP7fCrisZwYzb89dDs\",\n        \"enc_privkey\":\n            \"CA02200046B7A086680D208272F6982F574FE226042F30D049F9A226283FC3346506411D\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FB3431FD46EB80DE81273E0181F170552DE01506A9C91D47269312A81841C82B7F55014CEA471A7D8D3187DA2D10B4F9A8481DA7911CCC1A2\",\n        \"password\": \"test333\",\n        \"b58_pubkey\":\n            \"3GhhbouATXfrARGuHA8ymY2DoPYjKY9i7xBvdpyHjNWtWwdphWwkSaKaKx3tRNV47yGFhnkLZbJkL8crjE129FHUvrFod6dZQt3H8C\",\n        \"enc_privkey\":\n            \"CA02200066C8426FA1DC0980DBDEE7F8656AE6FCA9EF746975E3FFB9EB425B53638C0175\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FFA7AEBA0EB6776EA2D3BCDADBD5908F1B032B78DA75193A9D8040B94E49CA95920E130BD0CB7603DB72D2639AEA95E8D75CB31AEBBD6EA19\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"3GhhborMr2ApiQC19ah4EMkFBj46WymwABvqJ8hMwVkVA5TB58Dver6cfosn8zVKpNnJZCsn8HTdnSobopiMgVe4R8S5ap49NvNsEP\",\n        \"enc_privkey\":\n            \"CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73\"\n      }\n    ];\n    curve715 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FE1C85F75A6E3D75EF916DD9F60E14660F9C63A8AE407060EAA6F7CF373CB830B6E50D27EC46B013602A75305BD3D6433669607846D7335C9A1849664E8A35DD8E5FDECF40CAE5325\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"gD8AW4fgASg1cneBp3csnKeF2x3F2q8LpT4VFCyjEBPG8FraaoRHRJfFtBaGSQH3Y2tqqjJbjAAFWvPgVpL5RvA1xokiN9oVeARsi5jPYdmx7FxrZ1XrtyrDPQPArCJyHsq11wqJVhMgfiAjJ\",\n        \"enc_privkey\":\n            \"CB02300015B2267604593566FEB5292B32F60C3399540C7EB83F3AABB7255BC73B3809E2B742BB971B6274DF452862D6D902466B\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F28F251B908FECEA1DFA33CB727F44E43E95D67DEE66536DFB08D20DF62B69474FF8C36167B8BBB9C5B00D042EC338FFE5A701A8A36F7087FB49007110207B1F880B876467D17F195\",\n        \"password\": \"blabla\",\n        \"b58_pubkey\":\n            \"gD8AW39i8QV2g57X1F19CGHPF8b6oQcDqw9Q5LAq4X6JofJsg1hJhN1i7yhhkeGZQW86bWKeWSssTZVUvmxU4yFu5ivPpU5qMQk6oHofMKKwmoY4uLjzGWnmCsmNdbtK7k6MnhHkeDJqZiRwt\",\n        \"enc_privkey\":\n            \"CB023000FCABEC25AAA049A524CEA1D69360711C1EB4E83D86D2CB45B0EFA1F69B218CCABE3CF0A16AE8ED170919B7B39D1C390E\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F7C4731B8A43D75E23C7F77FB51C44DCCA59394ED2B06F1291849D248AB096A32C93A3E76F32395158E9624AFF2B6AB543CD5C0DCC3735E4879A1E7063F74C11251618A192082F9F4\",\n        \"password\": \"zulu55\",\n        \"b58_pubkey\":\n            \"gD8AW3uCN1tF8FRNNvnGMcSdgNS7uzQErW4mHXpBgG4RCcLhZ2VcGAUuqiW6MrYV4Fsxfbo5n3ToRmn7WaMGCzMFcJX5SCrTY4fvEGrE2q5XTw2gasapYvRYe1c8UKmQoxE6VmKgvDkaiVC51\",\n        \"enc_privkey\":\n            \"CB023000225EDA615DBF3F296B295E76454444024E5F1CF17D5275135C00CDCADF966889890F5618874D95A9EEFF22B6DDCF9C4A\"\n      }\n    ];\n    curve716 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5FD5B6C81AE89043F4ECE78CD21F68BFD0FBCC3C6E5BF4BD10B199D53F1DE8C8DFC6FF8CCE3AE309734C268337B1E80A5C70256480482EC8D99D52A8B448BD016C72D3FA482DE6C2F4CBBF604B2D3A7CBB78745AA9057486A0\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"JJj2GZDjhAHPKfyJ4GyEMhFNfUZPAUFe7oqfChPY5HinqNY5NPsCydcY2XEw8iwqhxSuaoAg6hf7qFagZJQ6HTYCGdTdgBxNangcV4ZcbcKwesZ5QmX6sVvLDPvGosfjk8LnrVgVhwJnv26dzKbPceNUzPHR8Pm2zwx6kjESRa3bKajupKngZGYyGmVJNuuyJ\",\n        \"enc_privkey\":\n            \"CC02420001F4C77C1DC868F62A96DD74343B9C03C594F6E42DA3A0139D6988D45D75FBC167E6D98D1F101D4FE8F8D58514F7571399E4548A017645609F5F575176849A38335B\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FA78798633EC647B4BCCC1240730C24E5852B649C3930EF7F9703018D4ED62000B254A875A021B32CFB7B8E87C2C19099CF6E7F1F9E76556F4391A00B118EB6A8EECCFB4CA19C4333B2A7393EF1A88D200D257E3A32DC4C0B\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"JJj2A5Fyw46yWMLegHqvHpUgeBgx957FK2kCRy4nA2qYGbmwMP9tNHnaVJFX6Yha8bQPbNyjLtdrjsqgTFRbFKAWhzx6s9hCjCmVwUsw1ZrE8MB1MkrqgobAr4xxZNmw4i3osKvMwE9LWafSQC5DWCRsx636u6h1Vdpt1CeGthDZfRU35DcKusZ7ZD2W2Pfns\",\n        \"enc_privkey\":\n            \"CC024100E9551B5AD9D9084DD878E224BE718E2929892FC03A5420DCC9A8B9AB5260B47A039D3838DB32D003141AEB1C2F53A285A78470D65AAD2222B2A4C9B279AF76CBF1\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FD8FEC5F2D15CF8997170913FF9F1D715481431196F35BCB60B8A127440D0B7E9D67F908FF857E4EF7B9EFA6BC5A4F8B8FB8F1AD40B9642A2E20BDC5F1B08C3D6128BE2F67CCBAA2CD2C91E287CB4FA298317EBCC872919EF\",\n        \"password\": \"zulu123\",\n        \"b58_pubkey\":\n            \"JJj2GZDo19rm39iih31cyJns2PBUqkTqFvpLZ6tucYNrjf8e9yWr4hckXP9C85x4zBRNJk1YqA6HSkX9AaTUearmYs9qFVzRzwX7X2gEt1gFhHq1dJaeLmDyRXVbd7cmiuxD6tjjXS7V4Jt3A5esgHTpZRQ6PXReDkWmx4fmcURcHFiWwtwWdQrz5ZTEQrQ3r\",\n        \"enc_privkey\":\n            \"CC024100231B27482A4ED27F9CECBFA1D6E610146852D720A5F7623E24D348499B46F31E02B46572D55A7C97CD303D4361242B11A5789C2FEB9A793B0C285B5DF4EBC08984\"\n      }\n    ];\n    curve729 = [\n      {\n        \"encrypted\":\n            \"53616C7465645F5F096AF812ED1B1275E123BAF0F351A50554CC62C50C6181AD6313B5E6A319F6ABAF9A1CC29FFA47162355E5A731F379420B7FB6ACC92F9F82\",\n        \"password\": \"test1234\",\n        \"b58_pubkey\":\n            \"2jR5AN61cbT1MmPmhdBPCcYCUidSf4hSzKHycfw6Kk8DFqcxD4MS1y7YezmsoC19S4QJmQvwnDnVDjnHgRaeX8PyE1pWvFzBWVnDBNuawD1wQ9iaa\",\n        \"enc_privkey\":\n            \"D9022300252A9478A7C732CE80E1BE5E2F529050F8521D8F7FEC3C0C8EA2936307244AF9F38E55\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5FE327D1F4C88764F6D6F5CD48BC563D5E53D31E641AF18BAE52DDCE43AE7252D2BA294BB1D1F7D6C66195D2021C77B72E95C36D659ABC0BBF\",\n        \"password\": \"techworker\",\n        \"b58_pubkey\":\n            \"2jR5AN5umYFQ2Xgh2p4Scva1NTbipBXtDe4NgTZPd7SSoQkRkPBp6b7AizVZ5nXLboHH6h4fDhAxmUCVkfZ6NGv7GNuoRnqQ1WcwnEEEf2NyiBmVc\",\n        \"enc_privkey\":\n            \"D9022300BD97C143CB26947DE0DF445972F929C1C76DA86B2B33C5B486C8AE926872D77DB4042D\"\n      },\n      {\n        \"encrypted\":\n            \"53616C7465645F5F36404950AA92E7632F88BE903B9DF3DBFA5CDDE67E776655C95773F80ED982DB55917A685B50F514F813D091C6768280E98C66F996CB7127\",\n        \"password\": \"zandura\",\n        \"b58_pubkey\":\n            \"PkWwgfjhzQWM3sBjXFWRdXAq6ge2Wrr4vXGMp3vMTzj3yVbdqhWxfTwo6ySRAiVP39LZRoH6T9sZq7F5bCHMTD7b92fEynFwSV6xGqTDikNSnoc\",\n        \"enc_privkey\":\n            \"D9022400011FC78E156FFB72C1C830740D34BD711DBFF03AD0F2A272D160D41A28FCB0C1000CBFED\"\n      }\n    ];\n  }\n}\n"
  },
  {
    "path": "test/crypto/keys_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport './fixtures/privatekey.dart';\n\nvoid main() {\n  group('crypto.keys', () {\n    final List<Curve> CURVE_INSTANCES = [\n      Curve.fromString(Curve.CN_SECP256K1),\n      Curve.fromString(Curve.CN_SECP384R1),\n      Curve.fromString(Curve.CN_SECP521R1),\n      Curve(Curve.CI_SECT283K1),\n      Curve(0)\n    ];\n\n    PrivateKeyFixtures fixtures;\n\n    setUp(() {\n      fixtures = PrivateKeyFixtures();\n    });\n    test('can generate keypairs', () {\n      CURVE_INSTANCES.forEach((curve) {\n        if (curve.supported) {\n          for (int i = 0; i < 100; i++) {\n            KeyPair kp = Keys.generate(curve: curve);\n            expect(kp is KeyPair, true);\n            expect(kp.curve.id, curve.id);\n            expect(\n                PDUtil.byteToHex(\n                    Keys.fromPrivateKey(kp.privateKey).publicKey.ec()),\n                PDUtil.byteToHex(kp.publicKey.ec()));\n          }\n        }\n      });\n    });\n    test('cannot generate unsupported curves', () {\n      CURVE_INSTANCES.forEach((curve) {\n        if (!curve.supported) {\n          expect(() => Keys.generate(curve: curve), throwsUnsupportedError);\n        }\n      });\n    });\n    test('can retrieve a keypair from a private key', () {\n      fixtures.curve714.forEach((c) {\n        if (Curve(714).supported) {\n          KeyPair kp = Keys.fromPrivateKey(PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey'])));\n          expect(kp.curve.id, 714);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(\n              () => Keys.fromPrivateKey(PrivateKeyCoder()\n                  .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']))),\n              throwsException);\n        }\n      });\n      fixtures.curve715.forEach((c) {\n        if (Curve(715).supported) {\n          KeyPair kp = Keys.fromPrivateKey(PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey'])));\n          expect(kp.curve.id, 715);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(\n              () => Keys.fromPrivateKey(PrivateKeyCoder()\n                  .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']))),\n              throwsException);\n        }\n      });\n      fixtures.curve716.forEach((c) {\n        if (Curve(716).supported) {\n          KeyPair kp = Keys.fromPrivateKey(PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey'])));\n          expect(kp.curve.id, 716);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(\n              () => Keys.fromPrivateKey(PrivateKeyCoder()\n                  .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']))),\n              throwsException);\n        }\n      });\n      fixtures.curve729.forEach((c) {\n        if (Curve(729).supported) {\n          KeyPair kp = Keys.fromPrivateKey(PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey'])));\n          expect(kp.curve.id, 729);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(\n              () => Keys.fromPrivateKey(PrivateKeyCoder()\n                  .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']))),\n              throwsException);\n        }\n      });\n    });\n    test('can sign a value', () {\n      fixtures.curve714.forEach((c) {\n        if (Curve(714).supported && fixtures.curve714.indexOf(c) == 0) {\n          PrivateKey pk = PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n          Signature sig = Keys.sign(pk, PDUtil.stringToBytesUtf8('test123'),\n              hashMessage: false);\n          expect(\n              PDUtil.byteToHex(PDUtil.encodeBigInt(sig.r)),\n              '4C3492DC3FB565D9D4C132575BCEAA55571491A983A82A5460E341198E38C250');\n          expect(\n              PDUtil.byteToHex(PDUtil.encodeBigInt(sig.s)),\n              '7FA6FF43CD3B13F6E91F810FEF9BE6359CA355C53272C841D2BF934217EE53DE');\n        }\n      });\n      fixtures.curve715.forEach((c) {\n        if (Curve(715).supported && fixtures.curve715.indexOf(c) == 0) {\n          PrivateKey pk = PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n          Signature sig = Keys.sign(pk, PDUtil.stringToBytesUtf8('test123'));\n          expect(\n              PDUtil.byteToHex(PDUtil.encodeBigInt(sig.r)).length == 96, true);\n          expect(\n              PDUtil.byteToHex(PDUtil.encodeBigInt(sig.s)).length == 96, true);\n        }\n      });\n      fixtures.curve716.forEach((c) {\n        if (Curve(716).supported && fixtures.curve716.indexOf(c) == 0) {\n          PrivateKey pk = PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n          Signature sig = Keys.sign(pk, PDUtil.stringToBytesUtf8('test123'));\n          expect(PDUtil.byteToHex(PDUtil.encodeBigInt(sig.r)).isNotEmpty, true);\n          expect(PDUtil.byteToHex(PDUtil.encodeBigInt(sig.s)).isNotEmpty, true);\n        }\n      });\n      fixtures.curve729.forEach((c) {\n        if (Curve(729).supported) {\n          PrivateKey pk = PrivateKeyCoder()\n              .decodeFromBytes(PDUtil.hexToBytes(c['enc_privkey']));\n          Signature sig = Keys.sign(pk, PDUtil.stringToBytesUtf8('test123'));\n          expect(PDUtil.byteToHex(PDUtil.encodeBigInt(sig.r)).isNotEmpty, true);\n          expect(PDUtil.byteToHex(PDUtil.encodeBigInt(sig.s)).isNotEmpty, true);\n        }\n      });\n    });\n    test('can retrieve a keypair from an encrypted private key', () {\n      fixtures.curve714.forEach((c) {\n        if (Curve(714).supported) {\n          PrivateKey pKey = PrivateKeyCrypt.decrypt(\n              PDUtil.hexToBytes(c['encrypted']), c['password']);\n          KeyPair kp = Keys.fromPrivateKey(pKey);\n          expect(kp.curve.id, 714);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(() {\n            PrivateKey pKey = PrivateKeyCrypt.decrypt(\n                PDUtil.hexToBytes(c['encrypted']), c['password']);\n            Keys.fromPrivateKey(pKey);\n          }, throwsException);\n        }\n      });\n      fixtures.curve715.forEach((c) {\n        if (Curve(715).supported) {\n          PrivateKey pKey = PrivateKeyCrypt.decrypt(\n              PDUtil.hexToBytes(c['encrypted']), c['password']);\n          KeyPair kp = Keys.fromPrivateKey(pKey);\n          expect(kp.curve.id, 715);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(() {\n            PrivateKey pKey = PrivateKeyCrypt.decrypt(\n                PDUtil.hexToBytes(c['encrypted']), c['password']);\n            Keys.fromPrivateKey(pKey);\n          }, throwsException);\n        }\n      });\n      fixtures.curve716.forEach((c) {\n        if (Curve(716).supported) {\n          PrivateKey pKey = PrivateKeyCrypt.decrypt(\n              PDUtil.hexToBytes(c['encrypted']), c['password']);\n          KeyPair kp = Keys.fromPrivateKey(pKey);\n          expect(kp.curve.id, 716);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(() {\n            PrivateKey pKey = PrivateKeyCrypt.decrypt(\n                PDUtil.hexToBytes(c['encrypted']), c['password']);\n            Keys.fromPrivateKey(pKey);\n          }, throwsException);\n        }\n      });\n      fixtures.curve729.forEach((c) {\n        if (Curve(729).supported) {\n          PrivateKey pKey = PrivateKeyCrypt.decrypt(\n              PDUtil.hexToBytes(c['encrypted']), c['password']);\n          KeyPair kp = Keys.fromPrivateKey(pKey);\n          expect(kp.curve.id, 729);\n          expect(\n              PDUtil.byteToHex(PrivateKeyCoder().encodeToBytes(kp.privateKey)),\n              c['enc_privkey']);\n          expect(\n              PublicKeyCoder().encodeToBase58(kp.publicKey), c['b58_pubkey']);\n        } else {\n          expect(() {\n            PrivateKey pKey = PrivateKeyCrypt.decrypt(\n                PDUtil.hexToBytes(c['encrypted']), c['password']);\n            Keys.fromPrivateKey(pKey);\n          }, throwsException);\n        }\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/pascal_account_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.pascal_account', () {\n    test('can serialize getaccount response', () {\n      Map<String, dynamic> rawResponse = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": 123,\n        \"result\": {\n          \"account\": 1920,\n          \"enc_pubkey\":\n              \"CA0220009D92DFA1D6F8B2CAE31194EE5433EE4AD457AE145C1C67E49A9196EE58A45B9F200046EAF20C0A26A80A7693E71C0222313A0187AFCA838209FF86FB740A4FFF7F0B\",\n          \"balance\": 29595.952,\n          \"n_operation\": 0,\n          \"updated_b\": 11973\n        }\n      };\n      BaseResponse baseResp = BaseResponse.fromJson(rawResponse);\n      expect(baseResp.jsonrpc, \"2.0\");\n      expect(baseResp.id, 123);\n      PascalAccount getAcctResp = PascalAccount.fromJson(baseResp.result);\n      expect(getAcctResp.account.account, 1920);\n      expect(\n          PDUtil.byteToHex(\n              PublicKeyCoder().encodeToBytes(getAcctResp.encPubkey)),\n          'CA0220009D92DFA1D6F8B2CAE31194EE5433EE4AD457AE145C1C67E49A9196EE58A45B9F200046EAF20C0A26A80A7693E71C0222313A0187AFCA838209FF86FB740A4FFF7F0B');\n      expect(getAcctResp.balance.toStringOpt(), '29595.952');\n      expect(getAcctResp.nOperation, 0);\n      expect(getAcctResp.updatedBlock, 11973);\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/pascal_block_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.pascal_block', () {\n    test('can serialize block response', () {\n      Map<String, dynamic> rawResponse = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": 123,\n        \"result\": {\n          \"block\": 8888,\n          \"enc_pubkey\":\n              \"CA0220000E60B6F76778CFE8678E30369BA7B2C38D0EC93FC3F39E61468E29FEC39F13BF2000572EDE3C44CF00FF86AFF651474D53CCBDF86B953F1ECE5FB8FC7BB6FA16F114\",\n          \"reward\": 100,\n          \"fee\": 0,\n          \"ver\": 1,\n          \"ver_a\": 0,\n          \"timestamp\": 1473161258,\n          \"target\": 559519020,\n          \"nonce\": 131965022,\n          \"payload\":\n              \"New Node 9/4/2016 10:10:13 PM - Pascal Coin Miner & Explorer Build:1.0.2.0\",\n          \"sbh\":\n              \"5B75D33D9EFBF560EF5DA9B4A603528808626FE6C1FCEC44F83AF2330C6607EF\",\n          \"oph\":\n              \"81BE87831F03A2FE272C89BC6D2406DD57614846D9CEF30096BF574AB4AB3EE9\",\n          \"pow\":\n              \"00000000213A39EBBAB6D1FAEAA1EE528E398A587848F81FF66F7DA6113FC754\",\n          \"operations\": 1\n        }\n      };\n\n      BaseResponse baseResp = BaseResponse.fromJson(rawResponse);\n      expect(baseResp.jsonrpc, \"2.0\");\n      expect(baseResp.id, 123);\n      PascalBlock block = PascalBlock.fromJson(baseResp.result);\n      expect(block.block, 8888);\n      expect(PDUtil.byteToHex(PublicKeyCoder().encodeToBytes(block.encPubkey)),\n          'CA0220000E60B6F76778CFE8678E30369BA7B2C38D0EC93FC3F39E61468E29FEC39F13BF2000572EDE3C44CF00FF86AFF651474D53CCBDF86B953F1ECE5FB8FC7BB6FA16F114');\n      expect(block.reward.toStringOpt(), '100');\n      expect(block.fee.toStringOpt(), '0');\n      expect(block.ver, 1);\n      expect(block.ver_a, 0);\n      expect(block.timestamp.millisecondsSinceEpoch ~/ 1000, 1473161258);\n      expect(block.target, 559519020);\n      expect(block.nonce, 131965022);\n      expect(block.payload,\n          \"New Node 9/4/2016 10:10:13 PM - Pascal Coin Miner & Explorer Build:1.0.2.0\");\n      expect(block.sbh,\n          \"5B75D33D9EFBF560EF5DA9B4A603528808626FE6C1FCEC44F83AF2330C6607EF\");\n      expect(block.oph,\n          \"81BE87831F03A2FE272C89BC6D2406DD57614846D9CEF30096BF574AB4AB3EE9\");\n      expect(block.pow,\n          \"00000000213A39EBBAB6D1FAEAA1EE528E398A587848F81FF66F7DA6113FC754\");\n      expect(block.operations, 1);\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/pascal_operation_test.dart",
    "content": "import 'package:pascaldart/common.dart';\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.pascal_operation', () {\n    test('can serialize operation response', () {\n      Map<String, dynamic> rawResponse = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": 123,\n        \"result\": {\n          \"block\": 21555,\n          \"opblock\": 0,\n          \"optype\": 2,\n          \"time\": 1561919606,\n          \"account\": 101740,\n          \"optxt\": \"Change Key to secp256k1\",\n          \"amount\": 0,\n          \"fee\": 0,\n          \"balance\": 0,\n          \"payload\": \"\",\n          \"enc_pubkey\":\n              \"CA02200078D867C93D58C2C46C66667A139543DCF8420D9119B7A0E06197D22A5BBCE5542000EA2E492FD8B90E48AF3D9EF438C6FBEA57C8A8E75889807DE588B490B1D57187\",\n          \"ophash\":\n              \"335400006C8D0100020000003330433034464446453130354434444445424141\"\n        }\n      };\n\n      BaseResponse baseResp = BaseResponse.fromJson(rawResponse);\n      expect(baseResp.jsonrpc, \"2.0\");\n      expect(baseResp.id, 123);\n      PascalOperation op = PascalOperation.fromJson(baseResp.result);\n      expect(op.block, 21555);\n      expect(op.opblock, 0);\n      expect(op.optype, 2);\n      expect(op.time.millisecondsSinceEpoch ~/ 1000, 1561919606);\n      expect(op.time.year, 2019);\n      expect(op.account.account, 101740);\n      expect(op.optxt, \"Change Key to secp256k1\");\n      expect(op.amount.pasc, BigInt.zero);\n      expect(op.fee.pasc, BigInt.zero);\n      expect(op.balance.pasc, BigInt.zero);\n      expect(op.payload, \"\");\n      expect(PDUtil.byteToHex(PublicKeyCoder().encodeToBytes(op.encPubkey)),\n          'CA02200078D867C93D58C2C46C66667A139543DCF8420D9119B7A0E06197D22A5BBCE5542000EA2E492FD8B90E48AF3D9EF438C6FBEA57C8A8E75889807DE588B490B1D57187');\n      expect(op.ophash,\n          '335400006C8D0100020000003330433034464446453130354434444445424141');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/executeoperations_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.executeoperations.test', () {\n    test('can serialize executeoperations', () {\n      ExecuteOperationsRequest opsRequest =\n          ExecuteOperationsRequest(rawOperations: 'hexastring');\n      expect(json.encode(opsRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"executeoperations\",\"id\":0,\"params\":{\"rawoperations\":\"hexastring\"}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/findaccounts_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.findaccounts_request', () {\n    test('can serialize findaccounts', () {\n      FindAccountsRequest request =\n          FindAccountsRequest(name: 'bbedward', exact: true);\n      expect(json.encode(request.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"findaccounts\",\"id\":0,\"params\":{\"name\":\"bbedward\",\"exact\":true}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/findoperation_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.findoperation_request', () {\n    test('can serialize findoperation', () {\n      FindOperationRequest request = FindOperationRequest(ophash: '1234');\n      expect(json.encode(request.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"findoperation\",\"id\":0,\"params\":{\"ophash\":\"1234\"}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getaccount_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.GetAccountRequest', () {\n    test('can serialize GetAccountRequest', () {\n      GetAccountRequest acctRequest = GetAccountRequest(account: 1234);\n      expect(json.encode(acctRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getaccount\",\"id\":0,\"params\":{\"account\":1234}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getaccountoperations_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.getaccountoperations.test', () {\n    test('can serialize getaccountoperations', () {\n      GetAccountOperationsRequest opsRequest =\n          GetAccountOperationsRequest(account: 1234);\n      expect(json.encode(opsRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getaccountoperations\",\"id\":0,\"params\":{\"account\":1234}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getblock_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.GetBlockRequest', () {\n    test('can serialize GetBlockRequest', () {\n      GetBlockRequest blockRequest = GetBlockRequest(block: 1234);\n      expect(json.encode(blockRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getblock\",\"id\":0,\"params\":{\"block\":1234}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getblockoperation_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.getblockoperation.test', () {\n    test('can serialize getblockoperation', () {\n      GetBlockOperationRequest opsRequest =\n          GetBlockOperationRequest(block: 1234);\n      expect(json.encode(opsRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getblockoperation\",\"id\":0,\"params\":{\"block\":1234,\"opblock\":0}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getblockoperations_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.getblockoperations.test', () {\n    test('can serialize getblockoperations', () {\n      GetBlockOperationsRequest opsRequest =\n          GetBlockOperationsRequest(block: 1234);\n      expect(json.encode(opsRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getblockoperations\",\"id\":0,\"params\":{\"block\":1234}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getblocks_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.GetBlocksRequest', () {\n    test('can serialize GetBlocksRequest with last', () {\n      GetBlocksRequest blockRequest = GetBlocksRequest(last: 1234);\n      expect(json.encode(blockRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getblocks\",\"id\":0,\"params\":{\"last\":1234}}');\n    });\n    test('can serialize GetBlocksRequest with start and end', () {\n      GetBlocksRequest blockRequest = GetBlocksRequest(start: 1, end: 100);\n      expect(json.encode(blockRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getblocks\",\"id\":0,\"params\":{\"start\":1,\"end\":100}}');\n    });\n    test('throws exceptions with bad arguments', () {\n      expect(() => GetBlocksRequest(start: 1), throwsArgumentError);\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getpendings_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.getpendings_request', () {\n    test('can serialize getpendings', () {\n      GetPendingsRequest request = GetPendingsRequest(max: 0);\n      expect(json.encode(request.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getpendings\",\"id\":0,\"params\":{\"max\":0}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/json_rpc/model/request/getwalletaccounts_request_test.dart",
    "content": "import 'dart:convert';\n\nimport 'package:pascaldart/json_rpc.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('json_rpc.model.request.getwalletaccounts_request', () {\n    test('can serialize getwalletaccounts', () {\n      GetWalletAccountsRequest acctRequest = GetWalletAccountsRequest(\n          encPubkey:\n              'CA0220009D92DFA1D6F8B2CAE31194EE5433EE4AD457AE145C1C67E49A9196EE58A45B9F200046EAF20C0A26A80A7693E71C0222313A0187AFCA838209FF86FB740A4FFF7F0B');\n      expect(json.encode(acctRequest.toJson()),\n          '{\"jsonrpc\":\"2.0\",\"method\":\"getwalletaccounts\",\"id\":0,\"params\":{\"enc_pubkey\":\"CA0220009D92DFA1D6F8B2CAE31194EE5433EE4AD457AE145C1C67E49A9196EE58A45B9F200046EAF20C0A26A80A7693E71C0222313A0187AFCA838209FF86FB740A4FFF7F0B\"}}');\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/buyaccount_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:pascaldart/src/common/model/accountnumber.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.BuyAccountOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'signerPublicKey':\n            '3Ghhboo1Q8CFLc9BTdcweNX75Nctifx8aW1ovF58F1VyjHRxuDQRx2xUcSSm6ragsTRUZHGPSvdwM1HnReE4Je8aYeVeZHFJf23H2z',\n        'buyerAccount': 1430880,\n        'accountToBuy': 1440500,\n        'price': 0.0001,\n        'fee': 0.0002,\n        'payload': 'techworker',\n        'seller': 1440500,\n        'n_operation': 4004,\n        'r': '3B3FF1BA82E8923F6FA8B92B10FEA291CC73E563D4CB92E58039F3D25DB98FA1',\n        's': '7449069D5E034AD0B3419532B11530B52E3EBDBBBB1E754CDEADB6E709291B6B',\n        'raw':\n            '010000000600000060D51500A40F0000F4FA1500000000000000000002000000000000000A0074656368776F726B6572000000000000020100000000000000F4FA150000000000000020003B3FF1BA82E8923F6FA8B92B10FEA291CC73E563D4CB92E58039F3D25DB98FA120007449069D5E034AD0B3419532B11530B52E3EBDBBBB1E754CDEADB6E709291B6B'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      BuyAccountOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.sender.account, fixture['buyerAccount']);\n      expect(decoded.target.account, fixture['accountToBuy']);\n      expect(decoded.seller.account, fixture['seller']);\n      expect(decoded.price.toStringOpt(), fixture['price'].toString());\n      expect(decoded.amount.toStringOpt(), '0');\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n    });\n    test('can be decode signed operation and encode it again', () {\n      BuyAccountOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n    test('can be built by hand', () {\n      BuyAccountOperation op = BuyAccountOperation(\n          sender: AccountNumber.fromInt(fixture['buyerAccount']),\n          target: AccountNumber.fromInt(fixture['accountToBuy']),\n          seller: AccountNumber.fromInt(fixture['seller']),\n          price: Currency(fixture['price'].toString()))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      BuyAccountOperation op = BuyAccountOperation(\n          sender: AccountNumber.fromInt(fixture['buyerAccount']),\n          target: AccountNumber.fromInt(fixture['accountToBuy']),\n          seller: AccountNumber.fromInt(fixture['seller']),\n          price: Currency(fixture['price'].toString()))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/changeaccountinfo_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.ChangeAccountInfoOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'signerPublicKey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'signer': 1440500,\n        'target': 1440503,\n        'newPublicKey':\n            '3Ghhbommc5imqoAUAzXoEJpYo1qLiyVZip3Pwsj7WUXq7aFXwC4tw1MFsRrhPnA51CMAoeoyGJcMGV1dSU9FAqXRsnV2LLT7tBKDeY',\n        'newName': 'techworker123',\n        'newType': '345',\n        'n_operation': 4003,\n        'fee': 0.0002,\n        'payload': 'techworker',\n        'r': '28D54FB4B87C8DEA5884876FA6DDD30115B1EAECEA50869181CC05D788C74D6A',\n        's': '61E719DCEE48E93B94BC0938D1CADDBCB7E59F259097C622C98E5D0C758BB5AC',\n        'raw':\n            '0100000008000000F4FA1500F7FA1500A30F000002000000000000000A0074656368776F726B657200000000000007CA0220003078FA6B1419BD6F4D4F6A779358EBFA6BC12F3CE32E47A8D9F7CD5FA8956FF0200053A101778813DD24B90A5198BAE5EB9F8AA5EDFD30E4C130A69FDD62CAE774F90D0074656368776F726B65723132335901200028D54FB4B87C8DEA5884876FA6DDD30115B1EAECEA50869181CC05D788C74D6A200061E719DCEE48E93B94BC0938D1CADDBCB7E59F259097C622C98E5D0C758BB5AC'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      ChangeAccountInfoOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.accountSigner.account, fixture['signer']);\n      expect(decoded.targetSigner.account, fixture['target']);\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(decoded.changeType & 1, 1);\n      expect(decoded.changeType & 2, 2);\n      expect(decoded.changeType & 4, 4);\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n      expect(decoded.newName.toString(), fixture['newName']);\n      expect(decoded.newType.toString(), fixture['newType']);\n      expect(PublicKeyCoder().encodeToBase58(decoded.newPublicKey),\n          fixture['newPublicKey']);\n    });\n\n    test('can be decode signed operation and encode it again', () {\n      ChangeAccountInfoOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n\n    test('can be build by hand', () {\n      ChangeAccountInfoOperation op = ChangeAccountInfoOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..setNewName(AccountName(fixture['newName']))\n        ..setNewType(int.parse(fixture['newType']))\n        ..setNewPublickey(\n            PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      ChangeAccountInfoOperation op = ChangeAccountInfoOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..setNewName(AccountName(fixture['newName']))\n        ..setNewType(int.parse(fixture['newType']))\n        ..setNewPublickey(\n            PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n    test('can compute digest correctly', () {\n      ChangeAccountInfoOperation op = ChangeAccountInfoOperation(\n        accountSigner: AccountNumber.fromInt(1440500),\n        targetSigner: AccountNumber.fromInt(1440500),\n        newName: AccountName('bbedward'),\n        withNewName: true\n      )\n      ..withNOperation(20)\n      ..withPayload(PDUtil.stringToBytesUtf8(\"\"))\n      ..withFee(Currency(\"0\"))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n        expect(PDUtil.byteToHex(op.digest()), 'F4FA1500F4FA150014000000000000000000000000000000000000000200000000000008006262656477617264000008');\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/changekey_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.ChangeKeyOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'signer': 1440500,\n        'oldPublicKey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'newPublicKey':\n            '3Ghhbommc5imqoAUAzXoEJpYo1qLiyVZip3Pwsj7WUXq7aFXwC4tw1MFsRrhPnA51CMAoeoyGJcMGV1dSU9FAqXRsnV2LLT7tBKDeY',\n        'fee': 0.0002,\n        'n_operation': 4003,\n        'payload': 'techworker',\n        's': '40041D0D33034504B20C51277F76F2784BAE43C46F60526B50F37D90C8310919',\n        'r': '0981C22EDEE3E56DEBFABB8DF6229C10971E283D9B01B2D914176EFDAEF891F5',\n        'raw':\n            '0100000002000000F4FA1500A30F000002000000000000000A0074656368776F726B65720000000000004600CA0220003078FA6B1419BD6F4D4F6A779358EBFA6BC12F3CE32E47A8D9F7CD5FA8956FF0200053A101778813DD24B90A5198BAE5EB9F8AA5EDFD30E4C130A69FDD62CAE774F920000981C22EDEE3E56DEBFABB8DF6229C10971E283D9B01B2D914176EFDAEF891F5200040041D0D33034504B20C51277F76F2784BAE43C46F60526B50F37D90C8310919'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      ChangeKeyOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.signer.account, fixture['signer']);\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n      expect(PublicKeyCoder().encodeToBase58(decoded.newPublicKey),\n          fixture['newPublicKey']);\n    });\n\n    test('can be decode signed operation and encode it again', () {\n      ChangeKeyOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n\n    test('can be build by hand', () {\n      ChangeKeyOperation op = ChangeKeyOperation(\n          signer: AccountNumber.fromInt(fixture['signer']),\n          newPublicKey:\n              PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      ChangeKeyOperation op = ChangeKeyOperation(\n          signer: AccountNumber.fromInt(fixture['signer']),\n          newPublicKey:\n              PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/changekeysigned_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.ChangeKeySignedOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'sender': 1440500,\n        'target': 1440503,\n        'oldPublicKey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'newPublicKey':\n            '3Ghhbommc5imqoAUAzXoEJpYo1qLiyVZip3Pwsj7WUXq7aFXwC4tw1MFsRrhPnA51CMAoeoyGJcMGV1dSU9FAqXRsnV2LLT7tBKDeY',\n        'fee': 0.0002,\n        'payload': 'techworker',\n        'n_operation': 4003,\n        's': 'AEB41A5FB2D7A1B89C17897E87959AE63B9864236397FBDCFF118E964B1211C8',\n        'r': '5CAD340D46F1A926DCD3FA00962A0EFC856733E46285BF945B1F19A90DE2BEF8',\n        'raw':\n            '0100000007000000F4FA1500F7FA1500A30F000002000000000000000A0074656368776F726B65720000000000004600CA0220003078FA6B1419BD6F4D4F6A779358EBFA6BC12F3CE32E47A8D9F7CD5FA8956FF0200053A101778813DD24B90A5198BAE5EB9F8AA5EDFD30E4C130A69FDD62CAE774F920005CAD340D46F1A926DCD3FA00962A0EFC856733E46285BF945B1F19A90DE2BEF82000AEB41A5FB2D7A1B89C17897E87959AE63B9864236397FBDCFF118E964B1211C8'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      ChangeKeySignedOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.signer.account, fixture['sender']);\n      expect(decoded.target.account, fixture['target']);\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n      expect(PublicKeyCoder().encodeToBase58(decoded.newPublicKey),\n          fixture['newPublicKey']);\n    });\n\n    test('can be decode signed operation and encode it again', () {\n      ChangeKeySignedOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n\n    test('can be build by hand', () {\n      ChangeKeySignedOperation op = ChangeKeySignedOperation(\n          signer: AccountNumber.fromInt(fixture['sender']),\n          target: AccountNumber.fromInt(fixture['target']),\n          newPublicKey:\n              PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      ChangeKeySignedOperation op = ChangeKeySignedOperation(\n          signer: AccountNumber.fromInt(fixture['sender']),\n          target: AccountNumber.fromInt(fixture['target']),\n          newPublicKey:\n              PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/delist_forsale_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:pascaldart/src/common/model/accountnumber.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.DeListForSaleOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'signer': 1554325,\n        'target': 1554326,\n        'seller': 0,\n        'price': 0,\n        'fee': 0.0001,\n        'payload': 'test',\n        'n_operation': 1,\n        'lockedUntilBlock': 0,\n        'r': '270B996CE47B3C725223A87799BF74E32E1800102B3442F271ED81396708C4EB',\n        's': '932D3542356861815F5A794E80D8945042B5A3852F5D99D1F30EE5C718522C0E',\n        'digest':\n            '95B7170096B717000100000000000000000000000000000001000000000000007465737400000000000000000000000005',\n        'raw':\n            '010000000500000095B7170096B7170005000100000001000000000000000400746573742000270B996CE47B3C725223A87799BF74E32E1800102B3442F271ED81396708C4EB2000932D3542356861815F5A794E80D8945042B5A3852F5D99D1F30EE5C718522C0E'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      DeListForSaleOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.accountSigner.account, fixture['signer']);\n      expect(decoded.targetSigner.account, fixture['target']);\n      expect(decoded.accountToPay.account, fixture['seller']);\n      expect(decoded.price.toStringOpt(), fixture['price'].toString());\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(decoded.lockedUntilBlock, fixture['lockedUntilBlock']);\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n    });\n    test('can be decode signed operation and encode it again', () {\n      DeListForSaleOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n    test('can be built by hand', () {\n      DeListForSaleOperation op = DeListForSaleOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      DeListForSaleOperation op = DeListForSaleOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n    test('can generate correct digest', () {\n      DeListForSaleOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n      expect(PDUtil.byteToHex(decoded.digest()), fixture['digest']);\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/list_forsale_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:pascaldart/src/common/model/accountnumber.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.ListForSaleOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'signerPublicKey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'signer': 1440500,\n        'target': 1440503,\n        'seller': 1440500,\n        'lockedUntilBlock': 350000,\n        'price': 0.0017,\n        'newPublicKey':\n            '3Ghhbommc5imqoAUAzXoEJpYo1qLiyVZip3Pwsj7WUXq7aFXwC4tw1MFsRrhPnA51CMAoeoyGJcMGV1dSU9FAqXRsnV2LLT7tBKDeY',\n        'fee': 0.0002,\n        'payload': 'techworker',\n        'n_operation': 4003,\n        's': '32D4CAF3A0FCF1854C00E18FA0838A2EF926C63FAEEF7C862E1750CB6D20DFD0',\n        'r': 'A8A08439B6A54BF7E42EFB971B5709874E7F12F6B265684CAA9937BD28BDC793',\n        'raw':\n            '0100000004000000F4FA1500F7FA15000400A30F00001100000000000000F4FA15000000000000004600CA0220003078FA6B1419BD6F4D4F6A779358EBFA6BC12F3CE32E47A8D9F7CD5FA8956FF0200053A101778813DD24B90A5198BAE5EB9F8AA5EDFD30E4C130A69FDD62CAE774F93057050002000000000000000A0074656368776F726B65722000A8A08439B6A54BF7E42EFB971B5709874E7F12F6B265684CAA9937BD28BDC793200032D4CAF3A0FCF1854C00E18FA0838A2EF926C63FAEEF7C862E1750CB6D20DFD0'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      ListForSaleOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.accountSigner.account, fixture['signer']);\n      expect(decoded.targetSigner.account, fixture['target']);\n      expect(decoded.accountToPay.account, fixture['seller']);\n      expect(decoded.price.toStringOpt(), fixture['price'].toString());\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(decoded.lockedUntilBlock, fixture['lockedUntilBlock']);\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n      expect(PublicKeyCoder().encodeToBase58(decoded.newPublicKey),\n          fixture['newPublicKey']);\n    });\n    test('can be decode signed operation and encode it again', () {\n      ListForSaleOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n    test('can be built by hand', () {\n      ListForSaleOperation op = ListForSaleOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']),\n          price: Currency(fixture['price'].toString()),\n          accountToPay: AccountNumber.fromInt(fixture['seller']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..asPrivateSale(\n            PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']),\n            fixture['lockedUntilBlock'])\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      ListForSaleOperation op = ListForSaleOperation(\n          accountSigner: AccountNumber.fromInt(fixture['signer']),\n          targetSigner: AccountNumber.fromInt(fixture['target']),\n          price: Currency(fixture['price'].toString()),\n          accountToPay: AccountNumber.fromInt(fixture['seller']))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..asPrivateSale(\n            PublicKeyCoder().decodeFromBase58(fixture['newPublicKey']),\n            fixture['lockedUntilBlock'])\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n  });\n}\n"
  },
  {
    "path": "test/signing/operations/transaction_operation_test.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:pascaldart/common.dart';\nimport 'package:pascaldart/crypto.dart';\nimport 'package:pascaldart/signing.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nvoid main() {\n  group('signing.operations.TransactionOperation', () {\n    Map<String, dynamic> fixture;\n\n    setUp(() {\n      fixture = {\n        'sender': 1440500,\n        'target': 1440503,\n        'senderPubkey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'targetPubkey':\n            '3GhhbojvCFtyYSPxXfuk86uvJhURBEzF2fxV7x6kuW3Gi7ApSDd1scztAXGyeqphytxi6XibueQCoAG3yBCkXvg1BfGnosd6xKnKPT',\n        'amount': 0.0015,\n        'fee': 0.0002,\n        'payload': 'techworker',\n        'n_operation': 4003,\n        'r': '1201D10D537B0F6D7CB2032A768A851E0EF2426AA37756BCADB994AF189D124A',\n        's': '9DACA47597ADFB3E529B82EB231396F464EE1C4E76DC6E85CD10CA3711C2D6C2',\n        'raw':\n            '0100000001000000F4FA1500A30F0000F7FA15000F0000000000000002000000000000000A0074656368776F726B657200000000000020001201D10D537B0F6D7CB2032A768A851E0EF2426AA37756BCADB994AF189D124A20009DACA47597ADFB3E529B82EB231396F464EE1C4E76DC6E85CD10CA3711C2D6C2'\n      };\n    });\n\n    test('can be decode a signed operation', () {\n      TransactionOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.r)),\n          fixture['r']);\n      expect(PDUtil.byteToHex(PDUtil.encodeBigInt(decoded.signature.s)),\n          fixture['s']);\n      expect(decoded.sender.account, fixture['sender']);\n      expect(decoded.target.account, fixture['target']);\n      expect(decoded.amount.toStringOpt(), fixture['amount'].toString());\n      expect(decoded.fee.toStringOpt(), fixture['fee'].toString());\n      expect(decoded.nOperation, fixture['n_operation']);\n      expect(PDUtil.bytesToUtf8String(decoded.payload), fixture['payload']);\n    });\n    test('can be decode signed operation and encode it again', () {\n      TransactionOperation decoded =\n          RawOperationCoder.decodeFromBytes(PDUtil.hexToBytes(fixture['raw']));\n\n      expect(PDUtil.byteToHex(RawOperationCoder.encodeToBytes(decoded)),\n          fixture['raw']);\n    });\n    test('can be built by hand', () {\n      TransactionOperation op = TransactionOperation(\n          sender: AccountNumber.fromInt(fixture['sender']),\n          target: AccountNumber.fromInt(fixture['target']),\n          amount: Currency(fixture['amount'].toString()))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..withSignature(Signature(\n            r: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['r'])),\n            s: PDUtil.decodeBigInt(PDUtil.hexToBytes(fixture['s']))));\n\n      Uint8List encoded = RawOperationCoder.encodeToBytes(op);\n\n      expect(PDUtil.byteToHex(encoded), fixture['raw']);\n    });\n    test('can be built by hand and signed', () {\n      PrivateKey pk = PrivateKeyCoder().decodeFromBytes(PDUtil.hexToBytes(\n          'CA02200046D101363B3330D65373A70F6E47BB7745FC8EE1F9B3F71992D6B82648158D73'));\n      TransactionOperation op = TransactionOperation(\n          sender: AccountNumber.fromInt(fixture['sender']),\n          target: AccountNumber.fromInt(fixture['target']),\n          amount: Currency(fixture['amount'].toString()))\n        ..withNOperation(fixture['n_operation'])\n        ..withPayload(PDUtil.stringToBytesUtf8(fixture['payload']))\n        ..withFee(Currency(fixture['fee'].toString()))\n        ..sign(pk);\n\n      expect(op.signature.r.toString().length > 30, true);\n      expect(op.signature.s.toString().length > 30, true);\n    });\n    test('can calculate digest correctly', () {\n      TransactionOperation op = TransactionOperation(\n        sender: AccountNumber.fromInt(1440500),\n        target: AccountNumber.fromInt(1440503),\n        amount: Currency('0.0015')\n      )\n      ..withFee(Currency('0'))\n      ..withPayload(PDUtil.stringToBytesUtf8(''))\n      ..withNOperation(4003);\n      expect(PDUtil.byteToHex(op.digest()), 'F4FA1500A30F0000F7FA15000F000000000000000000000000000000000001');\n      TransactionOperation op2 = TransactionOperation(\n        sender: AccountNumber.fromInt(1440500),\n        target: AccountNumber.fromInt(1440503),\n        amount: Currency('0.0015')\n      )\n      ..withFee(Currency('0.0002'))\n      ..withPayload(PDUtil.stringToBytesUtf8('techworker'))\n      ..withNOperation(4003);\n      expect(PDUtil.byteToHex(op2.digest()), 'F4FA1500A30F0000F7FA15000F00000000000000020000000000000074656368776F726B6572000001');\n    });\n  });\n}\n"
  }
]