[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: BUG报告\ntitle: \"[BUG] 请填写简短易读的标题\"\ndescription: \"使用过程中遇到了BUG\"\nassignees: xiaoyaocz\nlabels:\n  - \"bug\"\nbody:\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: 非重复的Issue\n      description: 先去Issues列表中查找下是否存在相似的Issue，如果有了就不要重复发了\n      options:\n        - label: 已确认没有相似的Issue\n          required: true\n\n  - type: textarea\n    id: description\n    validations:\n      required: true\n    attributes:\n      label: BUG内容\n      description: 请详细描述你遇到的问题\n\n  - type: textarea\n    id: steps\n    validations:\n      required: true\n    attributes:\n      label: 重现步骤\n      render: plain text\n      description: 请详细描述重现步骤\n      placeholder: |\n        1. xxxx\n        2. xxxx\n        3. xxxx\n\n  - type: textarea\n    id: screenshots\n    attributes:\n      label: 截图或视频\n      description: 请上传BUG截图、或视频\n\n  - type: textarea\n    id: logs\n    attributes:\n      label: 日志\n      description: 请上传日志文件\n      placeholder: |\n        可以在[其他设置]-[开启日志记录]后获取日志文件\n \n  - type: input\n    id: version\n    attributes:\n      label: 版本号\n      description: 请填写你使用的APP版本号\n      placeholder: ex. 1.0.1\n    validations:\n      required: true\n \n  - type: dropdown\n    id: release-type\n    validations:\n      required: true\n    attributes:\n      label: 使用版本\n      description: 使用的是什么版本，从哪里下载的\n      options:\n        - 正式版(Releases)\n        - 开发版(Actions)\n      default: 0\n\n  - type: dropdown\n    id: platform\n    validations:\n      required: true\n    attributes:\n      label: 运行平台\n      description: 选择你当前运行应用的平台\n      multiple: false\n      options:\n        - Windows\n        - macOS\n        - Linux\n        - Android\n        - iOS\n        - Android TV\n\n  - type: input\n    id: os-version\n    attributes:\n      label: 操作系统信息\n      description: 请填写你的操作系统信息版本\n      placeholder: ex. Windows 10 21H1 / MIUI 15 Android 12\n    validations:\n      required: true\n\n  - type: input\n    id: device\n    attributes:\n      label: 设备信息\n      description: 请填写你的设备信息\n      placeholder: ex. PC / iPhone 12 Pro Max\n    validations:\n      required: true\n\n  - type: textarea\n    id: remark\n    attributes:\n      label: 备注\n      description: 其他信息\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yml",
    "content": "name: 功能请求\r\ntitle: \"[Feature] 请填写简短易读的标题\"\r\ndescription: \"请求开发新的功能/优化某项功能\"\r\nassignees: xiaoyaocz\r\nlabels:\r\n  - \"enhancement\"\r\nbody:\r\n  - type: markdown\r\n    attributes:\r\n      value: |\r\n        你的Issue大概率会搁置很久，除非是那种我能随手解决的。\r\n        暂时不会添加新的平台支持（因为我自己用不上）。如果你有开发能力，建议的自行开发后提交个PR。\r\n\r\n  - type: checkboxes\r\n    id: terms\r\n    attributes:\r\n      label: 非重复的Issue\r\n      description: 先去Issues列表中查找下是否存在相似的Issue，如果有了就不要重复发了\r\n      options:\r\n        - label: 已确认没有相似的Issue\r\n          required: true\r\n\r\n  - type: textarea\r\n    id: description\r\n    validations:\r\n      required: true\r\n    attributes:\r\n      label: 功能描述\r\n      description: 请填写功能描述，如果你有多个建议、请求，请分开提交Issue\r\n\r\n  - type: checkboxes\r\n    id: platform\r\n    attributes:\r\n      label: 平台\r\n      description: 这个功能针对什么平台\r\n      options:\r\n        - label: Android\r\n        - label: iOS\r\n        - label: MacOS\r\n        - label: Windows\r\n        - label: Linux\r\n        - label: Android TV\r\n\r\n  - type: textarea\r\n    id: additional\r\n    attributes:\r\n      label: 附加信息\r\n      description: 可以附加相关截图、视频或链接（好让我知道要我抄哪个APP）\r\n\r\n"
  },
  {
    "path": ".github/workflows/publish_app_dev.yaml",
    "content": "name: app-build-action-dev\n\non:\n  workflow_dispatch:\n  push:\n    tags:\n      - \"dev_v*\"\n\njobs:\n  # 打包Android、iOS、Mac\n  build-mac-ios-android:\n    runs-on: macos-latest\n\n    permissions:\n      contents: write\n\n    steps:\n      # 签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: dev\n\n      # APK签名设置\n      - name: Download Android keystore\n        id: android_keystore\n        uses: timheuer/base64-to-file@v1.2\n        with:\n          fileName: keystore.jks\n          encodedString: ${{ secrets.KEYSTORE_BASE64 }}\n      - name: Create key.properties\n        run: |\n          echo \"storeFile=${{ steps.android_keystore.outputs.filePath }}\" > simple_live_app/android/key.properties\n          echo \"storePassword=${{ secrets.STORE_PASSWORD }}\" >> simple_live_app/android/key.properties\n          echo \"keyPassword=${{ secrets.KEY_PASSWORD }}\" >> simple_live_app/android/key.properties\n          echo \"keyAlias=${{ secrets.KEY_ALIAS }}\" >> simple_live_app/android/key.properties\n\n      # 设置JAVA环境\n      - uses: actions/setup-java@v4\n        with:\n          distribution: \"zulu\"\n          java-version: \"17\"\n          cache: \"gradle\"\n\n      # 设置Flutter\n      - name: Flutter action\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n\n      # 打开MAC Desktop支持\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-macos-desktop\n\n      # 更新Flutter的packages\n      - name: Restore packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n\n      # 安装appdmg npm install -g appdmg\n      - name: Install appdmg\n        run: npm install -g appdmg\n\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n\n      # 打包APK\n      - name: Build APK\n        run: |\n          cd simple_live_app\n          flutter build apk --release --split-per-abi\n\n      #上传Artifacts\n      - name: Upload APK to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: android\n          path: |\n            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n\n      #打包iOS\n      - name: Build IPA\n        run: |\n          cd simple_live_app\n          flutter build ios --release --no-codesign\n\n      #创建未签名ipa\n      - name: Create IPA\n        run: |\n          cd simple_live_app\n          mkdir build/ios/iphoneos/Payload\n          cp -R build/ios/iphoneos/Runner.app build/ios/iphoneos/Payload/Runner.app\n          cd build/ios/iphoneos/\n          zip -q -r ios_no_sign.ipa Payload\n          cd ../../..\n\n      # 上传IPA至Artifacts\n      - name: Upload IPA to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: ios\n          path: |\n            simple_live_app/build/ios/iphoneos/ios_no_sign.ipa\n\n      # 打包MAC\n      - name: Build MacOS\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform macos --targets dmg,zip --skip-clean\n\n      # 上传MAC至Artifacts\n      - name: Upload MacOS to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: mac\n          path: |\n            simple_live_app/build/dist/*/*.dmg\n            simple_live_app/build/dist/*/*.zip\n      #完成\n      - run: echo \"🍏 This job's status is ${{ job.status }}.\"\n\n  # 打包Linux\n  build-linux:\n    runs-on: ubuntu-22.04\n    permissions:\n      contents: write\n    steps:\n      # 签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: dev\n      # 设置Flutter环境\n      - name: Setup Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n      # 安装依赖\n      - name: Update apt-get\n        run: sudo apt-get update\n      - name: Install Dependencies\n        run: sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libasound2-dev libmpv-dev mpv\n      # 打开Linux Desktop支持\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-linux-desktop\n      # 更新Flutter的packages\n      - name: Restore Packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n      # build Linux ZIP\\DMG\n      - name: Build Linux\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform linux --targets deb,zip --skip-clean\n      # 上传Linux包至Artifacts\n      - name: Upload Linux APP to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: linux\n          path: |\n            simple_live_app/build/dist/*/*.deb\n            simple_live_app/build/dist/*/*.zip\n\n        #完成\n      - run: echo \"🍏 Linux job's status is ${{ job.status }}.\"\n\n  # 打包Windows\n  build-windows:\n    runs-on: windows-latest\n    permissions:\n      contents: write\n    steps:\n      # 签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: dev\n      # 设置Flutter环境\n      - name: Setup Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-windows-desktop\n      - name: Restore Packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n      # build Windows ZIP\\MSIX\n      - name: Build Windows\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform windows --targets msix,zip --skip-clean\n      # 上传Windows至Artifacts\n      - name: Upload Windows APP to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: windows\n          path: |\n            simple_live_app/build/dist/*/*.msix\n            simple_live_app/build/dist/*/*.zip\n        #完成\n      - run: echo \"🍏 Windows job's status is ${{ job.status }}.\"\n"
  },
  {
    "path": ".github/workflows/publish_app_release.yml",
    "content": "name: app-build-action\n#推送Tag时触发\non:\n  push:\n    tags:\n      - \"v*\"\njobs:\n  build-mac-ios-android:\n    runs-on: macos-latest\n    permissions:\n      contents: write\n    steps:\n      #签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: master\n\n      #APK签名设置\n      - name: Download Android keystore\n        id: android_keystore\n        uses: timheuer/base64-to-file@v1.2\n        with:\n          fileName: keystore.jks\n          encodedString: ${{ secrets.KEYSTORE_BASE64 }}\n      - name: Create key.properties\n        run: |\n          echo \"storeFile=${{ steps.android_keystore.outputs.filePath }}\" > simple_live_app/android/key.properties\n          echo \"storePassword=${{ secrets.STORE_PASSWORD }}\" >> simple_live_app/android/key.properties\n          echo \"keyPassword=${{ secrets.KEY_PASSWORD }}\" >> simple_live_app/android/key.properties\n          echo \"keyAlias=${{ secrets.KEY_ALIAS }}\" >> simple_live_app/android/key.properties\n\n      #设置JAVA环境\n      - uses: actions/setup-java@v4\n        with:\n          distribution: \"zulu\"\n          java-version: \"17\"\n          cache: \"gradle\"\n\n      #设置Flutter\n      - name: Flutter action\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n\n      # 打开MAC Desktop支持\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-macos-desktop\n\n      #更新Flutter的packages\n      - name: Restore packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n\n      # 安装appdmg npm install -g appdmg\n      - name: Install appdmg\n        run: npm install -g appdmg\n\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n\n      #打包APK\n      - name: Build APK\n        run: |\n          cd simple_live_app\n          flutter build apk --release --split-per-abi\n\n      #上传APK至Artifacts\n      - name: Upload APK to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: android\n          path: |\n            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n\n      #打包iOS\n      - name: Build IPA\n        run: |\n          cd simple_live_app\n          flutter build ios --release --no-codesign\n\n      #创建未签名ipa\n      - name: Create IPA\n        run: |\n          cd simple_live_app\n          mkdir build/ios/iphoneos/Payload\n          cp -R build/ios/iphoneos/Runner.app build/ios/iphoneos/Payload/Runner.app\n          cd build/ios/iphoneos/\n          zip -q -r ios_no_sign.ipa Payload\n          cd ../../..\n\n      #上传IPA至Artifacts\n      - name: Upload IPA to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: ios\n          path: |\n            simple_live_app/build/ios/iphoneos/ios_no_sign.ipa\n\n      # 打包MAC\n      - name: Build MacOS\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform macos --targets dmg,zip --skip-clean\n\n      # 上传MAC至Artifacts\n      - name: Upload MacOS to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: mac\n          path: |\n            simple_live_app/build/dist/*/*.dmg\n            simple_live_app/build/dist/*/*.zip\n\n      #获取版本信息（自动从 Git Tag 提取）\n      - name: Get version from tag\n        id: version\n        run: echo \"VERSION=${GITHUB_REF#refs/tags/}\" >> $GITHUB_OUTPUT\n      - name: Echo version\n        run: echo \"${{ steps.version.outputs.VERSION }}\"\n\n      #上传至Release\n      - name: Upload Release\n        uses: softprops/action-gh-release@v1\n        with:\n          name: \"${{ steps.version.outputs.VERSION }}\"\n          generate_release_notes: true\n          prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }}\n          token: ${{ secrets.TOKEN }}\n          files: |\n            simple_live_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n            simple_live_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n            simple_live_app/build/ios/iphoneos/ios_no_sign.ipa\n            simple_live_app/build/dist/*/*.dmg\n            simple_live_app/build/dist/*/*.zip\n      #完成\n      - run: echo \"🍏 This job's status is ${{ job.status }}.\"\n\n  # 打包Linux\n  build-linux:\n    runs-on: ubuntu-22.04\n    permissions:\n      contents: write\n    steps:\n      # 签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: master\n      # 设置Flutter环境\n      - name: Setup Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n      # 安装依赖\n      - name: Update apt-get\n        run: sudo apt-get update\n      - name: Install Dependencies\n        run: sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libasound2-dev libmpv-dev mpv\n      # 打开Linux Desktop支持\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-linux-desktop\n      # 更新Flutter的packages\n      - name: Restore Packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n      # build Linux ZIP\\DMG\n      - name: Build Linux\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform linux --targets deb,zip --skip-clean\n      # 上传Linux包至Artifacts\n      - name: Upload Linux APP to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: linux\n          path: |\n            simple_live_app/build/dist/*/*.deb\n            simple_live_app/build/dist/*/*.zip\n\n      #获取版本信息（自动从 Git Tag 提取）\n      - name: Get version from tag\n        id: version\n        run: echo \"VERSION=${GITHUB_REF#refs/tags/}\" >> $GITHUB_OUTPUT\n      - name: Echo version\n        run: echo \"${{ steps.version.outputs.VERSION }}\"\n\n      #上传至Release\n      - name: Upload Release\n        uses: softprops/action-gh-release@v1\n        with:\n          name: \"${{ steps.version.outputs.VERSION }}\"\n          generate_release_notes: true\n          prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }}\n          token: ${{ secrets.TOKEN }}\n          files: |\n            simple_live_app/build/dist/*/*.deb\n            simple_live_app/build/dist/*/*.zip\n        #完成\n      - run: echo \"🍏 Linux job's status is ${{ job.status }}.\"\n\n  # 打包Windows\n  build-windows:\n    runs-on: windows-latest\n    permissions:\n      contents: write\n    steps:\n      # 签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: master\n      # 设置Flutter环境\n      - name: Setup Flutter\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n      - name: Enable Flutter Desktop\n        run: flutter config --enable-windows-desktop\n      - name: Restore Packages\n        run: |\n          cd simple_live_app\n          flutter pub get\n      # 设置flutter_distributor环境\n      - name: Install flutter_distributor\n        run: dart pub global activate flutter_distributor\n      # build Windows ZIP\\MSIX\n      - name: Build Windows\n        run: |\n          cd simple_live_app\n          flutter_distributor package --platform windows --targets msix,zip --skip-clean\n\n      # 上传Windows至Artifacts\n      - name: Upload Windows APP to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: windows\n          path: |\n            simple_live_app/build/dist/*/*.msix\n            simple_live_app/build/dist/*/*.zip\n\n      #获取版本信息（自动从 Git Tag 提取）\n      - name: Get version from tag\n        id: version\n        shell: bash\n        run: echo \"VERSION=${GITHUB_REF#refs/tags/}\" >> $GITHUB_OUTPUT\n      - name: Echo version\n        run: echo \"${{ steps.version.outputs.VERSION }}\"\n\n      #上传至Release\n      - name: Upload Release\n        uses: softprops/action-gh-release@v1\n        with:\n          name: \"${{ steps.version.outputs.VERSION }}\"\n          generate_release_notes: true\n          prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'alpha') }}\n          token: ${{ secrets.TOKEN }}\n          files: |\n            simple_live_app/build/dist/*/*.msix\n            simple_live_app/build/dist/*/*.zip\n\n      #完成\n      - run: echo \"🍏 Windows job's status is ${{ job.status }}.\"\n"
  },
  {
    "path": ".github/workflows/publish_tv_app_dev.yaml",
    "content": "name: app-build-action\n#推送Tag时触发\non:\n    push:\n        tags:\n            - \"dev_tv_v*\"\njobs:\n    build-tv:\n        runs-on: macos-latest\n        permissions:\n            contents: write\n        steps:\n            #签出代码\n            - uses: actions/checkout@v4\n              with:\n                  ref: dev\n\n            #APK签名设置\n            - name: Download Android keystore\n              id: android_tv_keystore\n              uses: timheuer/base64-to-file@v1.2\n              with:\n                  fileName: keystore.jks\n                  encodedString: ${{ secrets.TV_KEYSTORE_BASE64 }}\n            - name: Create key.properties\n              run: |\n                  echo \"storeFile=${{ steps.android_tv_keystore.outputs.filePath }}\" > simple_live_tv_app/android/key.properties\n                  echo \"storePassword=${{ secrets.TV_STORE_PASSWORD }}\" >> simple_live_tv_app/android/key.properties\n                  echo \"keyPassword=${{ secrets.TV_KEY_PASSWORD }}\" >> simple_live_tv_app/android/key.properties\n                  echo \"keyAlias=${{ secrets.TV_KEY_ALIAS }}\" >> simple_live_tv_app/android/key.properties\n\n            # 设置JAVA环境\n            - uses: actions/setup-java@v4\n              with:\n                  distribution: \"zulu\"\n                  java-version: \"17\"\n                  cache: \"gradle\"\n\n            #设置Flutter\n            - name: Flutter action\n              uses: subosito/flutter-action@v2\n              with:\n                  flutter-version: \"3.38.x\"\n                  cache: true\n\n            #更新Flutter的packages\n            - name: Restore packages\n              run: |\n                  cd simple_live_tv_app\n                  flutter pub get\n\n            #打包APK\n            - name: Build APK\n              run: |\n                  cd simple_live_tv_app\n                  flutter build apk --release --split-per-abi\n\n            #上传APK至Artifacts\n            - name: Upload APK to Artifacts\n              uses: actions/upload-artifact@v4\n              with:\n                  name: android_tv\n                  path: |\n                      simple_live_tv_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n                      simple_live_tv_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n                      simple_live_tv_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n            #完成\n            - run: echo \"🍏 This job's status is ${{ job.status }}.\"\n"
  },
  {
    "path": ".github/workflows/publish_tv_app_release.yaml",
    "content": "name: app-build-action\n#推送Tag时触发\non:\n  push:\n    tags:\n      - \"tv_*\"\njobs:\n  build-tv:\n    runs-on: macos-latest\n    permissions:\n      contents: write\n    steps:\n      #签出代码\n      - uses: actions/checkout@v4\n        with:\n          ref: master\n\n      #APK签名设置\n      - name: Download Android keystore\n        id: android_tv_keystore\n        uses: timheuer/base64-to-file@v1.2\n        with:\n          fileName: keystore.jks\n          encodedString: ${{ secrets.TV_KEYSTORE_BASE64 }}\n      - name: Create key.properties\n        run: |\n          echo \"storeFile=${{ steps.android_tv_keystore.outputs.filePath }}\" > simple_live_tv_app/android/key.properties\n          echo \"storePassword=${{ secrets.TV_STORE_PASSWORD }}\" >> simple_live_tv_app/android/key.properties\n          echo \"keyPassword=${{ secrets.TV_KEY_PASSWORD }}\" >> simple_live_tv_app/android/key.properties\n          echo \"keyAlias=${{ secrets.TV_KEY_ALIAS }}\" >> simple_live_tv_app/android/key.properties\n\n      # 设置JAVA环境\n      - uses: actions/setup-java@v4\n        with:\n          distribution: \"zulu\"\n          java-version: \"17\"\n          cache: \"gradle\"\n\n      #设置Flutter\n      - name: Flutter action\n        uses: subosito/flutter-action@v2\n        with:\n          flutter-version: \"3.38.x\"\n          cache: true\n\n      #更新Flutter的packages\n      - name: Restore packages\n        run: |\n          cd simple_live_tv_app\n          flutter pub get\n\n      #打包APK\n      - name: Build APK\n        run: |\n          cd simple_live_tv_app\n          flutter build apk --release --split-per-abi\n\n      #上传APK至Artifacts\n      - name: Upload APK to Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: android_tv\n          path: |\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n\n      #读取版本信息\n      - name: Read version\n        id: version\n        uses: juliangruber/read-file-action@v1\n        with:\n          path: assets/tv_app_version.json\n      - name: Echo version\n        run: echo \"${{ fromJson(steps.version.outputs.content).version }}\"\n      - name: Echo version content\n        run: echo \"${{ fromJson(steps.version.outputs.content).version_desc }}\"\n\n      #上传至Release\n      - name: Upload Release\n        uses: softprops/action-gh-release@v1\n        with:\n          name: \"${{ fromJson(steps.version.outputs.content).version }}\"\n          body: \"# Android TV \\n${{ fromJson(steps.version.outputs.content).version_desc }}\"\n          prerelease: ${{ fromJson(steps.version.outputs.content).prerelease }}\n          token: ${{ secrets.TOKEN }}\n          files: |\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-x86_64-release.apk\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk\n            simple_live_tv_app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk\n\n      #完成\n      - run: echo \"🍏 This job's status is ${{ job.status }}.\"\n"
  },
  {
    "path": ".gitignore",
    "content": "simple_live_app/.vscode/settings.json\nsimple_live_tv_app/.vscode/settings.json\n\n# macOS Spotlight Search index file\n*.DS_Store"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"cmake.ignoreCMakeListsMissing\": true\n}"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) 2023-2025  xiaoyaocz\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    Simple Live  Copyright (C) 2023-2025  xiaoyaocz\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "> ### ⚠ 本项目不提供Release安装包，请自行编译后运行测试。\n\n\n<p align=\"center\">\n    <img width=\"128\" src=\"/assets/logo.png\" alt=\"Simple Live logo\">\n</p>\n<h2 align=\"center\">Simple Live</h2>\n\n<p align=\"center\">\n简简单单的看直播\n</p>\n\n![浅色模式](/assets/screenshot_light.jpg)\n\n![深色模式](/assets/screenshot_dark.jpg)\n\n## 支持直播平台：\n\n- 虎牙直播\n\n- 斗鱼直播\n\n- 哔哩哔哩直播\n\n- 抖音直播\n\n## APP支持平台\n\n- [x] Android\n- [x] iOS\n- [x] Windows `BETA`\n- [x] MacOS `BETA`\n- [x] Linux `BETA`\n- [x] Android TV `BETA`\n\n## 项目结构\n\n- `simple_live_core` 项目核心库，实现获取各个网站的信息及弹幕。\n- `simple_live_console` 基于simple_live_core的控制台程序。\n- `simple_live_app` 基于核心库实现的Flutter APP客户端。\n- `simple_live_tv_app` 基于核心库实现的Flutter Android TV客户端。\n\n## 环境\n\nFlutter : `3.38`\n\n## 参考及引用\n\n[AllLive](https://github.com/xiaoyaocz/AllLive) `本项目的C#版，有兴趣可以看看`\n\n[dart_tars_protocol](https://github.com/xiaoyaocz/dart_tars_protocol.git)\n\n[wbt5/real-url](https://github.com/wbt5/real-url)\n\n[lovelyyoshino/Bilibili-Live-API](https://github.com/lovelyyoshino/Bilibili-Live-API/blob/master/API.WebSocket.md)\n\n[IsoaSFlus/danmaku](https://github.com/IsoaSFlus/danmaku)\n\n[BacooTang/huya-danmu](https://github.com/BacooTang/huya-danmu)\n\n[TarsCloud/Tars](https://github.com/TarsCloud/Tars)\n\n[YunzhiYike/douyin-live](https://github.com/YunzhiYike/douyin-live)\n\n[5ime/Tiktok_Signature](https://github.com/5ime/Tiktok_Signature)\n\n## 声明\n\n本项目的所有功能都是基于互联网上公开的资料开发，无任何破解、逆向工程等行为。\n\n本项目仅用于学习交流编程技术，严禁将本项目用于商业目的。如有任何商业行为，均与本项目无关。\n\n如果本项目存在侵犯您的合法权益的情况，请及时与开发者联系，开发者将会及时删除有关内容。\n\n## Star History\n\n<a href=\"https://www.star-history.com/#xiaoyaocz/dart_simple_live&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=xiaoyaocz/dart_simple_live&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=xiaoyaocz/dart_simple_live&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=xiaoyaocz/dart_simple_live&type=Date\" />\n </picture>\n</a>\n"
  },
  {
    "path": "assets/app_version.json",
    "content": "{\n  \"version\": \"1.11.1\",\n  \"version_num\": 11101,\n  \"version_desc\": \"- 版本更新\",\n  \"prerelease\": false,\n  \"download_url\": \"https://github.com/xiaoyaocz/dart_simple_live/releases\"\n}\n"
  },
  {
    "path": "assets/play_config.json",
    "content": "{\n    \"huya\": {\n        \"user_agent\": \"HYSDK(Windows, 30000002)_APP(pc_exe&6080100&official)_SDK(trans&2.23.0.4969)\"\n    }\n}\n"
  },
  {
    "path": "assets/tv_app_version.json",
    "content": "{\n    \"version\": \"1.3.5\",\n    \"version_num\": 10305,\n    \"version_desc\": \"- 修复虎牙播放中断 #723 @SlotSun\\n- 修复哔哩哔哩加载失败\",\n    \"prerelease\":true,\n    \"download_url\": \"https://github.com/xiaoyaocz/dart_simple_live/releases\"\n}"
  },
  {
    "path": "simple_live_app/.fvmrc",
    "content": "{\n  \"flutter\": \"3.38.3\"\n}"
  },
  {
    "path": "simple_live_app/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.build/\n.buildlog/\n.history\n.svn/\n.swiftpm/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n\n/ios/Podfile.lock\npubspec.lock\n\n.fvm/\n\n/android/app/.cxx"
  },
  {
    "path": "simple_live_app/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: \"19074d12f7eaf6a8180cd4036a430c1d76de904e\"\n  channel: \"stable\"\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: 19074d12f7eaf6a8180cd4036a430c1d76de904e\n      base_revision: 19074d12f7eaf6a8180cd4036a430c1d76de904e\n    - platform: linux\n      create_revision: 19074d12f7eaf6a8180cd4036a430c1d76de904e\n      base_revision: 19074d12f7eaf6a8180cd4036a430c1d76de904e\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "simple_live_app/README.md",
    "content": "# simple_live_app\n\n基于核心库实现的Flutter APP客户端。\n\n## TODO\n\n- [ ] 支持桌面平台\n- [ ] iOS播放问题\n- [ ] 全屏、非全屏弹幕样式分离\n- [ ] 重写直播间 "
  },
  {
    "path": "simple_live_app/analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "simple_live_app/android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n.cxx/\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/to/reference-keystore\nkey.properties\n**/*.keystore\n**/*.jks\n"
  },
  {
    "path": "simple_live_app/android/app/build.gradle.kts",
    "content": "import java.util.Properties\nimport java.io.FileInputStream\n\nplugins {\n    id(\"com.android.application\")\n    id(\"kotlin-android\")\n    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.\n    id(\"dev.flutter.flutter-gradle-plugin\")\n}\n\nval keystoreProperties = Properties()\nval keystorePropertiesFile = rootProject.file(\"key.properties\")\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    namespace = \"com.xycz.simple_live\"\n    compileSdk = flutter.compileSdkVersion\n    ndkVersion = flutter.ndkVersion\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_11\n        targetCompatibility = JavaVersion.VERSION_11\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_11.toString()\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId = \"com.xycz.simple_live\"\n        // You can update the following values to match your application needs.\n        // For more information, see: https://flutter.dev/to/review-gradle-config.\n        minSdk = flutter.minSdkVersion\n        targetSdk = flutter.targetSdkVersion\n        versionCode = flutter.versionCode\n        versionName = flutter.versionName\n    }\n\n    signingConfigs {\n        create(\"release\") {\n            keyAlias = keystoreProperties[\"keyAlias\"] as String\n            keyPassword = keystoreProperties[\"keyPassword\"] as String\n            storeFile = keystoreProperties[\"storeFile\"]?.let { file(it) }\n            storePassword = keystoreProperties[\"storePassword\"] as String\n            isV1SigningEnabled = true\n            isV2SigningEnabled = true\n        }\n    }\n\n    buildTypes {\n        release {\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig = signingConfigs.getByName(\"release\")\n            isMinifyEnabled = true\n            isShrinkResources = true\n            proguardFiles(\n                // Default file with automatically generated optimization rules.\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n}\n\nflutter {\n    source = \"../..\"\n}\n"
  },
  {
    "path": "simple_live_app/android/app/proguard-rules.pro",
    "content": "#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-keep class de.prosiebensat1digital.** { *; }\n-dontwarn io.flutter.embedding.**\n-ignorewarnings"
  },
  {
    "path": "simple_live_app/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool 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": "simple_live_app/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"com.xycz.simple_live\">\n   <uses-permission android:name=\"android.permission.INTERNET\" />\n   <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n   <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n   <uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\" />\n    <application\n        android:label=\"Simple Live\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:networkSecurityConfig=\"@xml/network_security_config\"\n        android:usesCleartextTraffic=\"true\">\n        <activity\n            android:name=\".MainActivity\"\n            android:supportsPictureInPicture=\"true\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\"\n            android:taskAffinity=\"\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n    </application>\n    <!-- Required to query activities that can process text, see:\n         https://developer.android.com/training/package-visibility and\n         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.\n\n         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->\n    <queries>\n        <intent>\n            <action android:name=\"android.intent.action.PROCESS_TEXT\"/>\n            <data android:mimeType=\"text/plain\"/>\n        </intent>\n    </queries>\n</manifest>\n"
  },
  {
    "path": "simple_live_app/android/app/src/main/kotlin/com/xycz/simple_live/MainActivity.kt",
    "content": "package com.xycz.simple_live\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n"
  },
  {
    "path": "simple_live_app/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": "simple_live_app/android/app/src/main/res/drawable-v21/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:colorBackground\" />\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": "simple_live_app/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=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n\n    <monochrome android:drawable=\"@mipmap/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "simple_live_app/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=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n\n    <monochrome android:drawable=\"@mipmap/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "simple_live_app/android/app/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\" />\n</network-security-config>\n"
  },
  {
    "path": "simple_live_app/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool 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": "simple_live_app/android/build/reports/problems/problems-report.html",
    "content": "<!DOCTYPE html>\n\n<html lang=\"en\">\n<head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n\n                    <style type=\"text/css\">\n                /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\nhtml {\n    line-height: 1.15;\n    -ms-text-size-adjust: 100%;\n    -webkit-text-size-adjust: 100%\n}\n\nbody {\n    margin: 0\n}\n\narticle, aside, footer, header, nav, section {\n    display: block\n}\n\nh1 {\n    font-size: 2em;\n    margin: .67em 0\n}\n\nfigcaption, figure, main {\n    display: block\n}\n\nfigure {\n    margin: 1em 40px\n}\n\nhr {\n    box-sizing: content-box;\n    height: 0;\n    overflow: visible\n}\n\npre {\n    font-family: monospace, monospace;\n    font-size: 1em\n}\n\na {\n    background-color: transparent;\n    -webkit-text-decoration-skip: objects\n}\n\nabbr[title] {\n    border-bottom: none;\n    text-decoration: underline;\n    text-decoration: underline dotted\n}\n\nb, strong {\n    font-weight: inherit\n}\n\nb, strong {\n    font-weight: bolder\n}\n\ncode, kbd, samp {\n    font-family: monospace, monospace;\n    font-size: 1em\n}\n\ndfn {\n    font-style: italic\n}\n\nmark {\n    background-color: #ff0;\n    color: #000\n}\n\nsmall {\n    font-size: 80%\n}\n\nsub, sup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline\n}\n\nsub {\n    bottom: -.25em\n}\n\nsup {\n    top: -.5em\n}\n\naudio, video {\n    display: inline-block\n}\n\naudio:not([controls]) {\n    display: none;\n    height: 0\n}\n\nimg {\n    border-style: none\n}\n\nsvg:not(:root) {\n    overflow: hidden\n}\n\nbutton, input, optgroup, select, textarea {\n    font-family: sans-serif;\n    font-size: 100%;\n    line-height: 1.15;\n    margin: 0\n}\n\nbutton, input {\n    overflow: visible\n}\n\nbutton, select {\n    text-transform: none\n}\n\n[type=reset], [type=submit], button, html [type=button] {\n    -webkit-appearance: button\n}\n\n[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {\n    border-style: none;\n    padding: 0\n}\n\n[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {\n    outline: 1px dotted ButtonText\n}\n\nfieldset {\n    padding: .35em .75em .625em\n}\n\nlegend {\n    box-sizing: border-box;\n    color: inherit;\n    display: table;\n    max-width: 100%;\n    padding: 0;\n    white-space: normal\n}\n\nprogress {\n    display: inline-block;\n    vertical-align: baseline\n}\n\ntextarea {\n    overflow: auto\n}\n\n[type=checkbox], [type=radio] {\n    box-sizing: border-box;\n    padding: 0\n}\n\n[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {\n    height: auto\n}\n\n[type=search] {\n    -webkit-appearance: textfield;\n    outline-offset: -2px\n}\n\n[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration {\n    -webkit-appearance: none\n}\n\n::-webkit-file-upload-button {\n    -webkit-appearance: button;\n    font: inherit\n}\n\ndetails, menu {\n    display: block\n}\n\nsummary {\n    display: list-item\n}\n\ncanvas {\n    display: inline-block\n}\n\ntemplate {\n    display: none\n}\n\n[hidden] {\n    display: none\n}\n\n/* configuration cache styles */\n\n.report-wrapper {\n    margin: 0;\n    padding: 0 24px;\n}\n\n.gradle-logo {\n    width: 32px;\n    height: 24px;\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAIKADAAQAAAABAAAAGAAAAAA915G0AAAD5klEQVRIDbVWC0xTZxT+emmhVUEeA1/ROh/tFAFFGK7oJisIKsNVoOwBbJPowEWHzikRxeiMRpwwjDWRBHQLIzOmiRhe22BT40TitiyaMBQFfMEeLMIEaSmk+/+rvd7be4no6Elu7n++c/5zzv845/wyOyG4iGyDgzCdNOPLM9W41n4bnmNUiHo5DNsz0hGsmcV6lbkyAOOWXJjrz4qWp1C4o3z/LqzWL4VcJB1FIHmZHn/f78a6pDcxbeIEfNvQiPwTZbDZBpC24zOEaGfDpTsgtZby6u+QlrubFWUY3nh6AH39/ahr/Bn1jZfxW3ML2js60dtvgbtcQVblj8CZM7A0PBSrol6Ft+c4KZ8iTB1nwN0//8IEP9/hA2i924Gir0/iq8oa/NvbJzLiDKiUSqTE6pGVbEBY4BxnsYAPSnwXTa3tLCZ5BF3dPdAkGNHzoFcwcaRMnC4CeZkZiAgKFE252nITC1Pew9Dj5GNEGgS4Rbb5eZ1Te7UXG6FLX4cV6zeh5kIDaDpSunL9Boyf5nLOpwT4Sx+BxWrFK8QAnTAapPRQwofcj86uLoG59cbVEOzA0NAQNh38Atn5RSjY8rFAmc/I3dyQvOx1PsSNVy7Roa3ajHDePbBYLSLn1MaGd5KFAXy07xAOl59C6elK+I73hIHcbGd6wXs8qkyH8FZcjLOI5X/9/TrOnLsAldJDUu4As1NToFFPe3IEpm/M2HigwCFnU6t4Zw6Ck1JhGRhgcXq5juXloKyqFnlHirmz5CaNcEAv59kSE9wVikcB3O78A/MSU0Fznk/H9+yAetJEnPr+B8RFLsLcGS8ia28+qQuX+WrPNNZOV+Nc6VH4+3iz89g0pEaLzRUiQ3LGDWsM8Qidq2WL0PGKKlgf74ZIeQTAfFJ6a44WIsDXh9OW/dPdY58aawC9KK6kpOgolO7JxViVSuBGXnvxksudZ5F0O5yzGYxMJnBOGaau4fnPU2RNAtCFBKFoa7akczaAptY2iWmjB33+yQa4kZwfjpi2ex3Dyf43vuAljWQ/4Btmei1WPj+q45hF4U+1J4fEizCEvNf0EWHoIW244sfzoN1RipaT2kDfdjfv3MNpojdISjmfIheE8Fnp8WR9vJ2Zr+O+bYUmO+kJ9KnIUtf9bnvY2x9wcqrrvnCJvfL8Tw4V9v9LU7PdKzJaoNdy645AR4ph1JMncZHRKrVvYyYY5kmP8iO1v2T3dk6HDtYmrgJtOnwKnaPFrg8z+BBX7QSgEyOPJfX9Qd9DFs40GgTOHbrBs2ch4bXFuEG2mmFkeD9hpUMk+NMXEe0TNtsg/Ly94DVurEAuxfwHC1WiVbe0U7MAAAAASUVORK5CYII=\");\n    background-size: contain;\n}\n\n.header {\n    display: flex;\n    flex-wrap: wrap;\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    padding: 24px 24px 0 24px;\n    background-color: white;\n    z-index: 1;\n}\n\n.learn-more {\n    margin-left: auto;\n    align-self: center;\n    font-size: 0.875rem;\n    font-weight: normal;\n}\n\n.title {\n    display: flex;\n    align-items: center;\n    padding: 18px 0 24px 0;\n    flex: 1 0 100%;\n}\n\n.content {\n    font-size: 0.875rem;\n    padding: 240px 0 48px;\n    overflow-x: auto;\n    white-space: nowrap;\n}\n\n.content ol:first-of-type {\n    margin: 0;\n}\n\n.tree-btn {\n    cursor: pointer;\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-top: -0.2em;\n}\n\n.tree-btn.collapsed {\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 192 512\"><path d=\"M166.9 264.5l-117.8 116c-4.7 4.7-12.3 4.7-17 0l-7.1-7.1c-4.7-4.7-4.7-12.3 0-17L127.3 256 25.1 155.6c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0l117.8 116c4.6 4.7 4.6 12.3-.1 17z\" fill=\"%23999999\" stroke=\"%23999999\"/></svg>');\n}\n\n.tree-btn.expanded {\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 512\"><path d=\"M119.5 326.9L3.5 209.1c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0L128 287.3l100.4-102.2c4.7-4.7 12.3-4.7 17 0l7.1 7.1c4.7 4.7 4.7 12.3 0 17L136.5 327c-4.7 4.6-12.3 4.6-17-.1z\" fill=\"%23999999\" stroke=\"%23999999\"/></svg>');\n}\n\nul .tree-btn {\n    margin-right: 3px;\n}\n\n.leaf-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 512\"><path d=\"M32 256 H224\" stroke=\"%23999999\" stroke-width=\"48\" stroke-linecap=\"round\"/></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-top: -0.2em;\n}\n\n.invisible-text {\n    user-select: all; /* Allow the text to be selectable */\n    color: transparent; /* Hide the text */\n    text-indent: -9999px; /* Move the text out of view */\n    position: relative;\n    white-space: pre; /* Preserve meaningful whitespace in the invisible text for copying */\n}\n\n.text-for-copy {\n    display: inline-block;\n}\n\n.enum-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\"><circle cx=\"512\" cy=\"512\" r=\"200\" /></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.5ex;\n    margin-inline-end: 0.5ex;\n    margin-top: -0.2em;\n}\n\n.error-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z\" fill=\"%23FC461E\" stroke=\"%23FC461E\"/></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.5ex;\n    margin-inline-end: 0.5ex;\n    margin-top: -0.2em;\n}\n\n.advice-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    background-image: url('data:image/svg+xml;utf8,<svg width=\"800px\" height=\"800px\" viewBox=\"-4.93 0 122.88 122.88\" version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"  style=\"enable-background:new 0 0 113.01 122.88\" xml:space=\"preserve\"><g><path d=\"M44.13,102.06c-1.14,0.03-2.14-0.81-2.3-1.96c-0.17-1.2,0.64-2.31,1.82-2.54c-1.3-7.37-4.85-11.43-8.6-15.72 c-2.92-3.34-5.95-6.81-8.34-11.92c-2.35-5.03-3.64-10.23-3.6-15.63c0.05-5.4,1.42-10.96,4.4-16.71c0.02-0.04,0.04-0.07,0.06-0.11 l0,0c3.91-6.62,9.38-11.04,15.47-13.52c5.11-2.09,10.66-2.8,16.1-2.3c5.42,0.5,10.73,2.2,15.37,4.94 c5.9,3.49,10.75,8.67,13.42,15.21c1.44,3.54,2.42,7.49,2.54,11.82c0.12,4.31-0.62,8.96-2.61,13.88 c-2.66,6.59-6.18,10.68-9.47,14.51c-3.03,3.53-5.85,6.81-7.42,11.84c0.89,0.21,1.59,0.94,1.73,1.9c0.17,1.24-0.7,2.39-1.94,2.56 l-0.77,0.11c-0.14,1.09-0.23,2.26-0.27,3.51l0.25-0.04c1.24-0.17,2.39,0.7,2.56,1.94c0.17,1.24-0.7,2.39-1.94,2.56l-0.78,0.11 c0.01,0.15,0.02,0.3,0.03,0.45l0,0c0.07,0.88,0.08,1.73,0.03,2.54l0.13-0.02c1.25-0.15,2.38,0.74,2.54,1.98 c0.15,1.25-0.74,2.38-1.98,2.54l-1.68,0.21c-1.2,3.11-3.34,5.48-5.87,6.94c-1.74,1.01-3.67,1.59-5.61,1.71 c-1.97,0.12-3.96-0.25-5.78-1.13c-2.08-1.02-3.94-2.71-5.29-5.14c-0.65-0.33-1.13-0.97-1.23-1.75c-0.04-0.31-0.01-0.61,0.07-0.89 c-0.39-1.16-0.68-2.43-0.87-3.83l-0.07,0.01c-1.24,0.17-2.39-0.7-2.56-1.94c-0.17-1.24,0.7-2.39,1.94-2.56l0.54-0.08 C44.19,104.32,44.18,103.16,44.13,102.06L44.13,102.06z M2.18,58.86C1.01,58.89,0.04,57.98,0,56.81c-0.04-1.17,0.88-2.14,2.05-2.18 l8.7-0.3c1.17-0.04,2.14,0.88,2.18,2.05c0.04,1.17-0.88,2.14-2.05,2.18L2.18,58.86L2.18,58.86z M110.68,50.25 c1.16-0.12,2.2,0.73,2.32,1.89c0.12,1.16-0.73,2.2-1.89,2.32l-8.66,0.91c-1.16,0.12-2.2-0.73-2.32-1.89 c-0.12-1.16,0.73-2.2,1.89-2.32L110.68,50.25L110.68,50.25z M94.91,14.78c0.65-0.97,1.96-1.23,2.93-0.58 c0.97,0.65,1.23,1.96,0.58,2.93l-4.84,7.24c-0.65,0.97-1.96,1.23-2.93,0.58c-0.97-0.65-1.23-1.96-0.58-2.93L94.91,14.78 L94.91,14.78z M57.63,2.06c0.03-1.17,1-2.09,2.16-2.06c1.17,0.03,2.09,1,2.06,2.16l-0.22,8.7c-0.03,1.17-1,2.09-2.16,2.06 c-1.17-0.03-2.09-1-2.06-2.16L57.63,2.06L57.63,2.06z M13.88,15.53c-0.86-0.8-0.9-2.14-0.11-2.99c0.8-0.86,2.14-0.9,2.99-0.11 l6.37,5.94c0.86,0.8,0.9,2.14,0.11,2.99c-0.8,0.86-2.14,0.9-2.99,0.11L13.88,15.53L13.88,15.53z M47.88,96.95l18.49-2.63 c1.59-6.7,5.05-10.73,8.8-15.08c3.08-3.58,6.36-7.4,8.76-13.34c1.76-4.35,2.41-8.43,2.31-12.19c-0.1-3.75-0.96-7.21-2.24-10.34 c-2.3-5.63-6.51-10.11-11.65-13.15c-4.11-2.43-8.8-3.94-13.59-4.37c-4.77-0.44-9.64,0.19-14.13,2.02 c-5.26,2.15-9.99,5.97-13.39,11.72c-2.64,5.12-3.86,10.02-3.9,14.73c-0.04,4.74,1.11,9.33,3.2,13.8c2.13,4.56,4.97,7.8,7.69,10.92 C42.47,83.9,46.48,88.49,47.88,96.95L47.88,96.95z M65.62,99.02l-17.27,2.45c0.05,1.1,0.07,2.25,0.05,3.47l17.05-2.42 C65.47,101.29,65.52,100.12,65.62,99.02L65.62,99.02z M48.49,109.52c0.12,0.92,0.3,1.76,0.53,2.54l16.55-2.04 c0.11-0.86,0.13-1.77,0.05-2.74l0,0l0-0.02l-0.01-0.17L48.49,109.52L48.49,109.52z M51.37,116.36c0.64,0.67,1.35,1.19,2.1,1.55 c1.15,0.56,2.42,0.79,3.67,0.72c1.29-0.08,2.57-0.47,3.74-1.15c1.1-0.64,2.09-1.53,2.88-2.65L51.37,116.36L51.37,116.36z\"/></g></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.5ex;\n    margin-inline-end: 0.5ex;\n    margin-top: -0.2em;\n}\n\n.warning-icon {\n    display: inline-block;\n    width: 13px;\n    height: 13px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M270.2 160h35.5c3.4 0 6.1 2.8 6 6.2l-7.5 196c-.1 3.2-2.8 5.8-6 5.8h-20.5c-3.2 0-5.9-2.5-6-5.8l-7.5-196c-.1-3.4 2.6-6.2 6-6.2zM288 388c-15.5 0-28 12.5-28 28s12.5 28 28 28 28-12.5 28-28-12.5-28-28-28zm281.5 52L329.6 24c-18.4-32-64.7-32-83.2 0L6.5 440c-18.4 31.9 4.6 72 41.6 72H528c36.8 0 60-40 41.5-72zM528 480H48c-12.3 0-20-13.3-13.9-24l240-416c6.1-10.6 21.6-10.7 27.7 0l240 416c6.2 10.6-1.5 24-13.8 24z\" fill=\"%23DEAD22\" stroke=\"%23DEAD22\"/></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.3ex;\n    margin-inline-end: 1.1ex;\n    margin-top: -0.1em;\n}\n\n.documentation-button {\n    cursor: pointer;\n    display: inline-block;\n    width: 13px;\n    height: 13px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 340c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm7.67-24h-16c-6.627 0-12-5.373-12-12v-.381c0-70.343 77.44-63.619 77.44-107.408 0-20.016-17.761-40.211-57.44-40.211-29.144 0-44.265 9.649-59.211 28.692-3.908 4.98-11.054 5.995-16.248 2.376l-13.134-9.15c-5.625-3.919-6.86-11.771-2.645-17.177C185.658 133.514 210.842 116 255.67 116c52.32 0 97.44 29.751 97.44 80.211 0 67.414-77.44 63.849-77.44 107.408V304c0 6.627-5.373 12-12 12zM256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8z\" fill=\"%23999999\" stroke=\"%23999999\"/></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.5ex;\n    margin-inline-end: 0.5ex;\n    margin-top: -0.2em;\n}\n\n.documentation-button::selection {\n    color: transparent;\n}\n\n.documentation-button:hover {\n    color: transparent;\n}\n\n.copy-button {\n    cursor: pointer;\n    display: inline-block;\n    width: 12px;\n    height: 12px;\n    background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M433.941 193.941l-51.882-51.882A48 48 0 0 0 348.118 128H320V80c0-26.51-21.49-48-48-48h-66.752C198.643 13.377 180.858 0 160 0s-38.643 13.377-45.248 32H48C21.49 32 0 53.49 0 80v288c0 26.51 21.49 48 48 48h80v48c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48V227.882a48 48 0 0 0-14.059-33.941zm-22.627 22.627a15.888 15.888 0 0 1 4.195 7.432H352v-63.509a15.88 15.88 0 0 1 7.431 4.195l51.883 51.882zM160 30c9.941 0 18 8.059 18 18s-8.059 18-18 18-18-8.059-18-18 8.059-18 18-18zM48 384c-8.822 0-16-7.178-16-16V80c0-8.822 7.178-16 16-16h66.752c6.605 18.623 24.389 32 45.248 32s38.643-13.377 45.248-32H272c8.822 0 16 7.178 16 16v48H176c-26.51 0-48 21.49-48 48v208H48zm352 96H176c-8.822 0-16-7.178-16-16V176c0-8.822 7.178-16 16-16h144v72c0 13.2 10.8 24 24 24h72v208c0 8.822-7.178 16-16 16z\" fill=\"%23999999\" stroke=\"%23999999\"/></svg>');\n    background-size: contain;\n    background-repeat: no-repeat;\n    vertical-align: middle;\n    margin-inline-start: 0.5ex;\n    margin-top: -0.2em;\n}\n\n.groups{\n    display: flex;\n    border-bottom: 1px solid #EDEEEF;\n    flex: 1 0 100%;\n}\n\n.uncategorized {\n    display: flex;\n    border-top: 4px solid #EDEEEF;\n    flex: 1 0 100%;\n}\n\n.group-selector {\n    padding: 0 52px 24px 0;\n    font-size: 0.9rem;\n    font-weight: bold;\n    color: #999999;\n    cursor: pointer;\n}\n\n.group-selector__count {\n    margin: 0 8px;\n    border-radius: 8px;\n    background-color: #999;\n    color: #fff;\n    padding: 1px 8px 2px;\n    font-size: 0.75rem;\n}\n\n.group-selector--active {\n    color: #02303A;\n    cursor: auto;\n}\n\n.group-selector--active .group-selector__count {\n    background-color: #686868;\n}\n\n.group-selector--disabled {\n    cursor: not-allowed;\n}\n\n.accordion-header {\n    cursor: pointer;\n}\n\n.container {\n    padding-left: 0.5em;\n    padding-right: 0.5em;\n}\n\n.stacktrace {\n    border-radius: 4px;\n    overflow-x: auto;\n    padding: 0.5rem;\n    margin-bottom: 0;\n    min-width: 1000px;\n}\n\n/* Lato (bold, regular) */\n@font-face {\n    font-display: swap;\n    font-family: Lato;\n    font-weight: 500;\n    font-style: normal;\n    src: url(\"https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff2\") format(\"woff2\"),\n    url(\"https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff\") format(\"woff\");\n}\n\n@font-face {\n    font-display: swap;\n    font-family: Lato;\n    font-weight: bold;\n    font-style: normal;\n    src: url(\"https://assets.gradle.com/lato/fonts/lato-bold/lato-bold.woff2\") format(\"woff2\"),\n    url(\"https://assets.gradle.com/lato/fonts/lato-bold/lato-bold.woff\") format(\"woff\");\n}\n\n* {\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n}\n\nhtml,\nbody {\n    margin: 0;\n    padding: 0;\n}\n\nhtml {\n    font-family: \"Lato\", \"Helvetica Neue\", Arial, sans-serif;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: 1.5;\n}\n\nbody {\n    color: #02303A;\n    background-color: #ffffff;\n    -webkit-text-size-adjust: 100%;\n    -ms-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n}\n\n\n/* typography */\nh1, h2, h3, h4, h5, h6 {\n    color: #02303A;\n    text-rendering: optimizeLegibility;\n    margin: 0;\n}\n\nh1 {\n    font-size: 1rem;\n}\n\nh2 {\n    font-size: 0.9rem;\n}\n\nh3 {\n    font-size: 1.125rem;\n}\n\nh4, h5, h6 {\n    font-size: 0.875rem;\n}\n\nh1 code {\n    font-weight: bold;\n}\n\nul, ol, dl {\n    list-style-position: outside;\n    line-height: 1.6;\n    padding: 0;\n    margin: 0 0 0 20px;\n    list-style-type: none;\n}\n\nli {\n    line-height: 2;\n}\n\na {\n    color: #1DA2BD;\n    text-decoration: none;\n    transition: all 0.3s ease, visibility 0s;\n}\n\na:hover {\n    color: #35c1e4;\n}\n\n/* code */\ncode, pre {\n    font-family: Inconsolata, Monaco, \"Courier New\", monospace;\n    font-style: normal;\n    font-variant-ligatures: normal;\n    font-variant-caps: normal;\n    font-variant-numeric: normal;\n    font-variant-east-asian: normal;\n    font-weight: normal;\n    font-stretch: normal;\n    color: #686868;\n}\n\n*:not(pre) > code {\n    letter-spacing: 0;\n    padding: 0.1em 0.5ex;\n    text-rendering: optimizeSpeed;\n    word-spacing: -0.15em;\n    word-wrap: break-word;\n}\n\npre {\n    font-size: 0.75rem;\n    line-height: 1.8;\n    margin-top: 0;\n    margin-bottom: 1.5em;\n    padding: 1rem;\n}\n\npre code {\n    background-color: transparent;\n    color: inherit;\n    line-height: 1.8;\n    font-size: 100%;\n    padding: 0;\n}\n\na code {\n    color: #1BA8CB;\n}\n\npre.code, pre.programlisting, pre.screen, pre.tt {\n    background-color: #f7f7f8;\n    border-radius: 4px;\n    font-size: 1em;\n    line-height: 1.45;\n    margin-bottom: 1.25em;\n    overflow-x: auto;\n    padding: 1rem;\n}\n\nli em, p em {\n    padding: 0 1px;\n}\n\ncode em, tt em {\n    text-decoration: none;\n}\n\ncode + .copy-button {\n    margin-inline-start: 0.2ex;\n}\n\n.java-exception {\n    font-size: 0.75rem;\n    padding-left: 24px;\n}\n\n.java-exception ul {\n    margin: 0;\n    line-height: inherit;\n}\n\n.java-exception code {\n    white-space: pre;\n}\n\n.java-exception-part-toggle {\n    user-select: none;\n    cursor: pointer;\n    border-radius: 2px;\n    padding: 0.1em 0.2em;\n    background: azure;\n    color: #686868;\n}\n\n                </style>\n    <!-- Inconsolata is used as a default monospace font in the report. -->\n    <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Inconsolata:400,700\" />\n\n    <title>Gradle Configuration Cache</title>\n</head>\n<body>\n\n<div id=\"playground\"></div>\n\n<div class=\"report\" id=\"report\">\n    Loading...\n</div>\n\n<script type=\"text/javascript\">\nfunction configurationCacheProblems() { return (\n// begin-report-data\n{\"diagnostics\":[{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\auto_orientation_v2-2.3.6\\\\android\\\\build.gradle'\",\"line\":1},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\auto_orientation_v2-2.3.6\\\\android\\\\build.gradle'\",\"line\":1}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('group = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\auto_orientation_v2-2.3.6\\\\android\\\\build.gradle'\",\"line\":2},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\auto_orientation_v2-2.3.6\\\\android\\\\build.gradle'\",\"line\":2}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('version = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('namespace = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-7.0.0\\\\android\\\\build.gradle'\",\"line\":1},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-7.0.0\\\\android\\\\build.gradle'\",\"line\":1}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('group = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-7.0.0\\\\android\\\\build.gradle'\",\"line\":2},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\connectivity_plus-7.0.0\\\\android\\\\build.gradle'\",\"line\":2}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('version = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('namespace = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('minSdk = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\device_info_plus-12.2.0\\\\android\\\\build.gradle'\",\"line\":1},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\device_info_plus-12.2.0\\\\android\\\\build.gradle'\",\"line\":1}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('group = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\device_info_plus-12.2.0\\\\android\\\\build.gradle'\",\"line\":2},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\device_info_plus-12.2.0\\\\android\\\\build.gradle'\",\"line\":2}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('version = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('namespace = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('minSdk = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.8.1\\\\android\\\\build.gradle'\",\"line\":1},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.8.1\\\\android\\\\build.gradle'\",\"line\":1}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('group = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.8.1\\\\android\\\\build.gradle'\",\"line\":2},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\dynamic_color-1.8.1\\\\android\\\\build.gradle'\",\"line\":2}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('version = <value>') instead.\"}]]},{\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('namespace = <value>') instead.\"}]]},{\"locations\":[{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\file_picker-10.3.6\\\\android\\\\build.gradle'\",\"line\":1},{\"path\":\"build file 'C:\\\\Users\\\\xiaoyaocz\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\file_picker-10.3.6\\\\android\\\\build.gradle'\",\"line\":1}],\"problem\":[{\"text\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"severity\":\"WARNING\",\"problemDetails\":[{\"text\":\"This is scheduled to be removed in Gradle 10.0.\"}],\"contextualLabel\":\"Space-assignment syntax in Groovy DSL has been deprecated.\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/upgrading_version_8.html#groovy_space_assignment_syntax\",\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"solutions\":[[{\"text\":\"Use assignment ('group = <value>') instead.\"}]]}],\"problemsReport\":{\"totalProblemCount\":15,\"buildName\":\"android\",\"requestedTasks\":\"assembleDebug\",\"documentationLink\":\"https://docs.gradle.org/8.12/userguide/problems-report.html\",\"documentationLinkCaption\":\"Problem report\",\"summaries\":[{\"problemId\":[{\"name\":\"deprecation\",\"displayName\":\"Deprecation\"},{\"name\":\"space-assignment-syntax-in-groovy-dsl\",\"displayName\":\"Space-assignment syntax in Groovy DSL has been deprecated.\"}],\"count\":6}]}}\n// end-report-data\n);}\n</script>\n                <script type=\"text/javascript\">\n                !function(n,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports[\"configuration-cache-report\"]=t():n[\"configuration-cache-report\"]=t()}(this,(()=>(({70:function(){void 0===ArrayBuffer.isView&&(ArrayBuffer.isView=function(n){return null!=n&&null!=n.__proto__&&n.__proto__.__proto__===Int8Array.prototype.__proto__}),void 0===Math.imul&&(Math.imul=function(n,t){return(4294901760&n)*(65535&t)+(65535&n)*(0|t)|0}),this[\"configuration-cache-report\"]=function(n){\"use strict\";var t,r,i,e,u,o,f,s,c,a,h,l,_,v,d,g,w,b,p,m,k,y,q,B,C,x,j,P,I,S,z,E,T,L,N,A,M,F,D,O,R,H,$,G,U,V,Q,Z,Y,W,K,X,J,nn,tn,rn,en,un,on,fn,sn,cn,an,hn,ln,_n,vn,dn,gn,wn,bn,pn,mn,kn,yn,qn,Bn,Cn,xn,jn,Pn,In,Sn,zn=Math.imul,En=ArrayBuffer.isView;function Tn(n,t){if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));return function(n,t){if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));if(0===t)return pt();if(t>=n.length)return function(n){switch(n.length){case 0:return pt();case 1:return gr(n[0]);default:return function(n){return Ar(function(n){return new qt(n,!1)}(n))}(n)}}(n);if(1===t)return gr(n[0]);var r=0,i=Nr(),e=0,u=n.length;n:for(;e<u;){var o=n[e];if(e=e+1|0,i.d(o),(r=r+1|0)===t)break n}return i}(n,Wn(n.length-t|0,0))}function Ln(n,t,r,i,e,u,o){return t=t===A?\", \":t,r=r===A?\"\":r,i=i===A?\"\":i,e=e===A?-1:e,u=u===A?\"...\":u,o=o===A?null:o,function(n,t,r,i,e,u,o,f){r=r===A?\", \":r,i=i===A?\"\":i,e=e===A?\"\":e,u=u===A?-1:u,o=o===A?\"...\":o,f=f===A?null:f,t.e(i);var s=0,c=0,a=n.length;n:for(;c<a;){var h=n[c];if(c=c+1|0,(s=s+1|0)>1&&t.e(r),!(u<0||s<=u))break n;Qt(t,h,f)}return u>=0&&s>u&&t.e(o),t.e(e),t}(n,bi(),t,r,i,e,u,o).toString()}function Nn(n){return n.length-1|0}function An(n,t){if(null==t){var r=0,i=n.length-1|0;if(r<=i)do{var e=r;if(r=r+1|0,null==n[e])return e}while(r<=i)}else{var u=0,o=n.length-1|0;if(u<=o)do{var f=u;if(u=u+1|0,oe(t,n[f]))return f}while(u<=o)}return-1}function Mn(n,t,r,i,e,u,o){return t=t===A?\", \":t,r=r===A?\"\":r,i=i===A?\"\":i,e=e===A?-1:e,u=u===A?\"...\":u,o=o===A?null:o,Fn(n,bi(),t,r,i,e,u,o).toString()}function Fn(n,t,r,i,e,u,o,f){r=r===A?\", \":r,i=i===A?\"\":i,e=e===A?\"\":e,u=u===A?-1:u,o=o===A?\"...\":o,f=f===A?null:f,t.e(i);var s=0,c=n.f();n:for(;c.g();){var a=c.h();if((s=s+1|0)>1&&t.e(r),!(u<0||s<=u))break n;Qt(t,a,f)}return u>=0&&s>u&&t.e(o),t.e(e),t}function Dn(n){if(n.i())throw mu(\"List is empty.\");return n.j(0)}function On(n){return new Yn(n)}function Rn(n){if(Ue(n,Ti)){var t;switch(n.k()){case 0:t=pt();break;case 1:t=gr(Ue(n,Ei)?n.j(0):n.f().h());break;default:t=Hn(n)}return t}return mt(Vn(n))}function Hn(n){return Ar(n)}function $n(n){if(Ue(n,Ti)&&n.k()<=1)return Rn(n);var t=Vn(n);return function(n){var t=(n.k()/2|0)-1|0;if(t<0)return lr();var r=kt(n),i=0;if(i<=t)do{var e=i;i=i+1|0;var u=n.j(e);n.f4(e,n.j(r)),n.f4(r,u),r=r-1|0}while(e!==t)}(t),t}function Gn(n,t){if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));return function(n,t){if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));if(0===t)return pt();if(Ue(n,Ti)){if(t>=n.k())return Rn(n);if(1===t)return gr(function(n){if(Ue(n,Ei))return Dn(n);var t=n.f();if(!t.g())throw mu(\"Collection is empty.\");return t.h()}(n))}var r=0,i=Nr(),e=n.f();n:for(;e.g();){var u=e.h();if(i.d(u),(r=r+1|0)===t)break n}return mt(i)}(n,Wn(n.k()-t|0,0))}function Un(n,t){if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));if(0===t)return pt();var r=n.k();if(t>=r)return Rn(n);if(1===t)return gr(Qn(n));var i=Nr();if(Ue(n,li)){var e=r-t|0;if(e<r)do{var u=e;e=e+1|0,i.d(n.j(u))}while(e<r)}else for(var o=n.l(r-t|0);o.g();){var f=o.h();i.d(f)}return i}function Vn(n){return Ue(n,Ti)?Hn(n):Zn(n,Lr())}function Qn(n){if(n.i())throw mu(\"List is empty.\");return n.j(kt(n))}function Zn(n,t){for(var r=n.f();r.g();){var i=r.h();t.d(i)}return t}function Yn(n){this.n_1=n}function Wn(n,t){return n<t?t:n}function Kn(n,t){return n>t?t:n}function Xn(n,t){return Ut().q(n,t,-1)}function Jn(n,t){return new Et(n,t)}function nt(n){var t=n.f();if(!t.g())return pt();var r=t.h();if(!t.g())return gr(r);var i=Lr();for(i.d(r);t.g();)i.d(t.h());return i}function tt(n){this.r_1=n}function rt(n,t){this.s_1=n,this.t_1=t}function it(){}function et(n){this.x_1=n,this.w_1=0}function ut(n,t){this.a1_1=n,et.call(this,n),ft().b1(t,this.a1_1.k()),this.w_1=t}function ot(){t=this}function ft(){return null==t&&new ot,t}function st(){ft(),it.call(this)}function ct(n){this.h1_1=n}function at(n,t){return t===n?\"(this Map)\":Oi(t)}function ht(n,t){var r;n:{for(var i=n.o().f();i.g();){var e=i.h();if(oe(e.j1(),t)){r=e;break n}}r=null}return r}function lt(){r=this}function _t(){return null==r&&new lt,r}function vt(n){this.q1_1=n,it.call(this)}function dt(){_t(),this.n1_1=null,this.o1_1=null}function gt(){i=this}function wt(){return null==i&&new gt,i}function bt(n){return n.length>0?nu(n):pt()}function pt(){return null==e&&new yt,e}function mt(n){switch(n.k()){case 0:return pt();case 1:return gr(n.j(0));default:return n}}function kt(n){return n.k()-1|0}function yt(){e=this,this.z1_1=new de(-1478467534,-1720727600)}function qt(n,t){this.b2_1=n,this.c2_1=t}function Bt(){u=this}function Ct(){return null==u&&new Bt,u}function xt(n,t){return Ue(n,Ti)?n.k():t}function jt(n,t){if(Ue(t,Ti))return n.m(t);for(var r=!1,i=t.f();i.g();){var e=i.h();n.d(e)&&(r=!0)}return r}function Pt(){}function It(n,t){this.h2_1=n,this.g2_1=n.i2_1.l(function(n,t){if(!(0<=t&&t<=n.k()))throw cu(\"Position index \"+t+\" must be in range [\"+Oe(0,n.k())+\"].\");return n.k()-t|0}(n,t))}function St(n){st.call(this),this.i2_1=n}function zt(n){this.k2_1=n,this.j2_1=n.l2_1.f()}function Et(n,t){this.l2_1=n,this.m2_1=t}function Tt(n){for(;n.n2_1.g();){var t=n.n2_1.h();if(n.q2_1.t2_1(t)===n.q2_1.s2_1)return n.p2_1=t,n.o2_1=1,lr()}n.o2_1=0}function Lt(n){this.q2_1=n,this.n2_1=n.r2_1.f(),this.o2_1=-1,this.p2_1=null}function Nt(n,t,r){t=t===A||t,this.r2_1=n,this.s2_1=t,this.t2_1=r}function At(){return null==o&&new Mt,o}function Mt(){o=this,this.u2_1=new de(1993859828,793161749)}function Ft(n,t,r){return Dt(Dt(n,r)-Dt(t,r)|0,r)}function Dt(n,t){var r=n%t|0;return r>=0?r:r+t|0}function Ot(){f=this,this.p_1=new Ht(1,0)}function Rt(){return null==f&&new Ot,f}function Ht(n,t){Rt(),Vt.call(this,n,t,1)}function $t(n,t,r){Pt.call(this),this.d3_1=r,this.e3_1=t,this.f3_1=this.d3_1>0?n<=t:n>=t,this.g3_1=this.f3_1?n:this.e3_1}function Gt(){s=this}function Ut(){return null==s&&new Gt,s}function Vt(n,t,r){if(Ut(),0===r)throw fu(\"Step must be non-zero.\");if(r===vr().MIN_VALUE)throw fu(\"Step must be greater than Int.MIN_VALUE to avoid overflow on negation.\");this.z2_1=n,this.a3_1=function(n,t,r){var i;if(r>0)i=n>=t?t:t-Ft(t,n,r)|0;else{if(!(r<0))throw fu(\"Step is zero.\");i=n<=t?t:t+Ft(n,t,0|-r)|0}return i}(n,t,r),this.b3_1=r}function Qt(n,t,r){null!=r?n.e(r(t)):null==t||Ze(t)?n.e(t):t instanceof zi?n.i3(t.h3_1):n.e(Oi(t))}function Zt(n,t,r){if(n===t)return!0;if(!(r=r!==A&&r))return!1;var i=mi(n),e=mi(t);return i===e||oe(new zi(Zi(Pi(i).toLowerCase(),0)),new zi(Zi(Pi(e).toLowerCase(),0)))}function Yt(n){return Wi(n)-1|0}function Wt(n,t,r,i){return r=r===A?0:r,(i=i!==A&&i)||\"string\"!=typeof n?Kt(n,t,r,Wi(n),i):n.indexOf(t,r)}function Kt(n,t,r,i,e,u){var o=(u=u!==A&&u)?Xn(Kn(r,Yt(n)),Wn(i,0)):Oe(Wn(r,0),Kn(i,Wi(n)));if(\"string\"==typeof n&&\"string\"==typeof t){var f=o.z2_1,s=o.a3_1,c=o.b3_1;if(c>0&&f<=s||c<0&&s<=f)do{var a=f;if(f=f+c|0,xi(t,0,n,a,Wi(t),e))return a}while(a!==s)}else{var h=o.z2_1,l=o.a3_1,_=o.b3_1;if(_>0&&h<=l||_<0&&l<=h)do{var v=h;if(h=h+_|0,tr(t,0,n,v,Wi(t),e))return v}while(v!==l)}return-1}function Xt(n){var t=0,r=Wi(n)-1|0,i=!1;n:for(;t<=r;){var e=ki(Zi(n,i?r:t));if(i){if(!e)break n;r=r-1|0}else e?t=t+1|0:i=!0}return Ki(n,t,r+1|0)}function Jt(n,t){return ie(Ki(n,t.y2(),t.c3()+1|0))}function nr(n,t,r,i,e){r=r===A?0:r,i=i!==A&&i,rr(e=e===A?0:e);var u,o,f=nu(t);return new ur(n,r,e,(u=f,o=i,function(n,t){var r=function(n,t,r,i){if(!i&&1===t.k()){var e=function(n){if(Ue(n,Ei))return function(n){var t;switch(n.k()){case 0:throw mu(\"List is empty.\");case 1:t=n.j(0);break;default:throw fu(\"List has more than one element.\")}return t}(n);var t=n.f();if(!t.g())throw mu(\"Collection is empty.\");var r=t.h();if(t.g())throw fu(\"Collection has more than one element.\");return r}(t),u=Wt(n,e,r);return u<0?null:fr(u,e)}var o=Oe(Wn(r,0),Wi(n));if(\"string\"==typeof n){var f=o.z2_1,s=o.a3_1,c=o.b3_1;if(c>0&&f<=s||c<0&&s<=f)do{var a,h=f;f=f+c|0;n:{for(var l=t.f();l.g();){var _=l.h();if(xi(_,0,n,h,_.length,i)){a=_;break n}}a=null}if(null!=a)return fr(h,a)}while(h!==s)}else{var v=o.z2_1,d=o.a3_1,g=o.b3_1;if(g>0&&v<=d||g<0&&d<=v)do{var w,b=v;v=v+g|0;n:{for(var p=t.f();p.g();){var m=p.h();if(tr(m,0,n,b,m.length,i)){w=m;break n}}w=null}if(null!=w)return fr(b,w)}while(b!==d)}return null}(n,u,t,o);return null==r?null:fr(r.t3_1,r.u3_1.length)}))}function tr(n,t,r,i,e,u){if(i<0||t<0||t>(Wi(n)-e|0)||i>(Wi(r)-e|0))return!1;var o=0;if(o<e)do{var f=o;if(o=o+1|0,!Zt(Zi(n,t+f|0),Zi(r,i+f|0),u))return!1}while(o<e);return!0}function rr(n){if(!(n>=0))throw fu(ie(\"Limit must be non-negative, but was \"+n))}function ir(n){if(n.l3_1<0)n.j3_1=0,n.m3_1=null;else{var t;if(n.o3_1.r3_1>0?(n.n3_1=n.n3_1+1|0,t=n.n3_1>=n.o3_1.r3_1):t=!1,t||n.l3_1>Wi(n.o3_1.p3_1))n.m3_1=Oe(n.k3_1,Yt(n.o3_1.p3_1)),n.l3_1=-1;else{var r=n.o3_1.s3_1(n.o3_1.p3_1,n.l3_1);if(null==r)n.m3_1=Oe(n.k3_1,Yt(n.o3_1.p3_1)),n.l3_1=-1;else{var i=r.v3(),e=r.w3();n.m3_1=function(n,t){return t<=vr().MIN_VALUE?Rt().p_1:Oe(n,t-1|0)}(n.k3_1,i),n.k3_1=i+e|0,n.l3_1=n.k3_1+(0===e?1:0)|0}}n.j3_1=1}}function er(n){this.o3_1=n,this.j3_1=-1,this.k3_1=function(n,t,r){if(0>r)throw fu(\"Cannot coerce value to an empty range: maximum \"+r+\" is less than minimum 0.\");return n<0?0:n>r?r:n}(n.q3_1,0,Wi(n.p3_1)),this.l3_1=this.k3_1,this.m3_1=null,this.n3_1=0}function ur(n,t,r,i){this.p3_1=n,this.q3_1=t,this.r3_1=r,this.s3_1=i}function or(n,t){this.t3_1=n,this.u3_1=t}function fr(n,t){return new or(n,t)}function sr(){}function cr(){}function ar(){}function hr(){c=this}function lr(){return null==c&&new hr,c}function _r(){a=this,this.MIN_VALUE=-2147483648,this.MAX_VALUE=2147483647,this.SIZE_BYTES=4,this.SIZE_BITS=32}function vr(){return null==a&&new _r,a}function dr(n){for(var t=[],r=n.f();r.g();)t.push(r.h());return t}function gr(n){return 0===(t=[n]).length?Lr():Ar(new qt(t,!0));var t}function wr(n){return n<0&&function(){throw yu(\"Index overflow has happened.\")}(),n}function br(n){return void 0!==n.toArray?n.toArray():dr(n)}function pr(n){return function(n,t){for(var r=0,i=n.length;r<i;){var e=n[r];r=r+1|0,t.d(e)}return t}(t=[n],(r=t.length,i=ce(se(Zr)),function(n,t,r){zr.call(r),Zr.call(r),r.y5_1=function(n){return Ur(n,0,ce(se(Vr)))}(n)}(r,0,i),i));var t,r,i}function mr(){it.call(this)}function kr(n){this.j4_1=n,this.h4_1=0,this.i4_1=-1}function yr(n,t){this.n4_1=n,kr.call(this,n),ft().b1(t,this.n4_1.k()),this.h4_1=t}function qr(){mr.call(this),this.o4_1=0}function Br(n){this.r4_1=n}function Cr(n){this.s4_1=n}function xr(n,t){this.t4_1=n,this.u4_1=t}function jr(){zr.call(this)}function Pr(n){this.x4_1=n,zr.call(this)}function Ir(n){this.e5_1=n,mr.call(this)}function Sr(){dt.call(this),this.c5_1=null,this.d5_1=null}function zr(){mr.call(this)}function Er(){h=this;var n=Nr();n.c_1=!0,this.i5_1=n}function Tr(){return null==h&&new Er,h}function Lr(){return n=ce(se(Fr)),t=[],Fr.call(n,t),n;var n,t}function Nr(n){return t=ce(se(Fr)),r=[],Fr.call(t,r),t;var t,r}function Ar(n){return function(n,t){var r;return r=br(n),Fr.call(t,r),t}(n,ce(se(Fr)))}function Mr(n,t){return ft().e1(t,n.k()),t}function Fr(n){Tr(),qr.call(this),this.b_1=n,this.c_1=!1}function Dr(n,t,r,i,e){if(r===i)return n;var u=(r+i|0)/2|0,o=Dr(n,t,r,u,e),f=Dr(n,t,u+1|0,i,e),s=o===t?n:t,c=r,a=u+1|0,h=r;if(h<=i)do{var l=h;if(h=h+1|0,c<=u&&a<=i){var _=o[c],v=f[a];e.compare(_,v)<=0?(s[l]=_,c=c+1|0):(s[l]=v,a=a+1|0)}else c<=u?(s[l]=o[c],c=c+1|0):(s[l]=f[a],a=a+1|0)}while(l!==i);return s}function Or(n,t){return(3&n)-(3&t)|0}function Rr(){_=this}function Hr(n){this.n5_1=n,jr.call(this)}function $r(n){return function(n,t){Sr.call(t),Vr.call(t),t.t5_1=n,t.u5_1=n.w5()}(new Jr((null==_&&new Rr,_)),n),n}function Gr(){return $r(ce(se(Vr)))}function Ur(n,t,r){if($r(r),!(n>=0))throw fu(ie(\"Negative initial capacity: \"+n));if(!(t>=0))throw fu(ie(\"Non-positive load factor: \"+t));return r}function Vr(){this.v5_1=null}function Qr(n,t){return zr.call(t),Zr.call(t),t.y5_1=n,t}function Zr(){}function Yr(n,t){var r=Kr(n,n.h6_1.m5(t));if(null==r)return null;var i=r;if(null!=i&&Ve(i))return Wr(i,n,t);var e=i;return n.h6_1.l5(e.j1(),t)?e:null}function Wr(n,t,r){var i;n:{for(var e=0,u=n.length;e<u;){var o=n[e];if(e=e+1|0,t.h6_1.l5(o.j1(),r)){i=o;break n}}i=null}return i}function Kr(n,t){var r=n.i6_1[t];return void 0===r?null:r}function Xr(n){this.g6_1=n,this.z5_1=-1,this.a6_1=Object.keys(n.i6_1),this.b6_1=-1,this.c6_1=null,this.d6_1=!1,this.e6_1=-1,this.f6_1=null}function Jr(n){this.h6_1=n,this.i6_1=this.k6(),this.j6_1=0}function ni(){}function ti(n){this.n6_1=n,this.l6_1=null,this.m6_1=null,this.m6_1=this.n6_1.y6_1.v6_1}function ri(){v=this;var n,t=(fi(0,0,n=ce(se(si))),n);t.x6_1=!0,this.e7_1=t}function ii(){return null==v&&new ri,v}function ei(n,t,r){this.d7_1=n,xr.call(this,t,r),this.b7_1=null,this.c7_1=null}function ui(n){this.y6_1=n,jr.call(this)}function oi(){return $r(n=ce(se(si))),si.call(n),n.w6_1=Gr(),n;var n}function fi(n,t,r){return Ur(n,t,r),si.call(r),r.w6_1=Gr(),r}function si(){ii(),this.v6_1=null,this.x6_1=!1}function ci(){d=this;var n=ai(0),t=n.y5_1;(t instanceof si?t:_e()).j5(),this.f7_1=n}function ai(n){return function(n,t){return function(n,t,r){Qr(function(n,t){return fi(n,t,ce(se(si)))}(n,t),r),hi.call(r)}(n,0,t),t}(n,ce(se(hi)))}function hi(){null==d&&new ci}function li(){}function _i(){}function vi(n){_i.call(this),this.k7_1=n}function di(){gi.call(this)}function gi(){_i.call(this),this.m7_1=\"\"}function wi(){if(!w){w=!0;var n=\"undefined\"!=typeof process&&process.versions&&!!process.versions.node;g=n?new vi(process.stdout):new di}}function bi(){return n=ce(se(pi)),pi.call(n,\"\"),n;var n}function pi(n){this.o7_1=void 0!==n?n:\"\"}function mi(n){var t=Pi(n).toUpperCase();return t.length>1?n:Zi(t,0)}function ki(n){return function(n){return 9<=n&&n<=13||28<=n&&n<=32||160===n||n>4096&&(5760===n||8192<=n&&n<=8202||8232===n||8233===n||8239===n||8287===n||12288===n)}(n)}function yi(){b=this,this.q7_1=new RegExp(\"[\\\\\\\\^$*+?.()|[\\\\]{}]\",\"g\"),this.r7_1=new RegExp(\"[\\\\\\\\$]\",\"g\"),this.s7_1=new RegExp(\"\\\\$\",\"g\")}function qi(){return null==b&&new yi,b}function Bi(n,t){qi(),this.v7_1=n,this.w7_1=function(n){if(Ue(n,Ti)){var t;switch(n.k()){case 0:t=At();break;case 1:t=pr(Ue(n,Ei)?n.j(0):n.f().h());break;default:t=Zn(n,ai(n.k()))}return t}return function(n){switch(n.k()){case 0:return At();case 1:return pr(n.f().h());default:return n}}(Zn(n,(r=ce(se(hi)),Qr(oi(),r),hi.call(r),r)));var r}(t),this.x7_1=new RegExp(n,Mn(t,\"\",\"gu\",A,A,A,Ci)),this.y7_1=null,this.z7_1=null}function Ci(n){return n.d8_1}function xi(n,t,r,i,e,u){return tr(n,t,r,i,e,u=u!==A&&u)}function ji(n,t){return n-t|0}function Pi(n){return String.fromCharCode(n)}function Ii(){p=this,this.e8_1=0,this.f8_1=65535,this.g8_1=55296,this.h8_1=56319,this.i8_1=56320,this.j8_1=57343,this.k8_1=55296,this.l8_1=57343,this.m8_1=2,this.n8_1=16}function Si(){return null==p&&new Ii,p}function zi(n){Si(),this.h3_1=n}function Ei(){}function Ti(){}function Li(){}function Ni(){}function Ai(){}function Mi(){}function Fi(){m=this}function Di(n,t){null==m&&new Fi,this.p8_1=n,this.q8_1=t}function Oi(n){var t=null==n?null:ie(n);return null==t?\"null\":t}function Ri(n){return new Hi(n)}function Hi(n){this.t8_1=n,this.s8_1=0}function $i(){return Qi(),k}function Gi(){return Qi(),y}function Ui(){return Qi(),q}function Vi(){return Qi(),B}function Qi(){x||(x=!0,k=new ArrayBuffer(8),y=new Float64Array($i()),new Float32Array($i()),q=new Int32Array($i()),Gi()[0]=-1,B=0!==Ui()[0]?1:0,C=1-Vi()|0)}function Zi(n,t){var r;if(Yi(n)){var i,e=n.charCodeAt(t);if(Si(),e<0?i=!0:(Si(),i=e>65535),i)throw fu(\"Invalid Char code: \"+e);r=De(e)}else r=n.y3(t);return r}function Yi(n){return\"string\"==typeof n}function Wi(n){return Yi(n)?n.length:n.x3()}function Ki(n,t,r){return Yi(n)?n.substring(t,r):n.z3(t,r)}function Xi(n){return ie(n)}function Ji(n,t){var r;switch(typeof n){case\"number\":r=\"number\"==typeof t?ne(n,t):t instanceof de?ne(n,t.w8()):te(n,t);break;case\"string\":case\"boolean\":r=te(n,t);break;default:r=function(n,t){return n.a4(t)}(n,t)}return r}function ne(n,t){var r;if(n<t)r=-1;else if(n>t)r=1;else if(n===t){var i;if(0!==n)i=0;else{var e=1/n;i=e===1/t?0:e<0?-1:1}r=i}else r=n!=n?t!=t?0:1:-1;return r}function te(n,t){return n<t?-1:n>t?1:0}function re(n){if(!(\"kotlinHashCodeValue$\"in n)){var t=4294967296*Math.random()|0,r=new Object;r.value=t,r.enumerable=!1,Object.defineProperty(n,\"kotlinHashCodeValue$\",r)}return n.kotlinHashCodeValue$}function ie(n){return null==n?\"null\":function(n){return!!$e(n)||En(n)}(n)?\"[...]\":n.toString()}function ee(n){if(null==n)return 0;var t;switch(typeof n){case\"object\":t=\"function\"==typeof n.hashCode?n.hashCode():re(n);break;case\"function\":t=re(n);break;case\"number\":t=function(n){return Qi(),(0|n)===n?Fe(n):(Gi()[0]=n,zn(Ui()[(Qi(),C)],31)+Ui()[Vi()]|0)}(n);break;case\"boolean\":t=n?1:0;break;default:t=ue(String(n))}return t}function ue(n){var t=0,r=0,i=n.length-1|0;if(r<=i)do{var e=r;r=r+1|0;var u=n.charCodeAt(e);t=zn(t,31)+u|0}while(e!==i);return t}function oe(n,t){return null==n?null==t:null!=t&&(\"object\"==typeof n&&\"function\"==typeof n.equals?n.equals(t):n!=n?t!=t:\"number\"==typeof n&&\"number\"==typeof t?n===t&&(0!==n||1/n==1/t):n===t)}function fe(n,t){null!=Error.captureStackTrace?Error.captureStackTrace(n,t):n.stack=(new Error).stack}function se(n){return n.prototype}function ce(n){return Object.create(n)}function ae(n,t,r){Error.call(n),function(n,t,r){var i=Xe(Object.getPrototypeOf(n));if(!(1&i)){var e;if(null==t){var u;if(null!==t){var o=null==r?null:r.toString();u=null==o?A:o}else u=A;e=u}else e=t;n.message=e}2&i||(n.cause=r),n.name=Object.getPrototypeOf(n).constructor.name}(n,t,r)}function he(n){var t;return null==n?function(){throw ju()}():t=n,t}function le(){throw Iu()}function _e(){throw zu()}function ve(){j=this,this.x8_1=new de(0,-2147483648),this.y8_1=new de(-1,2147483647),this.z8_1=8,this.a9_1=64}function de(n,t){null==j&&new ve,ar.call(this),this.u8_1=n,this.v8_1=t}function ge(){return Me(),P}function we(){return Me(),I}function be(){return Me(),S}function pe(){return Me(),E}function me(){return Me(),T}function ke(n,t){if(Me(),xe(n,t))return 0;var r=Ie(n),i=Ie(t);return r&&!i?-1:!r&&i?1:Ie(qe(n,t))?-1:1}function ye(n,t){Me();var r=n.v8_1>>>16|0,i=65535&n.v8_1,e=n.u8_1>>>16|0,u=65535&n.u8_1,o=t.v8_1>>>16|0,f=65535&t.v8_1,s=t.u8_1>>>16|0,c=0,a=0,h=0,l=0;return c=(c=c+((a=(a=a+((h=(h=h+((l=l+(u+(65535&t.u8_1)|0)|0)>>>16|0)|0)+(e+s|0)|0)>>>16|0)|0)+(i+f|0)|0)>>>16|0)|0)+(r+o|0)|0,new de((h&=65535)<<16|(l&=65535),(c&=65535)<<16|(a&=65535))}function qe(n,t){return Me(),ye(n,t.e9())}function Be(n,t){if(Me(),Se(n))return ge();if(Se(t))return ge();if(xe(n,pe()))return ze(t)?pe():ge();if(xe(t,pe()))return ze(n)?pe():ge();if(Ie(n))return Ie(t)?Be(Ee(n),Ee(t)):Ee(Be(Ee(n),t));if(Ie(t))return Ee(Be(n,Ee(t)));if(Te(n,me())&&Te(t,me()))return Le(Ce(n)*Ce(t));var r=n.v8_1>>>16|0,i=65535&n.v8_1,e=n.u8_1>>>16|0,u=65535&n.u8_1,o=t.v8_1>>>16|0,f=65535&t.v8_1,s=t.u8_1>>>16|0,c=65535&t.u8_1,a=0,h=0,l=0,_=0;return l=l+((_=_+zn(u,c)|0)>>>16|0)|0,_&=65535,h=(h=h+((l=l+zn(e,c)|0)>>>16|0)|0)+((l=(l&=65535)+zn(u,s)|0)>>>16|0)|0,l&=65535,a=(a=(a=a+((h=h+zn(i,c)|0)>>>16|0)|0)+((h=(h&=65535)+zn(e,s)|0)>>>16|0)|0)+((h=(h&=65535)+zn(u,f)|0)>>>16|0)|0,h&=65535,a=a+(((zn(r,c)+zn(i,s)|0)+zn(e,f)|0)+zn(u,o)|0)|0,new de(l<<16|_,(a&=65535)<<16|h)}function Ce(n){return Me(),4294967296*n.v8_1+function(n){return Me(),n.u8_1>=0?n.u8_1:4294967296+n.u8_1}(n)}function xe(n,t){return Me(),n.v8_1===t.v8_1&&n.u8_1===t.u8_1}function je(n,t){if(Me(),t<2||36<t)throw vu(\"radix out of range: \"+t);if(Se(n))return\"0\";if(Ie(n)){if(xe(n,pe())){var r=Pe(t),i=n.d9(r),e=qe(Be(i,r),n).g9();return je(i,t)+e.toString(t)}return\"-\"+je(Ee(n),t)}for(var u=2===t?31:t<=10?9:t<=21?7:t<=35?6:5,o=Le(Math.pow(t,u)),f=n,s=\"\";;){var c=f.d9(o),a=qe(f,Be(c,o)).g9().toString(t);if(Se(f=c))return a+s;for(;a.length<u;)a=\"0\"+a;s=a+s}}function Pe(n){return Me(),new de(n,n<0?-1:0)}function Ie(n){return Me(),n.v8_1<0}function Se(n){return Me(),0===n.v8_1&&0===n.u8_1}function ze(n){return Me(),!(1&~n.u8_1)}function Ee(n){return Me(),n.e9()}function Te(n,t){return Me(),ke(n,t)<0}function Le(n){if(Me(),(t=n)!=t)return ge();if(n<=-0x8000000000000000)return pe();if(n+1>=0x8000000000000000)return Me(),z;if(n<0)return Ee(Le(-n));var t,r=4294967296;return new de(n%r|0,n/r|0)}function Ne(n,t){return Me(),ke(n,t)>0}function Ae(n,t){return Me(),ke(n,t)>=0}function Me(){L||(L=!0,P=Pe(0),I=Pe(1),S=Pe(-1),z=new de(-1,2147483647),E=new de(0,-2147483648),T=Pe(16777216))}function Fe(n){return n instanceof de?n.g9():function(n){return n>2147483647?2147483647:n<-2147483648?-2147483648:0|n}(n)}function De(n){var t;return t=function(n){return n<<16>>16}(Fe(n)),function(n){return 65535&n}(t)}function Oe(n,t){return new Ht(n,t)}function Re(n,t,r,i){return He(\"class\",n,t,r,i,null)}function He(n,t,r,i,e,u){return{kind:n,simpleName:t,associatedObjectKey:r,associatedObjects:i,suspendArity:e,$kClass$:A,iid:u}}function $e(n){return Array.isArray(n)}function Ge(n,t,r,i,e,u,o,f){null!=i&&(n.prototype=Object.create(i.prototype),n.prototype.constructor=n);var s=r(t,u,o,null==f?[]:f);n.$metadata$=s,null!=e&&((null!=s.iid?n:n.prototype).$imask$=function(n){for(var t=1,r=[],i=0,e=n.length;i<e;){var u=n[i];i=i+1|0;var o=t,f=u.prototype.$imask$,s=null==f?u.$imask$:f;null!=s&&(r.push(s),o=s.length);var c=u.$metadata$.iid,a=null==c?null:(l=void 0,v=1<<(31&(h=c)),(l=new Int32Array(1+(h>>5)|0))[_=h>>5]=l[_]|v,l);null!=a&&(r.push(a),o=Math.max(o,a.length)),o>t&&(t=o)}var h,l,_,v;return function(n,t){for(var r=0,i=new Int32Array(n);r<n;){for(var e=r,u=0,o=0,f=t.length;o<f;){var s=t[o];o=o+1|0,e<s.length&&(u|=s[e])}i[e]=u,r=r+1|0}return i}(t,r)}(e))}function Ue(n,t){return function(n,t){var r=n.$imask$;return null!=r&&function(n,t){var r=t>>5;if(r>n.length)return!1;var i=1<<(31&t);return!!(n[r]&i)}(r,t)}(n,t.$metadata$.iid)}function Ve(n){return!!$e(n)&&!n.$type$}function Qe(n){var t;switch(typeof n){case\"string\":case\"number\":case\"boolean\":case\"function\":t=!0;break;default:t=n instanceof Object}return t}function Ze(n){return\"string\"==typeof n||Ue(n,sr)}function Ye(n,t,r,i){return He(\"interface\",n,t,r,i,(null==N&&(N=0),N=We()+1|0,We()))}function We(){if(null!=N)return N;!function(){throw Tu(\"lateinit property iid has not been initialized\")}()}function Ke(n,t,r,i){return He(\"object\",n,t,r,i,null)}function Xe(n){var t=n.constructor,r=null==t?null:t.$metadata$,i=null==r?null:r.errorInfo;if(null!=i)return i;var e,u=0;if(Je(n,\"message\")&&(u|=1),Je(n,\"cause\")&&(u|=2),3!==u){var o=(e=n,Object.getPrototypeOf(e));o!=Error.prototype&&(u|=Xe(o))}return null!=r&&(r.errorInfo=u),u}function Je(n,t){return n.hasOwnProperty(t)}function nu(n){return new Fr(n)}function tu(n,t,r){for(var i=new Int32Array(r),e=0,u=0,o=0,f=0,s=n.length;f<s;){var c=Zi(n,f);f=f+1|0;var a=t[c];if(u|=(31&a)<<o,a<32){var h=e;e=h+1|0,i[h]=u,u=0,o=0}else o=o+5|0}return i}function ru(n,t){for(var r=0,i=n.length-1|0,e=-1,u=0;r<=i;)if(t>(u=n[e=(r+i|0)/2|0]))r=e+1|0;else{if(t===u)return e;i=e-1|0}return e-(t<u?1:0)|0}function iu(){M=this;var n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",t=new Int32Array(128),r=0,i=Wi(n)-1|0;if(r<=i)do{var e=r;r=r+1|0,t[Zi(n,e)]=e}while(r<=i);var u=tu(\"hCgBpCQGYHZH5BRpBPPPPPPRMP5BPPlCPP6BkEPPPPcPXPzBvBrB3BOiDoBHwD+E3DauCnFmBmB2D6E1BlBTiBmBlBP5BhBiBrBvBjBqBnBPRtBiCmCtBlB0BmB5BiB7BmBgEmChBZgCoEoGVpBSfRhBPqKQ2BwBYoFgB4CJuTiEvBuCuDrF5DgEgFlJ1DgFmBQtBsBRGsB+BPiBlD1EIjDPRPPPQPPPPPGQSQS/DxENVNU+B9zCwBwBPPCkDPNnBPqDYY1R8B7FkFgTgwGgwUwmBgKwBuBScmEP/BPPPPPPrBP8B7F1B/ErBqC6B7BiBmBfQsBUwCw/KwqIwLwETPcPjQgJxFgBlBsD\",t,222),o=new Int32Array(u.length),f=0,s=u.length-1|0;if(f<=s)do{var c=f;f=f+1|0,o[c]=0===c?u[c]:o[c-1|0]+u[c]|0}while(f<=s);this.h9_1=o,this.i9_1=tu(\"aaMBXHYH5BRpBPPPPPPRMP5BPPlCPPzBDOOPPcPXPzBvBjB3BOhDmBBpB7DoDYxB+EiBP1DoExBkBQhBekBPmBgBhBctBiBMWOOXhCsBpBkBUV3Ba4BkB0DlCgBXgBtD4FSdBfPhBPpKP0BvBXjEQ2CGsT8DhBtCqDpFvD1D3E0IrD2EkBJrBDOBsB+BPiBlB1EIjDPPPPPPPPPPPGPPMNLsBNPNPKCvBvBPPCkDPBmBPhDXXgD4B6FzEgDguG9vUtkB9JcuBSckEP/BPPPPPPBPf4FrBjEhBpC3B5BKaWPrBOwCk/KsCuLqDHPbPxPsFtEaaqDL\",t,222),this.j9_1=tu(\"GFjgggUHGGFFZZZmzpz5qB6s6020B60ptltB6smt2sB60mz22B1+vv+8BZZ5s2850BW5q1ymtB506smzBF3q1q1qB1q1q1+Bgii4wDTm74g3KiggxqM60q1q1Bq1o1q1BF1qlrqrBZ2q5wprBGFZWWZGHFsjiooLowgmOowjkwCkgoiIk7ligGogiioBkwkiYkzj2oNoi+sbkwj04DghhkQ8wgiYkgoioDsgnkwC4gikQ//v+85BkwvoIsgoyI4yguI0whiwEowri4CoghsJowgqYowgm4DkwgsY/nwnzPowhmYkg6wI8yggZswikwHgxgmIoxgqYkwgk4DkxgmIkgoioBsgssoBgzgyI8g9gL8g9kI0wgwJoxgkoC0wgioFkw/wI0w53iF4gioYowjmgBHGq1qkgwBF1q1q8qBHwghuIwghyKk0goQkwgoQk3goQHGFHkyg0pBgxj6IoinkxDswno7Ikwhz9Bo0gioB8z48Rwli0xN0mpjoX8w78pDwltoqKHFGGwwgsIHFH3q1q16BFHWFZ1q10q1B2qlwq1B1q10q1B2q1yq1B6q1gq1Biq1qhxBir1qp1Bqt1q1qB1g1q1+B//3q16B///q1qBH/qlqq9Bholqq9B1i00a1q10qD1op1HkwmigEigiy6Cptogq1Bixo1kDq7/j00B2qgoBWGFm1lz50B6s5q1+BGWhggzhwBFFhgk4//Bo2jigE8wguI8wguI8wgugUog1qoB4qjmIwwi2KgkYHHH4lBgiFWkgIWoghssMmz5smrBZ3q1y50B5sm7gzBtz1smzB5smz50BqzqtmzB5sgzqzBF2/9//5BowgoIwmnkzPkwgk4C8ys65BkgoqI0wgy6FghquZo2giY0ghiIsgh24B4ghsQ8QF/v1q1OFs0O8iCHHF1qggz/B8wg6Iznv+//B08QgohsjK0QGFk7hsQ4gB\",t,222)}function eu(){return null==M&&new iu,M}function uu(){F=this,this.k9_1=new Int32Array([170,186,688,704,736,837,890,7468,7544,7579,8305,8319,8336,8560,9424,11388,42652,42864,43e3,43868]),this.l9_1=new Int32Array([1,1,9,2,5,1,1,63,1,37,1,1,13,16,26,2,2,1,2,4])}function ou(){return null==F&&new uu,F}function fu(n){var t=function(n,t){return wu(n,t),su.call(t),t}(n,ce(se(su)));return fe(t,fu),t}function su(){fe(this,su)}function cu(n){var t=function(n,t){return wu(n,t),au.call(t),t}(n,ce(se(au)));return fe(t,cu),t}function au(){fe(this,au)}function hu(n){var t=function(n,t){return wu(n,t),lu.call(t),t}(n,ce(se(lu)));return fe(t,hu),t}function lu(){fe(this,lu)}function _u(n,t){return ae(t,n),du.call(t),t}function vu(n){var t=_u(n,ce(se(du)));return fe(t,vu),t}function du(){fe(this,du)}function gu(n){return function(n){ae(n),du.call(n)}(n),bu.call(n),n}function wu(n,t){return _u(n,t),bu.call(t),t}function bu(){fe(this,bu)}function pu(){var n,t=(gu(n=ce(se(ku))),ku.call(n),n);return fe(t,pu),t}function mu(n){var t=function(n,t){return wu(n,t),ku.call(t),t}(n,ce(se(ku)));return fe(t,mu),t}function ku(){fe(this,ku)}function yu(n){var t=function(n,t){return wu(n,t),qu.call(t),t}(n,ce(se(qu)));return fe(t,yu),t}function qu(){fe(this,qu)}function Bu(){var n,t=(gu(n=ce(se(xu))),xu.call(n),n);return fe(t,Bu),t}function Cu(n){var t=function(n,t){return wu(n,t),xu.call(t),t}(n,ce(se(xu)));return fe(t,Cu),t}function xu(){fe(this,xu)}function ju(){var n,t=(gu(n=ce(se(Pu))),Pu.call(n),n);return fe(t,ju),t}function Pu(){fe(this,Pu)}function Iu(){var n,t=(gu(n=ce(se(Su))),Su.call(n),n);return fe(t,Iu),t}function Su(){fe(this,Su)}function zu(){var n,t=(gu(n=ce(se(Eu))),Eu.call(n),n);return fe(t,zu),t}function Eu(){fe(this,Eu)}function Tu(n){var t=function(n,t){return wu(n,t),Lu.call(t),t}(n,ce(se(Lu)));return fe(t,Tu),t}function Lu(){fe(this,Lu)}function Nu(n,t){var r,i=n.className;return(r=\"(^|.*\\\\s+)\"+t+\"($|\\\\s+.*)\",function(n,t){return Bi.call(t,n,At()),t}(r,ce(se(Bi)))).a8(i)}function Au(n,t){this.o9_1=n,this.p9_1=t}function Mu(n){this.q9_1=n}function Fu(n,t,r){var i,e=Ff(),u=Wu(),o=Mf().ga(t),f=Wu();if(0===Wi(r))i=Lf();else{var s=n.ia_1,c=null==s?null:new Mu(s).v9(r,\"Copy reference to the clipboard\");i=null==c?Lf():c}return e.ja([u,o,f,i])}function Du(n){n=n===A?null:n,this.ia_1=n}function Ou(n,t,r){Yu.call(this),this.ma_1=n,this.na_1=t,this.oa_1=r}function Ru(n,t){this.ra_1=n,this.sa_1=t}function Hu(n,t){Yu.call(this),this.va_1=n,this.wa_1=t}function $u(n,t){Yu.call(this),this.xa_1=n,this.ya_1=t}function Gu(n){Yu.call(this),this.za_1=n}function Uu(n){Yu.call(this),this.ab_1=n}function Vu(n){Yu.call(this),this.bb_1=n}function Qu(n,t){Yu.call(this),this.cb_1=n,this.db_1=t}function Zu(n){Yu.call(this),this.eb_1=n}function Yu(){}function Wu(){return ro(),D}function Ku(){return ro(),O}function Xu(){return ro(),R}function Ju(){return ro(),H}function no(n){return ro(),Ff().fb(Jf(to),n)}function to(n){return ro(),n.gb([\"invisible-text\",\"text-for-copy\"]),lr()}function ro(){$||($=!0,D=no(\"`\"),O=no(\" \"),R=no(\"(\"),H=no(\")\"))}function io(n,t){Yu.call(this),this.hb_1=n,this.ib_1=t}function eo(n){Yu.call(this),this.jb_1=n}function uo(n,t){Yu.call(this),this.kb_1=n,this.lb_1=t}function oo(n){Yu.call(this),this.mb_1=n}function fo(n){Yu.call(this),this.nb_1=n}function so(n){Yu.call(this),this.ob_1=n}function co(n,t,r){Yu.call(this),this.pb_1=n,this.qb_1=t,this.rb_1=r}function ao(n){Yu.call(this),this.sb_1=n}function ho(n){Yu.call(this),this.tb_1=n}function lo(n){return n.xb_1.vb_1.k()}function _o(){if(Z)return lr();Z=!0,G=new ko(\"Inputs\",0,\"Build configuration inputs\"),U=new ko(\"ByMessage\",1,\"Problems grouped by message\"),V=new ko(\"ByLocation\",2,\"Problems grouped by location\"),Q=new ko(\"IncompatibleTasks\",3,\"Incompatible tasks\")}function vo(n){yc.call(this),this.yb_1=n}function go(n){yc.call(this),this.ac_1=n}function wo(n){yc.call(this),this.bc_1=n}function bo(n){yc.call(this),this.cc_1=n}function po(n){yo.call(this),this.dc_1=n}function mo(n,t,r,i,e,u,o,f){this.ec_1=n,this.fc_1=t,this.gc_1=r,this.hc_1=i,this.ic_1=e,this.jc_1=u,this.kc_1=o,this.lc_1=f}function ko(n,t,r){Di.call(this,n,t),this.qc_1=r}function yo(){Bc.call(this)}function qo(n,t){var r=Af(),i=Jf(Lo),e=Af().y9(Jf(No),[]),u=function(n,t){var r,i=Af(),e=Jf(Oo),u=Ff().ga(\"Learn more about the \"),o=$f();return i.y9(e,[u,o.fb(Jf((r=t,function(n){return n.bd(r.tc_1),lr()})),t.sc_1),Ff().ga(\".\")])}(0,t.gc_1),o=Af().y9(Jf(Ao),[Co(0,t)]),f=Af();return r.y9(i,[e,u,o,f.y9(Jf(Mo),[Io(0,Ro(),t.lc_1,lo(t.jc_1)),Io(0,Ho(),t.lc_1,lo(t.hc_1)),Io(0,$o(),t.lc_1,lo(t.ic_1)),Io(0,Go(),t.lc_1,lo(t.kc_1))])])}function Bo(n,t){var r,i,e=Af(),u=Jf(Fo);switch(t.lc_1.q8_1){case 0:r=zo(0,t.jc_1,((i=function(n){return new wo(n)}).callableName=\"<init>\",i));break;case 3:r=zo(0,t.kc_1,function(){var n=function(n){return new bo(n)};return n.callableName=\"<init>\",n}());break;case 1:r=zo(0,t.hc_1,function(){var n=function(n){return new go(n)};return n.callableName=\"<init>\",n}());break;case 2:r=zo(0,t.ic_1,function(){var n=function(n){return new vo(n)};return n.callableName=\"<init>\",n}());break;default:le()}return e.y9(u,[r])}function Co(n,t){return Af().ja([Po(0,t),xo(0,t)])}function xo(n,t){for(var r=Af(),i=t.fc_1,e=Lr(),u=0,o=i.f();o.g();){var f=o.h(),s=u;u=s+1|0,jt(e,0===wr(s)?gr(jo(Vo(),f)):bt([Gf().ja([]),jo(Vo(),f)]))}return r.ha(e)}function jo(n,t){return Df().ja([Ic(t)])}function Po(n,t){return Nf().ja([jc().ka(t.ec_1)])}function Io(n,t,r,i){var e,u,o;return Af().y9(Jf((e=i,u=t,o=r,function(n){return n.t9(\"group-selector\"),0===e?(n.t9(\"group-selector--disabled\"),lr()):u.equals(o)?(n.t9(\"group-selector--active\"),lr()):(n.u9(function(n){return function(t){return new po(n)}}(u)),lr()),lr()})),[Ff().rc(t.qc_1,[So(0,i)])])}function So(n,t){return Ff().y9(Jf(Do),[Ku(),Xu(),Ff().ga(\"\"+t),Ju()])}function zo(n,t,r){return function(n,t,r){var i,e=Af(),u=Of();return e.ja([u.ha(ys(t,(i=r,function(n){var t,r=n.cd().ub_1;return r instanceof Hu?Nc(i,(Vo(),(t=function(n){return Eo(0,n)}).callableName=\"viewNode\",t),n,r.va_1,r.wa_1,Cc()):r instanceof $u?Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName=\"viewNode\",n}(Vo()),n,r.xa_1,r.ya_1,xc()):r instanceof io?Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName=\"viewNode\",n}(Vo()),n,r.hb_1,r.ib_1,A,So(Vo(),n.cd().vb_1.k())):r instanceof Ou?Lc(i,n,r):Nc(i,function(){var n=function(n){return Eo(0,n)};return n.callableName=\"viewNode\",n}(Vo()),n,r)})))])}(0,t.xb_1.uc().vc(),r)}function Eo(n,t){var r;return t instanceof eo?Sc((r=t,function(n){return n.ed(\"project \"),n.fd(r.jb_1),lr()})):t instanceof co?Sc(function(n){return function(t){return t.ed(n.pb_1+\" \"),t.fd(n.qb_1),t.ed(\" of \"),t.fd(n.rb_1),lr()}}(t)):t instanceof so?Sc(function(n){return function(t){return t.ed(\"system property \"),t.fd(n.ob_1),lr()}}(t)):t instanceof uo?Sc(function(n){return function(t){return t.ed(\"task \"),t.fd(n.kb_1),t.ed(\" of type \"),t.fd(n.lb_1),lr()}}(t)):t instanceof fo?Sc(function(n){return function(t){return t.ed(\"bean of type \"),t.fd(n.nb_1),lr()}}(t)):t instanceof ao?Sc(function(n){return function(t){return t.ed(n.sb_1),lr()}}(t)):t instanceof ho?Sc(function(n){return function(t){return t.ed(\"class \"),t.fd(n.tb_1),lr()}}(t)):t instanceof Zu?Sc(function(n){return function(t){return t.ed(n.eb_1),lr()}}(t)):t instanceof Gu?Ic(t.za_1):t instanceof Qu?Qo(t):Ff().ga(ie(t))}function To(n){return n.t9(\"report-wrapper\"),lr()}function Lo(n){return n.t9(\"header\"),lr()}function No(n){return n.t9(\"gradle-logo\"),lr()}function Ao(n){return n.t9(\"title\"),lr()}function Mo(n){return n.t9(\"groups\"),lr()}function Fo(n){return n.t9(\"content\"),lr()}function Do(n){return n.t9(\"group-selector__count\"),lr()}function Oo(n){return n.t9(\"learn-more\"),lr()}function Ro(){return _o(),G}function Ho(){return _o(),U}function $o(){return _o(),V}function Go(){return _o(),Q}function Uo(){Y=this}function Vo(){return null==Y&&new Uo,Y}function Qo(n){var t;return $f().fb(Jf((t=n,function(n){return n.t9(\"documentation-button\"),n.bd(t.cb_1),lr()})),n.db_1)}function Zo(n,t,r){this.kd_1=n,this.ld_1=t,this.md_1=r}function Yo(n,t,r){this.nd_1=n,this.od_1=t,this.pd_1=r}function Wo(n,t){for(var r=vf(n),i=t.trace,e=Nr(i.length),u=0,o=i.length;u<o;){var f,s=i[u];u=u+1|0,f=Jo(s),e.d(f)}return new Zo(t,r,e)}function Ko(n,t){var r,i=null==(r=t.kd_1.error)?null:nf(r);null==i||n.d(i)}function Xo(n){return function(n,t,r){var i=null==n.error?null:new Hu(t,r);return null==i?new $u(t,r):i}(n.kd_1,new Gu(n.ld_1),ef(n.kd_1))}function Jo(n){var t;switch(n.kind){case\"Project\":t=new eo(n.path);break;case\"Task\":t=new uo(n.path,n.type);break;case\"TaskPath\":t=new oo(n.path);break;case\"Bean\":t=new fo(n.type);break;case\"Field\":t=new co(\"field\",n.name,n.declaringType);break;case\"InputProperty\":t=new co(\"input property\",n.name,n.task);break;case\"OutputProperty\":t=new co(\"output property\",n.name,n.task);break;case\"SystemProperty\":t=new so(n.name);break;case\"PropertyUsage\":t=new co(\"property\",n.name,n.from);break;case\"BuildLogic\":t=new ao(n.location);break;case\"BuildLogicClass\":t=new ho(n.type);break;default:t=new Zu(\"Gradle runtime\")}return t}function nf(n){var t=n.parts;if(null==t){var r=n.summary;return null==r?null:new Gu(vf(r))}for(var i=n.summary,e=null==i?null:vf(i),u=Lr(),o=Ri(t);o.g();){var f=rf(o.h());null==f||u.d(f)}for(var s=Mn(u,\"\\n\"),c=Lr(),a=Ri(t);a.g();){var h=tf(a.h());null==h||c.d(h)}return new Ou(e,s,c)}function tf(n){var t=rf(n);if(null==t)return null;var r,i,e=nt(new Nt(function(n,t,r,i){var e;return Jn(nr(n,[\"\\r\\n\",\"\\n\",\"\\r\"],A,r=r!==A&&r,i=i===A?0:i),(e=n,function(n){return Jt(e,n)}))}(t),!0,lf));return new Ru(e,(r=!(null==n.internalText),i=e.k(),r&&i>1?ps():null))}function rf(n){var t=n.text;return null==t?n.internalText:t}function ef(n){var t=n.documentationLink;return null==t?null:new Qu(t,\"\")}function uf(n,t){return new cs(of(n,jf().sd(t),ps()))}function of(n,t,r){return new ks(n,function(n,t){var r,i=Jn(On(n.o()),If);return nt(Jn(new rt(i,new ff(_f)),(r=t,function(n){return of(n.v3(),n.w3().wd_1,r)})))}(t,1===Pf(t)?ms():ps()),0===Pf(t)?ps():r)}function ff(n){this.td_1=n}function sf(n){var t=Lr(),r=n.ld_1,i=Dn(r.ca_1).fa_1,e=ie(Xt(Ze(i)?i:_e())),u=r.vd(function(n,t){var r;if(!(t>=0))throw fu(ie(\"Requested element count \"+t+\" is less than zero.\"));if(0===t)return Rn(n);if(Ue(n,Ti)){var i=n.k()-t|0;if(i<=0)return pt();if(1===i)return gr(function(n){if(Ue(n,Ei))return Qn(n);var t=n.f();if(!t.g())throw mu(\"Collection is empty.\");for(var r=t.h();t.g();)r=t.h();return r}(n));if(r=Nr(),Ue(n,Ei)){if(Ue(n,li)){var e=t,u=n.k();if(e<u)do{var o=e;e=e+1|0,r.d(n.j(o))}while(e<u)}else for(var f=n.l(t);f.g();){var s=f.h();r.d(s)}return r}}else r=Lr();for(var c=0,a=n.f();a.g();){var h=a.h();c>=t?r.d(h):c=c+1|0}return mt(r)}(r.ca_1,1));return t.d(new io(new Zu(e),ef(n.kd_1))),t.d(new Gu(u)),t.m(n.md_1),t.j5()}function cf(n){var t=Lr(),r=n.ld_1,i=r.vd(r.ca_1);return t.d(new $u(new Gu(i),ef(n.kd_1))),t.j5()}function af(n){var t=Lr();return t.d(Xo(n)),t.m(n.md_1),Ko(t,n),t.j5()}function hf(n){var t=Lr();return t.m(new St(n.md_1)),t.d(Xo(n)),Ko(t,n),t.j5()}function lf(n){return Wi(n)>0}function _f(n,t){return function(n,t){return n===t?0:null==n?-1:null==t?1:Ji(null!=n&&(\"string\"==(i=typeof(r=n))||\"boolean\"===i||function(n){return\"number\"==typeof n||n instanceof de}(r)||Ue(r,cr))?n:_e(),t);var r,i}(Oi(n.v3()),Oi(t.v3()))}function vf(n){var t;return Bf().qd((t=n,function(n){for(var r=t,i=0,e=r.length;i<e;){var u=r[i];i=i+1|0;var o=u.text;null==o||n.ed(o);var f=u.name;null==f||(n.fd(f),lr())}return lr()}))}function df(n,t){return(0!==(r=n)?r.toString():\"No\")+\" \"+gf(t,n)+\" \"+wf(n)+\" found\";var r}function gf(n,t){return t<2?n:n+\"s\"}function wf(n){return n<=1?\"was\":\"were\"}function bf(n,t){this.sc_1=n,this.tc_1=t}function pf(n){kf.call(this),this.fa_1=n}function mf(n,t){kf.call(this),this.da_1=n,this.ea_1=t}function kf(){}function yf(){this.dd_1=Lr()}function qf(){W=this}function Bf(){return null==W&&new qf,W}function Cf(n){Bf(),this.ca_1=n}function xf(){K=this}function jf(){return null==K&&new xf,K}function Pf(n){return n.k()}function If(n){var t=n.j1(),r=n.i1();return fr(t,new Sf(Ue(r,Ni)?r:_e()))}function Sf(n){jf(),this.wd_1=n}function zf(n,t,r){var i;Tf(t,n,r),i=\"Component mounted at #\"+n.id+\".\",wi(),(wi(),g).j7(i)}function Ef(n){var t=document.getElementById(n);if(null==t)throw hu(\"'\"+n+\"' element missing\");return t}function Tf(n,t,r){var i,e,u;i=n.z9(r),e=t,u=function(n,t,r){return function(i){return Tf(n,r,n.ba(i,t)),lr()}}(n,r,t),fs(),e.innerHTML=\"\",us(e,i,u)}function Lf(){return fs(),X}function Nf(){return fs(),J}function Af(){return fs(),nn}function Mf(){return fs(),tn}function Ff(){return fs(),rn}function Df(){return fs(),en}function Of(){return fs(),un}function Rf(){return fs(),on}function Hf(){return fs(),fn}function $f(){return fs(),sn}function Gf(){return fs(),cn}function Uf(n){this.x9_1=n}function Vf(){an=this}function Qf(){return null==an&&new Vf,an}function Zf(){hn=this,Xf.call(this)}function Yf(){return null==hn&&new Zf,hn}function Wf(n,t,r,i){t=t===A?pt():t,r=r===A?null:r,i=i===A?pt():i,Xf.call(this),this.be_1=n,this.ce_1=t,this.de_1=r,this.ee_1=i}function Kf(){}function Xf(){Qf()}function Jf(n){fs();var t,r=Lr();return n(new ns((t=r,function(n){return t.d(n),lr()}))),r}function ns(n){this.r9_1=n}function ts(n,t){es.call(this),this.fe_1=n,this.ge_1=t}function rs(n){es.call(this),this.he_1=n}function is(n,t){es.call(this),this.ie_1=n,this.je_1=t}function es(){}function us(n,t,r){if(fs(),t instanceof Wf)!function(n,t,r){var i=function(n,t,r){var i=n.createElement(t);return r(i),i}(he(n.ownerDocument),t,r);n.appendChild(i)}(n,t.be_1,(e=t,u=r,function(n){for(var t=e.ce_1.f();t.g();)os(n,t.h(),u);var r=e.de_1;null==r||function(n,t){n.appendChild(he(n.ownerDocument).createTextNode(t))}(n,r);for(var i=e.ee_1.f();i.g();)us(n,i.h(),u);return lr()}));else if(t instanceof Kf){var i=t instanceof Kf?t:_e();us(n,i.ke_1,function(n,t){return function(r){return n(t.le_1(r)),lr()}}(r,i))}else if(oe(t,Yf()))return lr();var e,u}function os(n,t,r){var i,e;fs(),t instanceof is?n.setAttribute(t.ie_1,t.je_1):t instanceof rs?function(n,t){for(var r=Lr(),i=0,e=t.length;i<e;){var u=t[i];i=i+1|0,Nu(n,u)||r.d(u)}var o=r;if(!o.i()){var f=n.className,s=ie(Xt(Ze(f)?f:_e())),c=bi();c.p7(s),0!==Wi(s)&&c.p7(\" \"),Fn(o,c,\" \"),n.className=c.toString()}}(n,[t.he_1]):t instanceof ts&&n.addEventListener(t.fe_1,(i=r,e=t,function(n){return n.stopPropagation(),i(e.ge_1(n)),lr()}))}function fs(){ln||(ln=!0,X=Yf(),new Uf(\"hr\"),J=new Uf(\"h1\"),new Uf(\"h2\"),nn=new Uf(\"div\"),new Uf(\"pre\"),tn=new Uf(\"code\"),rn=new Uf(\"span\"),en=new Uf(\"small\"),un=new Uf(\"ol\"),on=new Uf(\"ul\"),fn=new Uf(\"li\"),sn=new Uf(\"a\"),cn=new Uf(\"br\"),new Uf(\"p\"))}function ss(n){as.call(this),this.ne_1=n}function cs(n){this.xb_1=n}function as(){}function hs(n){return n.me(A,A,n.wb_1.ad())}function ls(){_n=this}function _s(){return null==_n&&new ls,_n}function vs(){if(gn)return lr();gn=!0,vn=new ws(\"Collapsed\",0),dn=new ws(\"Expanded\",1)}function ds(n){bs.call(this),this.ve_1=n}function gs(n,t,r){bs.call(this),this.se_1=n,this.te_1=t,this.ue_1=r}function ws(n,t){Di.call(this,n,t)}function bs(){}function ps(){return vs(),vn}function ms(){return vs(),dn}function ks(n,t,r){t=t===A?pt():t,r=r===A?ps():r,this.ub_1=n,this.vb_1=t,this.wb_1=r}function ys(n,t){return nt(Jn(n,(r=t,function(n){return function(n,t){var r,i=n.cd(),e=Hf(),u=t(n),o=i.vb_1;r=null==(i.wb_1.equals(ms())&&!o.i()?o:null)?null:function(n,t){return Rf().ha(function(n,t){return ys(n.vc(),t)}(n,t))}(n,t);var f=r;return e.ja([u,null==f?Lf():f])}(n,r)})));var r}function qs(){if(kn)return lr();kn=!0,bn=new Bs(\"ByMessage\",0,\"Messages\"),pn=new Bs(\"ByGroup\",1,\"Group\"),mn=new Bs(\"ByFileLocation\",2,\"Locations\")}function Bs(n,t,r){Di.call(this,n,t),this.cf_1=r}function Cs(n,t){this.df_1=n,this.ef_1=t}function xs(n,t){this.ff_1=n,this.gf_1=t}function js(n){return new ks(new Gu(Bf().rd(n+\" more problem\"+(n>1?\"s have\":\" has\")+\" been skipped\")))}function Ps(n,t,r,i){var e,u,o=n.v1(t);if(null==o){var f=Lr(),s=fr(new ks(new Vs(Bf().qd((u=t,function(n){return n.fd(u),lr()}))),f,ms()),f);n.h5(t,s),e=s}else e=o;e.u3_1.d(Es(r,i))}function Is(n,t,r,i){var e;if(t=t===A?Lr():t,r=r===A?oi():r,i===A){var u=wn;wn=u+1|0,e=u}else e=i;i=e,this.hf_1=n,this.if_1=t,this.jf_1=r,this.kf_1=i}function Ss(n,t){if(t.i())return null;for(var r,i=n,e=null,u=t.f();u.g();){var o=u.h();r=e;var f,s=i,c=o.ef_1+\" (\"+o.df_1+\")\",a=s.v1(c);if(null==a){var h=Lr(),l=new Is(new ks(new Vs(Bf().qd(Fs(o))),h,ms()),h);s.h5(c,l),f=l}else f=a;e=f,null==r||he(r).if_1.u(he(e).hf_1)||he(r).if_1.d(he(e).hf_1),i=he(e).jf_1}return e}function zs(n,t){if(n.k()===t.length){var r;n:{var i=function(n,t){var r=t.length,i=xt(n,10),e=Nr(Math.min(i,r)),u=0,o=n.f();t:for(;o.g();){var f,s=o.h();if(u>=r)break t;var c=u;u=c+1|0,f=fr(s,t[c]),e.d(f)}return e}(n,t);if(Ue(i,Ti)&&i.i())r=!0;else{for(var e=i.f();e.g();){var u=e.h();if(u.t3_1.df_1!==u.u3_1.name||u.t3_1.ef_1!==u.u3_1.displayName){r=!1;break n}}r=!0}}return r}return!1}function Es(n,t,r){var i=function(n,t,r){t=t===A?null:t;var i=Ns(function(n,t){return n&&null!=t.contextualLabel?he(t.contextualLabel):Ts(t)}(r=r!==A&&r,n),t).j5();return Ls(n,new Gu(i))}(n,t=t===A?null:t,r=r!==A&&r),e=function(n,t,r){r=r!==A&&r;var i,e=n.problemDetails;if(null==e)i=null;else{var u,o=e[0].text,f=null==o?null:function(n,t,r,i){if(r=r!==A&&r,i=i===A?0:i,1===t.length){var e=t[0];if(0!==Wi(e))return function(n,t,r,i){rr(i);var e=0,u=Wt(n,t,e,r);if(-1===u||1===i)return gr(ie(n));var o,f=i>0,s=Nr(f&&Kn(i,10));n:do{var c;if(c=ie(Ki(n,e,u)),s.d(c),e=u+t.length|0,f&&s.k()===(i-1|0))break n;u=Wt(n,t,e,r)}while(-1!==u);return o=ie(Ki(n,e,Wi(n))),s.d(o),s}(n,e,r,i)}for(var u=function(n){return new tt(n)}(nr(n,t,A,r,i)),o=Nr(xt(u,10)),f=u.f();f.g();){var s;s=Jt(n,f.h()),o.d(s)}return o}(o,[\"\\n\"]);if(null==f)u=null;else{for(var s=Nr(xt(f,10)),c=f.f();c.g();){var a,h=c.h();a=Ms(n)?Bf().qd(Os(h)):Bf().rd(h),s.d(a)}u=s}var l,_=u;if(null==_)l=null;else{for(var v=Nr(xt(_,10)),d=_.f();d.g();){var g;g=new ks(new Gu(d.h())),v.d(g)}l=v}var w=null==l?null:Hn(l);i=null==w?Lr():w}var b=i,p=null==b?Lr():b;r||null==n.contextualLabel||p.d(new ks(new Gu(Bf().rd(he(n.contextualLabel)))));var m=function(n){var t=n.solutions;if(null==t||0===t.length)return null;for(var r=new Vu(Bf().rd(\"Solutions\")),i=he(n.solutions),e=Nr(i.length),u=0,o=i.length;u<o;){var f,s=i[u];u=u+1|0,f=new ks(new Uu(vf(s))),e.d(f)}return new ks(r,e)}(n);null==m||p.d(m);var k,y=n.error,q=null==y?null:nf(y);if(null==q||p.d(new ks(q)),t){var B=n.locations;k=!(null==B||0===B.length)}else k=!1;return k&&p.d(function(n){var t,r=n.locations;if(null==r)t=null;else{for(var i=Nr(r.length),e=Ri(r);e.g();){var u,o=e.h();u=new ks(new Gu(Bf().qd(Rs(o)))),i.d(u)}t=i}var f=t;return new ks(new Zu(\"Locations\"),null==f?pt():f)}(n)),p}(n,null==t,r);return new ks(i,e)}function Ts(n){return function(n){if(0===n.length)throw mu(\"Array is empty.\");return n[Nn(n)]}(n.problemId).displayName}function Ls(n,t){var r;switch(n.severity){case\"WARNING\":var i=n.documentationLink;r=new $u(t,null==i?null:new Qu(i,\"\"));break;case\"ERROR\":var e=n.documentationLink;r=new Hu(t,null==e?null:new Qu(e,\"\"));break;case\"ADVICE\":var u=n.documentationLink;r=new Qs(t,null==u?null:new Qu(u,\"\"));break;default:console.error(\"no severity \"+n.severity),r=t}return r}function Ns(n,t){t=t===A?null:t;var r,i=new yf;if(i.ed(n),null==t);else{if(null!=t.line){var e=As(t);i.xd(e+(null==(r=t).line||null==r.length?\"\":\"-\"+r.length),\"\"+t.path+e)}var u=t.taskPath;null==u||i.fd(u);var o=t.pluginId;null!=o&&i.fd(o)}return i}function As(n){var t;if(null==n.line)t=null;else{var r,i=\":\"+n.line,e=n.column;t=i+(null==(r=null==e?null:\":\"+e)?\"\":r)}return null==t?\"\":t}function Ms(n){var t,r,i=n.problemId;n:{for(var e=0,u=i.length;e<u;){var o=i[e];if(e=e+1|0,\"compilation\"===o.name){r=o;break n}}r=null}if(null!=r){var f,s=n.problemId;n:{for(var c=0,a=s.length;c<a;){var h=s[c];if(c=c+1|0,\"java\"===h.name){f=h;break n}}f=null}t=!(null==f)}else t=!1;return t}function Fs(n){return function(t){return t.ed(n.ef_1),t.fd(n.df_1),lr()}}function Ds(n){return n.name}function Os(n){return function(t){return t.xd(function(n,t,r,i){i=i!==A&&i;var e=new RegExp(qi().t7(\" \"),i?\"gui\":\"gu\"),u=qi().u7(\" \");return n.replace(e,u)}(n),\"\"),lr()}}function Rs(n){return function(t){return t.ed(\"- \"),t.fd(\"\"+n.path+As(n)),lr()}}function Hs(){return qs(),bn}function $s(){return qs(),pn}function Gs(){return qs(),mn}function Us(n){Zs.call(this),this.lf_1=n}function Vs(n,t){t=t!==A&&t,Zs.call(this),this.mf_1=n,this.nf_1=t}function Qs(n,t){t=t===A?null:t,Yu.call(this),this.of_1=n,this.pf_1=t}function Zs(){Yu.call(this)}function Ys(n){yc.call(this),this.qf_1=n}function Ws(n){yc.call(this),this.rf_1=n}function Ks(n){yc.call(this),this.sf_1=n}function Xs(n){nc.call(this),this.tf_1=n}function Js(n,t,r,i,e,u,o,f){this.uf_1=n,this.vf_1=t,this.wf_1=r,this.xf_1=i,this.yf_1=e,this.zf_1=u,this.ag_1=o,this.bg_1=f}function nc(){Bc.call(this)}function tc(n,t){var r=Lr();lo(t.xf_1)>0&&r.d(fc(0,Hs(),t.bg_1,t.ag_1)),lo(t.yf_1)>0&&r.d(fc(0,$s(),t.bg_1,t.ag_1)),lo(t.zf_1)>0&&r.d(fc(0,Gs(),t.bg_1,t.ag_1));var i=Af(),e=Jf(hc),u=Af().y9(Jf(lc),[]),o=function(n,t){var r,i=Af(),e=Jf(wc),u=Ff().ga(\"Learn more about \"),o=$f();return i.y9(e,[u,o.fb(Jf((r=t,function(n){return n.bd(r.tc_1),lr()})),t.sc_1),Ff().ga(\".\")])}(0,t.wf_1),f=Af().y9(Jf(_c),[ic(0,t)]),s=Af();return i.y9(e,[u,o,f,s.zd(Jf(vc),r)])}function rc(n,t){var r,i,e=Af(),u=Jf(dc);switch(t.bg_1.q8_1){case 0:r=sc(0,t.xf_1,((i=function(n){return new Ys(n)}).callableName=\"<init>\",i));break;case 1:r=sc(0,t.yf_1,function(){var n=function(n){return new Ws(n)};return n.callableName=\"<init>\",n}());break;case 2:r=sc(0,t.zf_1,function(){var n=function(n){return new Ks(n)};return n.callableName=\"<init>\",n}());break;default:le()}return e.y9(u,[r])}function ic(n,t){return Af().ja([oc(0,t),ec(0,t)])}function ec(n,t){for(var r=Af(),i=t.vf_1,e=Lr(),u=0,o=i.f();o.g();){var f=o.h(),s=u;u=s+1|0,jt(e,0===wr(s)?gr(uc(pc(),f)):bt([Gf().ja([]),uc(pc(),f)]))}return r.ha(e)}function uc(n,t){return Df().ja([Ic(t)])}function oc(n,t){return Nf().ja([jc().ka(t.uf_1)])}function fc(n,t,r,i){var e,u,o,f;return Af().y9(Jf((e=i,u=t,o=r,function(n){return n.t9(\"group-selector\"),0===e?(n.t9(\"group-selector--disabled\"),lr()):u.equals(o)?(n.t9(\"group-selector--active\"),lr()):(n.u9(function(n){return function(t){return new Xs(n)}}(u)),lr()),lr()})),[Ff().rc(t.cf_1,[(f=i,Ff().y9(Jf(gc),[Ku(),Xu(),Ff().ga(\"\"+f),Ju()]))])])}function sc(n,t,r){return function(n,t,r){var i,e=Af(),u=Of();return e.ja([u.ha(ys(t,(i=r,function(n){return function(n,t,r,i){var e,u;return t instanceof Us?Ic(Bf().rd(t.lf_1)):t instanceof Vs?Af().y9(Jf((u=t,function(n){return u.nf_1&&(n.t9(\"uncategorized\"),lr()),lr()})),[Af().ja([zc(r,i),Ic(t.mf_1)])]):t instanceof Ou?Lc(i,r,t):t instanceof Gu?Ic(t.za_1):t instanceof Uu?Af().ja([(Vc(),xn),Ic(t.ab_1)]):t instanceof Vu?Af().ja([zc(r,i),Ic(t.bb_1)]):t instanceof Hu?Nc(i,((e=function(n){return cc(0,n)}).callableName=\"viewIt\",e),r,t.va_1,t.wa_1,Cc()):t instanceof Qs?Nc(i,function(){var n=function(n){return cc(0,n)};return n.callableName=\"viewIt\",n}(),r,t.of_1,t.pf_1,(Vc(),Bn)):t instanceof $u?Nc(i,function(){var n=function(n){return cc(0,n)};return n.callableName=\"viewIt\",n}(),r,t.xa_1,t.ya_1,xc()):t instanceof Zu?Af().ja([zc(r,i),Ic(Bf().rd(t.eb_1))]):Ff().ga(\"Unknown node type viewNode: \"+t)}(pc(),n.cd().ub_1,n,i)})))])}(0,t.xb_1.uc().vc(),r)}function cc(n,t){var r;if(t instanceof Qu)r=Qo(t);else if(t instanceof Zu)r=Ic(Bf().rd(t.eb_1));else if(t instanceof Gu)r=Ic(t.za_1);else{var i=\"Unknown node type viewIt: \"+t;console.error(i),r=Ff().ga(i)}return r}function ac(n){return n.t9(\"report-wrapper\"),lr()}function hc(n){return n.t9(\"header\"),lr()}function lc(n){return n.t9(\"gradle-logo\"),lr()}function _c(n){return n.t9(\"title\"),lr()}function vc(n){return n.t9(\"groups\"),lr()}function dc(n){return n.t9(\"content\"),lr()}function gc(n){return n.t9(\"group-selector__count\"),lr()}function wc(n){return n.t9(\"learn-more\"),lr()}function bc(){yn=this,document.title=\"Gradle Problem Report\"}function pc(){return null==yn&&new bc,yn}function mc(n,t,r){return n.pe(t.zb().oe(),r)}function kc(n){Bc.call(this),this.hd_1=n}function yc(){Bc.call(this)}function qc(n,t){Bc.call(this),this.wc_1=n,this.xc_1=t}function Bc(){}function Cc(){return Vc(),qn}function xc(){return Vc(),Cn}function jc(){return Vc(),jn}function Pc(){return Vc(),Pn}function Ic(n){return Vc(),Pc().ka(n)}function Sc(n){return Vc(),Pc().ka(Bf().qd(n))}function zc(n,t){return Vc(),n.cd().ye()?Ac(n,t):function(n){return Vc(),Ff().fb(Jf(Gc),Mc(n))}(n)}function Ec(n,t,r,i){var e,u,o;return Vc(),Ff().fb(Jf((e=r,u=t,o=i,function(n){return n.t9(\"java-exception-part-toggle\"),n.u9(function(n,t){return function(r){return new qc(n,t())}}(u,o)),n.s9(\"Click to \"+function(n){var t;switch(Vc(),n.q8_1){case 0:t=\"show\";break;case 1:t=\"hide\";break;default:le()}return t}(e)),lr()})),\"(\"+n+\" internal \"+gf(\"line\",n)+\" \"+function(n){var t;switch(Vc(),n.q8_1){case 0:t=\"hidden\";break;case 1:t=\"shown\";break;default:le()}return t}(r)+\")\")}function Tc(n,t){t=t===A?Lf():t,Vc();for(var r=Rf(),i=Nr(xt(n,10)),e=0,u=n.f();u.g();){var o,f=e;e=f+1|0,s=u.h(),c=(c=0===wr(f)?t:Lf())===A?Lf():c,Vc(),o=Hf().ja([Mf().ga(s),c]),i.d(o)}var s,c;return r.ha(i)}function Lc(n,t,r){Vc();var i,e,u,o=Af(),f=Ac(t,n),s=Ff().ga(\"Exception\"),c=Ff().ja([(Vc(),In).v9(r.na_1,\"Copy exception to the clipboard\")]),a=null==r.ma_1?null:Ff().ga(\" \"),h=null==a?Lf():a,l=r.ma_1,_=null==l?null:Ic(l),v=null==_?Lf():_;switch(t.cd().wb_1.q8_1){case 0:i=Lf();break;case 1:i=function(n,t){Vc();for(var r=Af(),i=Jf(Uc),e=n.oa_1,u=Nr(xt(e,10)),o=0,f=e.f();f.g();){var s,c=f.h(),a=o;o=a+1|0;var h,l=wr(a);if(null!=c.sa_1){var _,v=Ec(c.ra_1.k(),l,c.sa_1,t),d=c.sa_1;switch(null==d?-1:d.q8_1){case 0:_=Tc(Un(c.ra_1,1),v);break;case 1:_=Tc(c.ra_1,v);break;default:le()}h=_}else h=Tc(c.ra_1);s=h,u.d(s)}return r.zd(i,u)}(r,(e=n,u=t,function(){return e(new ss(u))}));break;default:le()}return o.ja([f,s,c,h,v,i])}function Nc(n,t,r,i,e,u,o){e=e===A?null:e,u=u===A?Lf():u,o=o===A?Lf():o,Vc();var f=Af(),s=zc(r,n),c=t(i),a=null==e?null:t(e);return f.ja([s,u,c,null==a?Lf():a,o])}function Ac(n,t){var r,i;return Vc(),Ff().fb(Jf((r=n,i=t,function(n){return n.gb([\"invisible-text\",\"tree-btn\"]),r.cd().wb_1===ps()&&(n.t9(\"collapsed\"),lr()),r.cd().wb_1===ms()&&(n.t9(\"expanded\"),lr()),n.s9(\"Click to \"+function(n){var t;switch(Vc(),n.q8_1){case 0:t=\"expand\";break;case 1:t=\"collapse\";break;default:le()}return t}(r.cd().wb_1)),n.u9(function(n,t){return function(r){return n(new ss(t))}}(i,r)),lr()})),Mc(n))}function Mc(n){return Vc(),function(n,t){var r;if(!(t>=0))throw fu(ie(\"Count 'n' must be non-negative, but was \"+t+\".\"));switch(t){case 0:r=\"\";break;case 1:r=ie(n);break;default:var i=\"\";if(0!==Wi(n))for(var e=ie(n),u=t;1&~u||(i+=e),0!=(u=u>>>1|0);)e+=e;return i}return r}(\"    \",n.we()-1|0)+\"- \"}function Fc(n){return Vc(),n.gb([\"invisible-text\",\"error-icon\"]),lr()}function Dc(n){return Vc(),n.gb([\"invisible-text\",\"advice-icon\"]),lr()}function Oc(n){return Vc(),n.gb([\"invisible-text\",\"warning-icon\"]),lr()}function Rc(n){return Vc(),n.gb([\"invisible-text\",\"enum-icon\"]),lr()}function Hc(n){return Vc(),new kc(n)}function $c(n){return Vc(),new kc(n)}function Gc(n){return Vc(),n.gb([\"invisible-text\",\"leaf-icon\"]),lr()}function Uc(n){return Vc(),n.t9(\"java-exception\"),lr()}function Vc(){if(!Sn){Sn=!0;var n=Ff();qn=n.fb(Jf(Fc),\"[error] \");var t=Ff();Bn=t.fb(Jf(Dc),\"[advice] \");var r=Ff();Cn=r.fb(Jf(Oc),\"[warn]  \");var i=Ff();xn=i.fb(Jf(Rc),\"[enum]  \"),jn=new Du,Pn=new Du(Hc),In=new Mu($c)}}return Ge(Yn,A,Re),Ge(tt,A,Re),Ge(rt,A,Re),Ge(Ti,\"Collection\",Ye),Ge(it,\"AbstractCollection\",Re,A,[Ti]),Ge(et,\"IteratorImpl\",Re),Ge(ut,\"ListIteratorImpl\",Re,et),Ge(ot,\"Companion\",Ke),Ge(Ei,\"List\",Ye,A,[Ti]),Ge(st,\"AbstractList\",Re,it,[it,Ei]),Ge(ct,A,Re),Ge(lt,\"Companion\",Ke),Ge(vt,A,Re,it),Ge(Ni,\"Map\",Ye),Ge(dt,\"AbstractMap\",Re,A,[Ni]),Ge(gt,\"Companion\",Ke),Ge(li,\"RandomAccess\",Ye),Ge(yt,\"EmptyList\",Ke,A,[Ei,li]),Ge(qt,\"ArrayAsCollection\",Re,A,[Ti]),Ge(Bt,\"EmptyIterator\",Ke),Ge(Pt,\"IntIterator\",Re),Ge(It,A,Re),Ge(St,\"ReversedListReadOnly\",Re,st),Ge(zt,A,Re),Ge(Et,\"TransformingSequence\",Re),Ge(Lt,A,Re),Ge(Nt,\"FilteringSequence\",Re),Ge(Mi,\"Set\",Ye,A,[Ti]),Ge(Mt,\"EmptySet\",Ke,A,[Mi]),Ge(Ot,\"Companion\",Ke),Ge(Vt,\"IntProgression\",Re),Ge(Ht,\"IntRange\",Re,Vt),Ge($t,\"IntProgressionIterator\",Re,Pt),Ge(Gt,\"Companion\",Ke),Ge(er,A,Re),Ge(ur,\"DelimitedRangesSequence\",Re),Ge(or,\"Pair\",Re),Ge(sr,\"CharSequence\",Ye),Ge(cr,\"Comparable\",Ye),Ge(ar,\"Number\",Re),Ge(hr,\"Unit\",Ke),Ge(_r,\"IntCompanionObject\",Ke),Ge(mr,\"AbstractMutableCollection\",Re,it,[it,Ti]),Ge(kr,\"IteratorImpl\",Re),Ge(yr,\"ListIteratorImpl\",Re,kr),Ge(qr,\"AbstractMutableList\",Re,mr,[mr,Ei,Ti]),Ge(Br,A,Re),Ge(Cr,A,Re),Ge(Li,\"Entry\",Ye),Ge(Ai,\"MutableEntry\",Ye,A,[Li]),Ge(xr,\"SimpleEntry\",Re,A,[Ai]),Ge(zr,\"AbstractMutableSet\",Re,mr,[mr,Ti,Mi]),Ge(jr,\"AbstractEntrySet\",Re,zr),Ge(Pr,A,Re,zr),Ge(Ir,A,Re,mr),Ge(Sr,\"AbstractMutableMap\",Re,dt,[dt,Ni]),Ge(Er,\"Companion\",Ke),Ge(Fr,\"ArrayList\",Re,qr,[qr,Ei,Ti,li]),Ge(Rr,\"HashCode\",Ke),Ge(Hr,\"EntrySet\",Re,jr),Ge(Vr,\"HashMap\",Re,Sr,[Sr,Ni]),Ge(Zr,\"HashSet\",Re,zr,[zr,Ti,Mi]),Ge(Xr,A,Re),Ge(ni,\"InternalMap\",Ye),Ge(Jr,\"InternalHashCodeMap\",Re,A,[ni]),Ge(ti,\"EntryIterator\",Re),Ge(ri,\"Companion\",Ke),Ge(ei,\"ChainEntry\",Re,xr),Ge(ui,\"EntrySet\",Re,jr),Ge(si,\"LinkedHashMap\",Re,Vr,[Vr,Ni]),Ge(ci,\"Companion\",Ke),Ge(hi,\"LinkedHashSet\",Re,Zr,[Zr,Ti,Mi]),Ge(_i,\"BaseOutput\",Re),Ge(vi,\"NodeJsOutput\",Re,_i),Ge(gi,\"BufferedOutput\",Re,_i),Ge(di,\"BufferedOutputToConsoleLog\",Re,gi),Ge(pi,\"StringBuilder\",Re,A,[sr]),Ge(yi,\"Companion\",Ke),Ge(Bi,\"Regex\",Re),Ge(Ii,\"Companion\",Ke),Ge(zi,\"Char\",Re,A,[cr]),Ge(Fi,\"Companion\",Ke),Ge(Di,\"Enum\",Re,A,[cr]),Ge(Hi,A,Re),Ge(ve,\"Companion\",Ke),Ge(de,\"Long\",Re,ar,[ar,cr]),Ge(iu,\"Letter\",Ke),Ge(uu,\"OtherLowercase\",Ke),Ge(du,\"Exception\",Re,Error),Ge(bu,\"RuntimeException\",Re,du),Ge(su,\"IllegalArgumentException\",Re,bu),Ge(au,\"IndexOutOfBoundsException\",Re,bu),Ge(lu,\"IllegalStateException\",Re,bu),Ge(ku,\"NoSuchElementException\",Re,bu),Ge(qu,\"ArithmeticException\",Re,bu),Ge(xu,\"UnsupportedOperationException\",Re,bu),Ge(Pu,\"NullPointerException\",Re,bu),Ge(Su,\"NoWhenBranchMatchedException\",Re,bu),Ge(Eu,\"ClassCastException\",Re,bu),Ge(Lu,\"UninitializedPropertyAccessException\",Re,bu),Ge(Au,\"Model\",Re),Ge(Mu,\"CopyButtonComponent\",Re),Ge(Du,\"PrettyTextComponent\",Re),Ge(Yu,\"ProblemNode\",Re),Ge(Ou,\"Exception\",Re,Yu),Ge(Ru,\"StackTracePart\",Re),Ge(Hu,\"Error\",Re,Yu),Ge($u,\"Warning\",Re,Yu),Ge(Gu,\"Message\",Re,Yu),Ge(Uu,\"ListElement\",Re,Yu),Ge(Vu,\"TreeNode\",Re,Yu),Ge(Qu,\"Link\",Re,Yu),Ge(Zu,\"Label\",Re,Yu),Ge(io,\"Info\",Re,Yu),Ge(eo,\"Project\",Re,Yu),Ge(uo,\"Task\",Re,Yu),Ge(oo,\"TaskPath\",Re,Yu),Ge(fo,\"Bean\",Re,Yu),Ge(so,\"SystemProperty\",Re,Yu),Ge(co,\"Property\",Re,Yu),Ge(ao,\"BuildLogic\",Re,Yu),Ge(ho,\"BuildLogicClass\",Re,Yu),Ge(Bc,\"BaseIntent\",Re),Ge(yc,\"TreeIntent\",Re,Bc),Ge(vo,\"TaskTreeIntent\",Re,yc),Ge(go,\"MessageTreeIntent\",Re,yc),Ge(wo,\"InputTreeIntent\",Re,yc),Ge(bo,\"IncompatibleTaskTreeIntent\",Re,yc),Ge(yo,\"Intent\",Re,Bc),Ge(po,\"SetTab\",Re,yo),Ge(mo,\"Model\",Re),Ge(ko,\"Tab\",Re,Di),Ge(Uo,\"ConfigurationCacheReportPage\",Ke),Ge(Zo,\"ImportedProblem\",Re),Ge(Yo,\"ImportedDiagnostics\",Re),Ge(ff,\"sam$kotlin_Comparator$0\",Re),Ge(bf,\"LearnMore\",Re),Ge(kf,\"Fragment\",Re),Ge(pf,\"Text\",Re,kf),Ge(mf,\"Reference\",Re,kf),Ge(yf,\"Builder\",Re),Ge(qf,\"Companion\",Ke),Ge(Cf,\"PrettyText\",Re),Ge(xf,\"Companion\",Ke),Ge(Sf,\"Trie\",Re),Ge(Uf,\"ViewFactory\",Re),Ge(Vf,\"Companion\",Ke),Ge(Xf,\"View\",Re),Ge(Zf,\"Empty\",Ke,Xf),Ge(Wf,\"Element\",Re,Xf),Ge(Kf,\"MappedView\",Re,Xf),Ge(ns,\"Attributes\",Re),Ge(es,\"Attribute\",Re),Ge(ts,\"OnEvent\",Re,es),Ge(rs,\"ClassName\",Re,es),Ge(is,\"Named\",Re,es),Ge(as,\"Intent\",Re),Ge(ss,\"Toggle\",Re,as),Ge(cs,\"Model\",Re),Ge(ls,\"TreeView\",Ke),Ge(bs,\"Focus\",Re),Ge(ds,\"Original\",Re,bs),Ge(gs,\"Child\",Re,bs),Ge(ws,\"ViewState\",Re,Di),Ge(ks,\"Tree\",Re),Ge(Bs,\"Tab\",Re,Di),Ge(Cs,\"ProblemIdElement\",Re),Ge(xs,\"ProblemSummary\",Re),Ge(Is,\"ProblemNodeGroup\",Re),Ge(Zs,\"ProblemApiNode\",Re,Yu),Ge(Us,\"Text\",Re,Zs),Ge(Vs,\"ProblemIdNode\",Re,Zs),Ge(Qs,\"Advice\",Re,Yu),Ge(Ys,\"MessageTreeIntent\",Re,yc),Ge(Ws,\"ProblemIdTreeIntent\",Re,yc),Ge(Ks,\"FileLocationTreeIntent\",Re,yc),Ge(nc,\"Intent\",Re,Bc),Ge(Xs,\"SetTab\",Re,nc),Ge(Js,\"Model\",Re),Ge(bc,\"ProblemsReportPage\",Ke),Ge(kc,\"Copy\",Re,Bc),Ge(qc,\"ToggleStackTracePart\",Re,Bc),se(Yn).f=function(){return this.n_1.f()},se(tt).f=function(){return this.r_1.f()},se(rt).f=function(){var n,t,r=function(n,t){for(var r=n.f();r.g();){var i=r.h();t.d(i)}return t}(this.s_1,Lr());return n=r,t=this.t_1,function(n,t){if(n.k()<=1)return lr();var r=br(n);!function(n,t){if(function(){if(null!=l)return l;l=!1;var n=[],t=0;if(t<600)do{var r=t;t=t+1|0,n.push(r)}while(t<600);var i=Or;n.sort(i);var e=1,u=n.length;if(e<u)do{var o=e;e=e+1|0;var f=n[o-1|0],s=n[o];if((3&f)==(3&s)&&f>=s)return!1}while(e<u);return l=!0,!0}()){var r=(i=t,function(n,t){return i.compare(n,t)});n.sort(r)}else!function(n,t,r,i){var e=n.length,u=function(n){var t=0,r=n.length-1|0;if(t<=r)do{var i=t;t=t+1|0,n[i]=null}while(i!==r);return n}(Array(e)),o=Dr(n,u,0,r,i);if(o!==n){var f=0;if(f<=r)do{var s=f;f=f+1|0,n[s]=o[s]}while(s!==r)}}(n,0,Nn(n),t);var i}(r,t);var i=0,e=r.length;if(i<e)do{var u=i;i=i+1|0,n.f4(u,r[u])}while(i<e)}(n,t),r.f()},se(it).u=function(n){var t;n:if(Ue(this,Ti)&&this.i())t=!1;else{for(var r=this.f();r.g();)if(oe(r.h(),n)){t=!0;break n}t=!1}return t},se(it).v=function(n){var t;n:if(Ue(n,Ti)&&n.i())t=!0;else{for(var r=n.f();r.g();){var i=r.h();if(!this.u(i)){t=!1;break n}}t=!0}return t},se(it).i=function(){return 0===this.k()},se(it).toString=function(){return Mn(this,\", \",\"[\",\"]\",A,A,(n=this,function(t){return t===n?\"(this Collection)\":Oi(t)}));var n},se(it).toArray=function(){return dr(this)},se(et).g=function(){return this.w_1<this.x_1.k()},se(et).h=function(){if(!this.g())throw pu();var n=this.w_1;return this.w_1=n+1|0,this.x_1.j(n)},se(ut).c1=function(){return this.w_1>0},se(ut).d1=function(){if(!this.c1())throw pu();return this.w_1=this.w_1-1|0,this.a1_1.j(this.w_1)},se(ot).e1=function(n,t){if(n<0||n>=t)throw cu(\"index: \"+n+\", size: \"+t)},se(ot).b1=function(n,t){if(n<0||n>t)throw cu(\"index: \"+n+\", size: \"+t)},se(ot).f1=function(n){for(var t=1,r=n.f();r.g();){var i=r.h(),e=zn(31,t),u=null==i?null:ee(i);t=e+(null==u?0:u)|0}return t},se(ot).g1=function(n,t){if(n.k()!==t.k())return!1;for(var r=t.f(),i=n.f();i.g();)if(!oe(i.h(),r.h()))return!1;return!0},se(st).f=function(){return new et(this)},se(st).l=function(n){return new ut(this,n)},se(st).equals=function(n){return n===this||!(null==n||!Ue(n,Ei))&&ft().g1(this,n)},se(st).hashCode=function(){return ft().f1(this)},se(ct).g=function(){return this.h1_1.g()},se(ct).h=function(){return this.h1_1.h().i1()},se(lt).k1=function(n){var t=n.j1(),r=null==t?null:ee(t),i=null==r?0:r,e=n.i1(),u=null==e?null:ee(e);return i^(null==u?0:u)},se(lt).l1=function(n){return Oi(n.j1())+\"=\"+Oi(n.i1())},se(lt).m1=function(n,t){return!(null==t||!Ue(t,Li))&&!!oe(n.j1(),t.j1())&&oe(n.i1(),t.i1())},se(vt).r1=function(n){return this.q1_1.s1(n)},se(vt).u=function(n){return!(null!=n&&!Qe(n))&&this.r1(null==n||Qe(n)?n:_e())},se(vt).f=function(){return new ct(this.q1_1.o().f())},se(vt).k=function(){return this.q1_1.k()},se(dt).t1=function(n){return!(null==ht(this,n))},se(dt).s1=function(n){var t;n:{var r=this.o();if(Ue(r,Ti)&&r.i())t=!1;else{for(var i=r.f();i.g();)if(oe(i.h().i1(),n)){t=!0;break n}t=!1}}return t},se(dt).u1=function(n){if(null==n||!Ue(n,Li))return!1;var t=n.j1(),r=n.i1(),i=(Ue(this,Ni)?this:_e()).v1(t);return!(!oe(r,i)||null==i&&!(Ue(this,Ni)?this:_e()).t1(t))},se(dt).equals=function(n){if(n===this)return!0;if(null==n||!Ue(n,Ni))return!1;if(this.k()!==n.k())return!1;var t;n:{var r=n.o();if(Ue(r,Ti)&&r.i())t=!0;else{for(var i=r.f();i.g();){var e=i.h();if(!this.u1(e)){t=!1;break n}}t=!0}}return t},se(dt).v1=function(n){var t=ht(this,n);return null==t?null:t.i1()},se(dt).hashCode=function(){return ee(this.o())},se(dt).i=function(){return 0===this.k()},se(dt).k=function(){return this.o().k()},se(dt).toString=function(){var n;return Mn(this.o(),\", \",\"{\",\"}\",A,A,(n=this,function(t){return n.p1(t)}))},se(dt).p1=function(n){return at(this,n.j1())+\"=\"+at(this,n.i1())},se(dt).w1=function(){return null==this.o1_1&&(this.o1_1=new vt(this)),he(this.o1_1)},se(gt).x1=function(n){for(var t=0,r=n.f();r.g();){var i=r.h(),e=t,u=null==i?null:ee(i);t=e+(null==u?0:u)|0}return t},se(gt).y1=function(n,t){return n.k()===t.k()&&n.v(t)},se(yt).equals=function(n){return!(null==n||!Ue(n,Ei))&&n.i()},se(yt).hashCode=function(){return 1},se(yt).toString=function(){return\"[]\"},se(yt).k=function(){return 0},se(yt).i=function(){return!0},se(yt).a2=function(n){return n.i()},se(yt).v=function(n){return this.a2(n)},se(yt).j=function(n){throw cu(\"Empty list doesn't contain element at index \"+n+\".\")},se(yt).f=function(){return Ct()},se(yt).l=function(n){if(0!==n)throw cu(\"Index: \"+n);return Ct()},se(qt).k=function(){return this.b2_1.length},se(qt).i=function(){return 0===this.b2_1.length},se(qt).d2=function(n){return function(n,t){return An(n,t)>=0}(this.b2_1,n)},se(qt).e2=function(n){var t;n:if(Ue(n,Ti)&&n.i())t=!0;else{for(var r=n.f();r.g();){var i=r.h();if(!this.d2(i)){t=!1;break n}}t=!0}return t},se(qt).v=function(n){return this.e2(n)},se(qt).f=function(){return Ri(this.b2_1)},se(Bt).g=function(){return!1},se(Bt).c1=function(){return!1},se(Bt).h=function(){throw pu()},se(Bt).d1=function(){throw pu()},se(Pt).h=function(){return this.f2()},se(It).g=function(){return this.g2_1.c1()},se(It).c1=function(){return this.g2_1.g()},se(It).h=function(){return this.g2_1.d1()},se(It).d1=function(){return this.g2_1.h()},se(St).k=function(){return this.i2_1.k()},se(St).j=function(n){return this.i2_1.j(function(n,t){if(!(0<=t&&t<=kt(n)))throw cu(\"Element index \"+t+\" must be in range [\"+Oe(0,kt(n))+\"].\");return kt(n)-t|0}(this,n))},se(St).f=function(){return this.l(0)},se(St).l=function(n){return new It(this,n)},se(zt).h=function(){return this.k2_1.m2_1(this.j2_1.h())},se(zt).g=function(){return this.j2_1.g()},se(Et).f=function(){return new zt(this)},se(Lt).h=function(){if(-1===this.o2_1&&Tt(this),0===this.o2_1)throw pu();var n=this.p2_1;return this.p2_1=null,this.o2_1=-1,null==n||Qe(n)?n:_e()},se(Lt).g=function(){return-1===this.o2_1&&Tt(this),1===this.o2_1},se(Nt).f=function(){return new Lt(this)},se(Mt).equals=function(n){return!(null==n||!Ue(n,Mi))&&n.i()},se(Mt).hashCode=function(){return 0},se(Mt).toString=function(){return\"[]\"},se(Mt).k=function(){return 0},se(Mt).i=function(){return!0},se(Mt).a2=function(n){return n.i()},se(Mt).v=function(n){return this.a2(n)},se(Mt).f=function(){return Ct()},se(Ht).y2=function(){return this.z2_1},se(Ht).c3=function(){return this.a3_1},se(Ht).i=function(){return this.z2_1>this.a3_1},se(Ht).equals=function(n){return n instanceof Ht&&(!(!this.i()||!n.i())||this.z2_1===n.z2_1&&this.a3_1===n.a3_1)},se(Ht).hashCode=function(){return this.i()?-1:zn(31,this.z2_1)+this.a3_1|0},se(Ht).toString=function(){return this.z2_1+\"..\"+this.a3_1},se($t).g=function(){return this.f3_1},se($t).f2=function(){var n=this.g3_1;if(n===this.e3_1){if(!this.f3_1)throw pu();this.f3_1=!1}else this.g3_1=this.g3_1+this.d3_1|0;return n},se(Gt).q=function(n,t,r){return new Vt(n,t,r)},se(Vt).f=function(){return new $t(this.z2_1,this.a3_1,this.b3_1)},se(Vt).i=function(){return this.b3_1>0?this.z2_1>this.a3_1:this.z2_1<this.a3_1},se(Vt).equals=function(n){return n instanceof Vt&&(!(!this.i()||!n.i())||this.z2_1===n.z2_1&&this.a3_1===n.a3_1&&this.b3_1===n.b3_1)},se(Vt).hashCode=function(){return this.i()?-1:zn(31,zn(31,this.z2_1)+this.a3_1|0)+this.b3_1|0},se(Vt).toString=function(){return this.b3_1>0?this.z2_1+\"..\"+this.a3_1+\" step \"+this.b3_1:this.z2_1+\" downTo \"+this.a3_1+\" step \"+(0|-this.b3_1)},se(er).h=function(){if(-1===this.j3_1&&ir(this),0===this.j3_1)throw pu();var n=this.m3_1,t=n instanceof Ht?n:_e();return this.m3_1=null,this.j3_1=-1,t},se(er).g=function(){return-1===this.j3_1&&ir(this),1===this.j3_1},se(ur).f=function(){return new er(this)},se(or).toString=function(){return\"(\"+this.t3_1+\", \"+this.u3_1+\")\"},se(or).v3=function(){return this.t3_1},se(or).w3=function(){return this.u3_1},se(or).hashCode=function(){var n=null==this.t3_1?0:ee(this.t3_1);return zn(n,31)+(null==this.u3_1?0:ee(this.u3_1))|0},se(or).equals=function(n){if(this===n)return!0;if(!(n instanceof or))return!1;var t=n instanceof or?n:_e();return!!oe(this.t3_1,t.t3_1)&&!!oe(this.u3_1,t.u3_1)},se(hr).toString=function(){return\"kotlin.Unit\"},se(_r).b4=function(){return this.MIN_VALUE},se(_r).c4=function(){return this.MAX_VALUE},se(_r).d4=function(){return this.SIZE_BYTES},se(_r).e4=function(){return this.SIZE_BITS},se(mr).m=function(n){this.g4();for(var t=!1,r=n.f();r.g();){var i=r.h();this.d(i)&&(t=!0)}return t},se(mr).toJSON=function(){return this.toArray()},se(mr).g4=function(){},se(kr).g=function(){return this.h4_1<this.j4_1.k()},se(kr).h=function(){if(!this.g())throw pu();var n=this.h4_1;return this.h4_1=n+1|0,this.i4_1=n,this.j4_1.j(this.i4_1)},se(yr).c1=function(){return this.h4_1>0},se(yr).d1=function(){if(!this.c1())throw pu();return this.h4_1=this.h4_1-1|0,this.i4_1=this.h4_1,this.n4_1.j(this.i4_1)},se(qr).d=function(n){return this.g4(),this.p4(this.k(),n),!0},se(qr).f=function(){return new kr(this)},se(qr).u=function(n){return this.q4(n)>=0},se(qr).q4=function(n){var t=0,r=kt(this);if(t<=r)do{var i=t;if(t=t+1|0,oe(this.j(i),n))return i}while(i!==r);return-1},se(qr).l=function(n){return new yr(this,n)},se(qr).equals=function(n){return n===this||!(null==n||!Ue(n,Ei))&&ft().g1(this,n)},se(qr).hashCode=function(){return ft().f1(this)},se(Br).g=function(){return this.r4_1.g()},se(Br).h=function(){return this.r4_1.h().j1()},se(Cr).g=function(){return this.s4_1.g()},se(Cr).h=function(){return this.s4_1.h().i1()},se(xr).j1=function(){return this.t4_1},se(xr).i1=function(){return this.u4_1},se(xr).v4=function(n){var t=this.u4_1;return this.u4_1=n,t},se(xr).hashCode=function(){return _t().k1(this)},se(xr).toString=function(){return _t().l1(this)},se(xr).equals=function(n){return _t().m1(this,n)},se(jr).u=function(n){return this.w4(n)},se(Pr).y4=function(n){throw Cu(\"Add is not supported on keys\")},se(Pr).d=function(n){return this.y4(null==n||Qe(n)?n:_e())},se(Pr).z4=function(n){return this.x4_1.t1(n)},se(Pr).u=function(n){return!(null!=n&&!Qe(n))&&this.z4(null==n||Qe(n)?n:_e())},se(Pr).f=function(){return new Br(this.x4_1.o().f())},se(Pr).k=function(){return this.x4_1.k()},se(Pr).g4=function(){return this.x4_1.g4()},se(Ir).f5=function(n){throw Cu(\"Add is not supported on values\")},se(Ir).d=function(n){return this.f5(null==n||Qe(n)?n:_e())},se(Ir).r1=function(n){return this.e5_1.s1(n)},se(Ir).u=function(n){return!(null!=n&&!Qe(n))&&this.r1(null==n||Qe(n)?n:_e())},se(Ir).f=function(){return new Cr(this.e5_1.o().f())},se(Ir).k=function(){return this.e5_1.k()},se(Ir).g4=function(){return this.e5_1.g4()},se(Sr).g5=function(){return null==this.c5_1&&(this.c5_1=new Pr(this)),he(this.c5_1)},se(Sr).w1=function(){return null==this.d5_1&&(this.d5_1=new Ir(this)),he(this.d5_1)},se(Sr).g4=function(){},se(zr).equals=function(n){return n===this||!(null==n||!Ue(n,Mi))&&wt().y1(this,n)},se(zr).hashCode=function(){return wt().x1(this)},se(Fr).j5=function(){return this.g4(),this.c_1=!0,this.k()>0?this:Tr().i5_1},se(Fr).k=function(){return this.b_1.length},se(Fr).j=function(n){var t=this.b_1[Mr(this,n)];return null==t||Qe(t)?t:_e()},se(Fr).f4=function(n,t){this.g4(),Mr(this,n);var r=this.b_1[n];this.b_1[n]=t;var i=r;return null==i||Qe(i)?i:_e()},se(Fr).d=function(n){return this.g4(),this.b_1.push(n),this.o4_1=this.o4_1+1|0,!0},se(Fr).p4=function(n,t){this.g4(),this.b_1.splice(function(n,t){return ft().b1(t,n.k()),t}(this,n),0,t),this.o4_1=this.o4_1+1|0},se(Fr).m=function(n){if(this.g4(),n.i())return!1;for(var t,r,i,e=(t=this,r=n.k(),i=t.k(),t.b_1.length=t.k()+r|0,i),u=0,o=n.f();o.g();){var f=o.h(),s=u;u=s+1|0;var c=wr(s);this.b_1[e+c|0]=f}return this.o4_1=this.o4_1+1|0,!0},se(Fr).q4=function(n){return An(this.b_1,n)},se(Fr).toString=function(){return Ln(this.b_1,\", \",\"[\",\"]\",A,A,Xi)},se(Fr).k5=function(){return[].slice.call(this.b_1)},se(Fr).toArray=function(){return this.k5()},se(Fr).g4=function(){if(this.c_1)throw Bu()},se(Rr).l5=function(n,t){return oe(n,t)},se(Rr).m5=function(n){var t=null==n?null:ee(n);return null==t?0:t},se(Hr).o5=function(n){throw Cu(\"Add is not supported on entries\")},se(Hr).d=function(n){return this.o5(null!=n&&Ue(n,Ai)?n:_e())},se(Hr).w4=function(n){return this.n5_1.u1(n)},se(Hr).f=function(){return this.n5_1.t5_1.f()},se(Hr).k=function(){return this.n5_1.k()},se(Vr).t1=function(n){return this.t5_1.z4(n)},se(Vr).s1=function(n){var t;n:{var r=this.t5_1;if(Ue(r,Ti)&&r.i())t=!1;else{for(var i=r.f();i.g();){var e=i.h();if(this.u5_1.l5(e.i1(),n)){t=!0;break n}}t=!1}}return t},se(Vr).o=function(){return null==this.v5_1&&(this.v5_1=this.x5()),he(this.v5_1)},se(Vr).x5=function(){return new Hr(this)},se(Vr).v1=function(n){return this.t5_1.v1(n)},se(Vr).h5=function(n,t){return this.t5_1.h5(n,t)},se(Vr).k=function(){return this.t5_1.k()},se(Zr).d=function(n){return null==this.y5_1.h5(n,this)},se(Zr).u=function(n){return this.y5_1.t1(n)},se(Zr).i=function(){return this.y5_1.i()},se(Zr).f=function(){return this.y5_1.g5().f()},se(Zr).k=function(){return this.y5_1.k()},se(Xr).g=function(){return-1===this.z5_1&&(this.z5_1=function(n){if(null!=n.c6_1&&n.d6_1){var t=n.c6_1.length;if(n.e6_1=n.e6_1+1|0,n.e6_1<t)return 0}if(n.b6_1=n.b6_1+1|0,n.b6_1<n.a6_1.length){n.c6_1=n.g6_1.i6_1[n.a6_1[n.b6_1]];var r=n,i=n.c6_1;return r.d6_1=null!=i&&Ve(i),n.e6_1=0,0}return n.c6_1=null,1}(this)),0===this.z5_1},se(Xr).h=function(){if(!this.g())throw pu();var n=this.d6_1?this.c6_1[this.e6_1]:this.c6_1;return this.f6_1=n,this.z5_1=-1,n},se(Jr).w5=function(){return this.h6_1},se(Jr).k=function(){return this.j6_1},se(Jr).h5=function(n,t){var r=this.h6_1.m5(n),i=Kr(this,r);if(null==i)this.i6_1[r]=new xr(n,t);else{if(null==i||!Ve(i)){var e,u=i;return this.h6_1.l5(u.j1(),n)?u.v4(t):(e=[u,new xr(n,t)],this.i6_1[r]=e,this.j6_1=this.j6_1+1|0,null)}var o=i,f=Wr(o,this,n);if(null!=f)return f.v4(t);o.push(new xr(n,t))}return this.j6_1=this.j6_1+1|0,null},se(Jr).z4=function(n){return!(null==Yr(this,n))},se(Jr).v1=function(n){var t=Yr(this,n);return null==t?null:t.i1()},se(Jr).f=function(){return new Xr(this)},se(ti).g=function(){return!(null===this.m6_1)},se(ti).h=function(){if(!this.g())throw pu();var n=he(this.m6_1);this.l6_1=n;var t,r=n.b7_1;return t=r!==this.n6_1.y6_1.v6_1?r:null,this.m6_1=t,n},se(ei).v4=function(n){return this.d7_1.g4(),se(xr).v4.call(this,n)},se(ui).o5=function(n){throw Cu(\"Add is not supported on entries\")},se(ui).d=function(n){return this.o5(null!=n&&Ue(n,Ai)?n:_e())},se(ui).w4=function(n){return this.y6_1.u1(n)},se(ui).f=function(){return new ti(this)},se(ui).k=function(){return this.y6_1.k()},se(ui).g4=function(){return this.y6_1.g4()},se(si).j5=function(){var n;if(this.g4(),this.x6_1=!0,this.k()>0)n=this;else{var t=ii().e7_1;n=Ue(t,Ni)?t:_e()}return n},se(si).t1=function(n){return this.w6_1.t1(n)},se(si).s1=function(n){var t=this.v6_1;if(null==t)return!1;var r=t;do{if(oe(r.i1(),n))return!0;r=he(r.b7_1)}while(r!==this.v6_1);return!1},se(si).x5=function(){return new ui(this)},se(si).v1=function(n){var t=this.w6_1.v1(n);return null==t?null:t.i1()},se(si).h5=function(n,t){this.g4();var r=this.w6_1.v1(n);if(null==r){var i=new ei(this,n,t);return this.w6_1.h5(n,i),function(n,t){if(null!=n.b7_1||null!=n.c7_1)throw hu(ie(\"Check failed.\"));var r=t.v6_1;if(null==r)t.v6_1=n,n.b7_1=n,n.c7_1=n;else{var i=r.c7_1;if(null==i)throw hu(ie(\"Required value was null.\"));var e=i;n.c7_1=e,n.b7_1=r,r.c7_1=n,e.b7_1=n}}(i,this),null}return r.v4(t)},se(si).k=function(){return this.w6_1.k()},se(si).g4=function(){if(this.x6_1)throw Bu()},se(hi).g4=function(){return this.y5_1.g4()},se(_i).h7=function(){this.i7(\"\\n\")},se(_i).j7=function(n){this.i7(n),this.h7()},se(vi).i7=function(n){var t=String(n);this.k7_1.write(t)},se(di).i7=function(n){var t=String(n),r=t.lastIndexOf(\"\\n\",0);if(r>=0){var i=this.m7_1;this.m7_1=i+t.substring(0,r),this.n7();var e=r+1|0;t=t.substring(e)}this.m7_1=this.m7_1+t},se(di).n7=function(){console.log(this.m7_1),this.m7_1=\"\"},se(gi).i7=function(n){var t=this.m7_1;this.m7_1=t+String(n)},se(pi).x3=function(){return this.o7_1.length},se(pi).y3=function(n){var t=this.o7_1;if(!(n>=0&&n<=Yt(t)))throw cu(\"index: \"+n+\", length: \"+this.x3()+\"}\");return Zi(t,n)},se(pi).z3=function(n,t){return this.o7_1.substring(n,t)},se(pi).i3=function(n){return this.o7_1=this.o7_1+new zi(n),this},se(pi).e=function(n){return this.o7_1=this.o7_1+Oi(n),this},se(pi).p7=function(n){var t=this.o7_1;return this.o7_1=t+(null==n?\"null\":n),this},se(pi).toString=function(){return this.o7_1},se(yi).t7=function(n){var t=this.q7_1;return n.replace(t,\"\\\\$&\")},se(yi).u7=function(n){var t=this.s7_1;return n.replace(t,\"$$$$\")},se(Bi).a8=function(n){this.x7_1.lastIndex=0;var t=this.x7_1.exec(ie(n));return null!=t&&0===t.index&&this.x7_1.lastIndex===Wi(n)},se(Bi).toString=function(){return this.x7_1.toString()},se(zi).o8=function(n){return ji(this.h3_1,n)},se(zi).a4=function(n){return function(n,t){return ji(n.h3_1,t instanceof zi?t.h3_1:_e())}(this,n)},se(zi).equals=function(n){return function(n,t){return t instanceof zi&&n===t.h3_1}(this.h3_1,n)},se(zi).hashCode=function(){return this.h3_1},se(zi).toString=function(){return Pi(this.h3_1)},se(Di).r8=function(n){return Ji(this.q8_1,n.q8_1)},se(Di).a4=function(n){return this.r8(n instanceof Di?n:_e())},se(Di).equals=function(n){return this===n},se(Di).hashCode=function(){return re(this)},se(Di).toString=function(){return this.p8_1},se(Hi).g=function(){return!(this.s8_1===this.t8_1.length)},se(Hi).h=function(){if(this.s8_1===this.t8_1.length)throw mu(\"\"+this.s8_1);var n=this.s8_1;return this.s8_1=n+1|0,this.t8_1[n]},se(de).b9=function(n){return ke(this,n)},se(de).a4=function(n){return this.b9(n instanceof de?n:_e())},se(de).c9=function(n){return ye(this,n)},se(de).d9=function(n){return function(n,t){if(Me(),Se(t))throw vu(\"division by zero\");if(Se(n))return ge();if(xe(n,pe())){if(xe(t,we())||xe(t,be()))return pe();if(xe(t,pe()))return we();var r=function(n){Me();return new de(n.u8_1>>>1|n.v8_1<<31,n.v8_1>>1)}(n),i=function(n){Me();return new de(n.u8_1<<1,n.v8_1<<1|n.u8_1>>>31)}(r.d9(t));return xe(i,ge())?Ie(t)?we():be():ye(i,qe(n,Be(t,i)).d9(t))}if(xe(t,pe()))return ge();if(Ie(n))return Ie(t)?Ee(n).d9(Ee(t)):Ee(Ee(n).d9(t));if(Ie(t))return Ee(n.d9(Ee(t)));for(var e=ge(),u=n;Ae(u,t);){for(var o=Ce(u)/Ce(t),f=Math.max(1,Math.floor(o)),s=Math.ceil(Math.log(f)/Math.LN2),c=s<=48?1:Math.pow(2,s-48),a=Le(f),h=Be(a,t);Ie(h)||Ne(h,u);)h=Be(a=Le(f-=c),t);Se(a)&&(a=we()),e=ye(e,a),u=qe(u,h)}return e}(this,n)},se(de).e9=function(){return this.f9().c9(new de(1,0))},se(de).f9=function(){return new de(~this.u8_1,~this.v8_1)},se(de).g9=function(){return this.u8_1},se(de).w8=function(){return Ce(this)},se(de).valueOf=function(){return this.w8()},se(de).equals=function(n){return n instanceof de&&xe(this,n)},se(de).hashCode=function(){return Me(),this.u8_1^this.v8_1},se(de).toString=function(){return je(this,10)},se(Au).toString=function(){return\"Model(text=\"+this.o9_1+\", tooltip=\"+this.p9_1+\")\"},se(Au).hashCode=function(){var n=ue(this.o9_1);return zn(n,31)+ue(this.p9_1)|0},se(Au).equals=function(n){if(this===n)return!0;if(!(n instanceof Au))return!1;var t=n instanceof Au?n:_e();return this.o9_1===t.o9_1&&this.p9_1===t.p9_1},se(Mu).v9=function(n,t){return this.w9(new Au(n,t))},se(Mu).w9=function(n){var t,r;return Df().y9(Jf((t=n,r=this,function(n){return n.s9(t.p9_1),n.t9(\"copy-button\"),n.u9(function(n,t){return function(r){return n.q9_1(t.o9_1)}}(r,t)),lr()})),[])},se(Mu).z9=function(n){return this.w9(n instanceof Au?n:_e())},se(Mu).aa=function(n,t){return t},se(Mu).ba=function(n,t){var r=null==n||Qe(n)?n:_e();return this.aa(r,t instanceof Au?t:_e())},se(Du).ka=function(n){return function(n,t){for(var r=Ff(),i=t.ca_1,e=Nr(xt(i,10)),u=i.f();u.g();){var o,f,s=u.h();s instanceof pf?f=Ff().ga(s.fa_1):s instanceof mf?f=Fu(n,s.da_1,s.ea_1):le(),o=f,e.d(o)}return r.ha(e)}(this,n)},se(Du).z9=function(n){return this.ka(n instanceof Cf?n:_e())},se(Du).la=function(n,t){return t},se(Du).ba=function(n,t){var r=null==n||Qe(n)?n:_e();return this.la(r,t instanceof Cf?t:_e())},se(Ou).pa=function(n,t,r){return new Ou(n,t,r)},se(Ou).qa=function(n,t,r,i){return n=n===A?this.ma_1:n,t=t===A?this.na_1:t,r=r===A?this.oa_1:r,i===A?this.pa(n,t,r):i.pa.call(this,n,t,r)},se(Ou).toString=function(){return\"Exception(summary=\"+this.ma_1+\", fullText=\"+this.na_1+\", parts=\"+this.oa_1+\")\"},se(Ou).hashCode=function(){var n=null==this.ma_1?0:this.ma_1.hashCode();return n=zn(n,31)+ue(this.na_1)|0,zn(n,31)+ee(this.oa_1)|0},se(Ou).equals=function(n){if(this===n)return!0;if(!(n instanceof Ou))return!1;var t=n instanceof Ou?n:_e();return!!oe(this.ma_1,t.ma_1)&&this.na_1===t.na_1&&!!oe(this.oa_1,t.oa_1)},se(Ru).ta=function(n,t){return new Ru(n,t)},se(Ru).ua=function(n,t,r){return n=n===A?this.ra_1:n,t=t===A?this.sa_1:t,r===A?this.ta(n,t):r.ta.call(this,n,t)},se(Ru).toString=function(){return\"StackTracePart(lines=\"+this.ra_1+\", state=\"+this.sa_1+\")\"},se(Ru).hashCode=function(){var n=ee(this.ra_1);return zn(n,31)+(null==this.sa_1?0:this.sa_1.hashCode())|0},se(Ru).equals=function(n){if(this===n)return!0;if(!(n instanceof Ru))return!1;var t=n instanceof Ru?n:_e();return!!oe(this.ra_1,t.ra_1)&&!!oe(this.sa_1,t.sa_1)},se(Hu).toString=function(){return\"Error(label=\"+this.va_1+\", docLink=\"+this.wa_1+\")\"},se(Hu).hashCode=function(){var n=ee(this.va_1);return zn(n,31)+(null==this.wa_1?0:ee(this.wa_1))|0},se(Hu).equals=function(n){if(this===n)return!0;if(!(n instanceof Hu))return!1;var t=n instanceof Hu?n:_e();return!!oe(this.va_1,t.va_1)&&!!oe(this.wa_1,t.wa_1)},se($u).toString=function(){return\"Warning(label=\"+this.xa_1+\", docLink=\"+this.ya_1+\")\"},se($u).hashCode=function(){var n=ee(this.xa_1);return zn(n,31)+(null==this.ya_1?0:ee(this.ya_1))|0},se($u).equals=function(n){if(this===n)return!0;if(!(n instanceof $u))return!1;var t=n instanceof $u?n:_e();return!!oe(this.xa_1,t.xa_1)&&!!oe(this.ya_1,t.ya_1)},se(Gu).toString=function(){return\"Message(prettyText=\"+this.za_1+\")\"},se(Gu).hashCode=function(){return this.za_1.hashCode()},se(Gu).equals=function(n){if(this===n)return!0;if(!(n instanceof Gu))return!1;var t=n instanceof Gu?n:_e();return!!this.za_1.equals(t.za_1)},se(Uu).toString=function(){return\"ListElement(prettyText=\"+this.ab_1+\")\"},se(Uu).hashCode=function(){return this.ab_1.hashCode()},se(Uu).equals=function(n){if(this===n)return!0;if(!(n instanceof Uu))return!1;var t=n instanceof Uu?n:_e();return!!this.ab_1.equals(t.ab_1)},se(Vu).toString=function(){return\"TreeNode(prettyText=\"+this.bb_1+\")\"},se(Vu).hashCode=function(){return this.bb_1.hashCode()},se(Vu).equals=function(n){if(this===n)return!0;if(!(n instanceof Vu))return!1;var t=n instanceof Vu?n:_e();return!!this.bb_1.equals(t.bb_1)},se(Qu).toString=function(){return\"Link(href=\"+this.cb_1+\", label=\"+this.db_1+\")\"},se(Qu).hashCode=function(){var n=ue(this.cb_1);return zn(n,31)+ue(this.db_1)|0},se(Qu).equals=function(n){if(this===n)return!0;if(!(n instanceof Qu))return!1;var t=n instanceof Qu?n:_e();return this.cb_1===t.cb_1&&this.db_1===t.db_1},se(Zu).toString=function(){return\"Label(text=\"+this.eb_1+\")\"},se(Zu).hashCode=function(){return ue(this.eb_1)},se(Zu).equals=function(n){if(this===n)return!0;if(!(n instanceof Zu))return!1;var t=n instanceof Zu?n:_e();return this.eb_1===t.eb_1},se(io).toString=function(){return\"Info(label=\"+this.hb_1+\", docLink=\"+this.ib_1+\")\"},se(io).hashCode=function(){var n=ee(this.hb_1);return zn(n,31)+(null==this.ib_1?0:ee(this.ib_1))|0},se(io).equals=function(n){if(this===n)return!0;if(!(n instanceof io))return!1;var t=n instanceof io?n:_e();return!!oe(this.hb_1,t.hb_1)&&!!oe(this.ib_1,t.ib_1)},se(eo).toString=function(){return\"Project(path=\"+this.jb_1+\")\"},se(eo).hashCode=function(){return ue(this.jb_1)},se(eo).equals=function(n){if(this===n)return!0;if(!(n instanceof eo))return!1;var t=n instanceof eo?n:_e();return this.jb_1===t.jb_1},se(uo).toString=function(){return\"Task(path=\"+this.kb_1+\", type=\"+this.lb_1+\")\"},se(uo).hashCode=function(){var n=ue(this.kb_1);return zn(n,31)+ue(this.lb_1)|0},se(uo).equals=function(n){if(this===n)return!0;if(!(n instanceof uo))return!1;var t=n instanceof uo?n:_e();return this.kb_1===t.kb_1&&this.lb_1===t.lb_1},se(oo).toString=function(){return\"TaskPath(path=\"+this.mb_1+\")\"},se(oo).hashCode=function(){return ue(this.mb_1)},se(oo).equals=function(n){if(this===n)return!0;if(!(n instanceof oo))return!1;var t=n instanceof oo?n:_e();return this.mb_1===t.mb_1},se(fo).toString=function(){return\"Bean(type=\"+this.nb_1+\")\"},se(fo).hashCode=function(){return ue(this.nb_1)},se(fo).equals=function(n){if(this===n)return!0;if(!(n instanceof fo))return!1;var t=n instanceof fo?n:_e();return this.nb_1===t.nb_1},se(so).toString=function(){return\"SystemProperty(name=\"+this.ob_1+\")\"},se(so).hashCode=function(){return ue(this.ob_1)},se(so).equals=function(n){if(this===n)return!0;if(!(n instanceof so))return!1;var t=n instanceof so?n:_e();return this.ob_1===t.ob_1},se(co).toString=function(){return\"Property(kind=\"+this.pb_1+\", name=\"+this.qb_1+\", owner=\"+this.rb_1+\")\"},se(co).hashCode=function(){var n=ue(this.pb_1);return n=zn(n,31)+ue(this.qb_1)|0,zn(n,31)+ue(this.rb_1)|0},se(co).equals=function(n){if(this===n)return!0;if(!(n instanceof co))return!1;var t=n instanceof co?n:_e();return this.pb_1===t.pb_1&&this.qb_1===t.qb_1&&this.rb_1===t.rb_1},se(ao).toString=function(){return\"BuildLogic(location=\"+this.sb_1+\")\"},se(ao).hashCode=function(){return ue(this.sb_1)},se(ao).equals=function(n){if(this===n)return!0;if(!(n instanceof ao))return!1;var t=n instanceof ao?n:_e();return this.sb_1===t.sb_1},se(ho).toString=function(){return\"BuildLogicClass(type=\"+this.tb_1+\")\"},se(ho).hashCode=function(){return ue(this.tb_1)},se(ho).equals=function(n){if(this===n)return!0;if(!(n instanceof ho))return!1;var t=n instanceof ho?n:_e();return this.tb_1===t.tb_1},se(vo).zb=function(){return this.yb_1},se(vo).toString=function(){return\"TaskTreeIntent(delegate=\"+this.yb_1+\")\"},se(vo).hashCode=function(){return ee(this.yb_1)},se(vo).equals=function(n){if(this===n)return!0;if(!(n instanceof vo))return!1;var t=n instanceof vo?n:_e();return!!oe(this.yb_1,t.yb_1)},se(go).zb=function(){return this.ac_1},se(go).toString=function(){return\"MessageTreeIntent(delegate=\"+this.ac_1+\")\"},se(go).hashCode=function(){return ee(this.ac_1)},se(go).equals=function(n){if(this===n)return!0;if(!(n instanceof go))return!1;var t=n instanceof go?n:_e();return!!oe(this.ac_1,t.ac_1)},se(wo).zb=function(){return this.bc_1},se(wo).toString=function(){return\"InputTreeIntent(delegate=\"+this.bc_1+\")\"},se(wo).hashCode=function(){return ee(this.bc_1)},se(wo).equals=function(n){if(this===n)return!0;if(!(n instanceof wo))return!1;var t=n instanceof wo?n:_e();return!!oe(this.bc_1,t.bc_1)},se(bo).zb=function(){return this.cc_1},se(bo).toString=function(){return\"IncompatibleTaskTreeIntent(delegate=\"+this.cc_1+\")\"},se(bo).hashCode=function(){return ee(this.cc_1)},se(bo).equals=function(n){if(this===n)return!0;if(!(n instanceof bo))return!1;var t=n instanceof bo?n:_e();return!!oe(this.cc_1,t.cc_1)},se(po).toString=function(){return\"SetTab(tab=\"+this.dc_1+\")\"},se(po).hashCode=function(){return this.dc_1.hashCode()},se(po).equals=function(n){if(this===n)return!0;if(!(n instanceof po))return!1;var t=n instanceof po?n:_e();return!!this.dc_1.equals(t.dc_1)},se(mo).mc=function(n,t,r,i,e,u,o,f){return new mo(n,t,r,i,e,u,o,f)},se(mo).nc=function(n,t,r,i,e,u,o,f,s){return n=n===A?this.ec_1:n,t=t===A?this.fc_1:t,r=r===A?this.gc_1:r,i=i===A?this.hc_1:i,e=e===A?this.ic_1:e,u=u===A?this.jc_1:u,o=o===A?this.kc_1:o,f=f===A?this.lc_1:f,s===A?this.mc(n,t,r,i,e,u,o,f):s.mc.call(this,n,t,r,i,e,u,o,f)},se(mo).toString=function(){return\"Model(heading=\"+this.ec_1+\", summary=\"+this.fc_1+\", learnMore=\"+this.gc_1+\", messageTree=\"+this.hc_1+\", locationTree=\"+this.ic_1+\", inputTree=\"+this.jc_1+\", incompatibleTaskTree=\"+this.kc_1+\", tab=\"+this.lc_1+\")\"},se(mo).hashCode=function(){var n=this.ec_1.hashCode();return n=zn(n,31)+ee(this.fc_1)|0,n=zn(n,31)+this.gc_1.hashCode()|0,n=zn(n,31)+this.hc_1.hashCode()|0,n=zn(n,31)+this.ic_1.hashCode()|0,n=zn(n,31)+this.jc_1.hashCode()|0,n=zn(n,31)+this.kc_1.hashCode()|0,zn(n,31)+this.lc_1.hashCode()|0},se(mo).equals=function(n){if(this===n)return!0;if(!(n instanceof mo))return!1;var t=n instanceof mo?n:_e();return!!(this.ec_1.equals(t.ec_1)&&oe(this.fc_1,t.fc_1)&&this.gc_1.equals(t.gc_1)&&this.hc_1.equals(t.hc_1)&&this.ic_1.equals(t.ic_1)&&this.jc_1.equals(t.jc_1)&&this.kc_1.equals(t.kc_1)&&this.lc_1.equals(t.lc_1))},se(Uo).gd=function(n,t){var r,i;return n instanceof vo?r=t.nc(A,A,A,A,_s().id(n.yb_1,t.ic_1)):n instanceof go?r=t.nc(A,A,A,_s().id(n.ac_1,t.hc_1)):n instanceof wo?r=t.nc(A,A,A,A,A,_s().id(n.bc_1,t.jc_1)):n instanceof bo?r=t.nc(A,A,A,A,A,A,_s().id(n.cc_1,t.kc_1)):n instanceof qc?r=function(n,t,r,i){var e;return r instanceof go?e=n.nc(A,A,A,mc(n.hc_1,r,i)):r instanceof vo?e=n.nc(A,A,A,A,mc(n.ic_1,r,i)):r instanceof wo?e=n.nc(A,A,A,A,A,mc(n.jc_1,r,i)):r instanceof bo?e=n.nc(A,A,A,A,A,A,mc(n.kc_1,r,i)):(console.error(\"Unhandled tree intent: \"+r),e=n),e}(t,0,n.xc_1,(i=n,function(n){var t;if(!(n instanceof Ou))throw fu(ie(\"Failed requirement.\"));for(var r=n.oa_1,e=i.wc_1,u=Nr(xt(r,10)),o=0,f=r.f();f.g();){var s,c,a=f.h(),h=o;if(o=h+1|0,e===wr(h)){var l=a.sa_1;c=a.ua(A,null==l?null:l.ad())}else c=a;s=c,u.d(s)}return t=u,n.qa(A,A,t)})):n instanceof kc?(window.navigator.clipboard.writeText(n.hd_1),r=t):n instanceof po?r=t.nc(A,A,A,A,A,A,A,n.dc_1):(console.error(\"Unhandled intent: \"+n),r=t),r},se(Uo).ba=function(n,t){var r=n instanceof Bc?n:_e();return this.gd(r,t instanceof mo?t:_e())},se(Uo).jd=function(n){return Af().y9(Jf(To),[qo(0,n),Bo(0,n)])},se(Uo).z9=function(n){return this.jd(n instanceof mo?n:_e())},se(Zo).toString=function(){return\"ImportedProblem(problem=\"+this.kd_1+\", message=\"+this.ld_1+\", trace=\"+this.md_1+\")\"},se(Zo).hashCode=function(){var n=ee(this.kd_1);return n=zn(n,31)+this.ld_1.hashCode()|0,zn(n,31)+ee(this.md_1)|0},se(Zo).equals=function(n){if(this===n)return!0;if(!(n instanceof Zo))return!1;var t=n instanceof Zo?n:_e();return!!oe(this.kd_1,t.kd_1)&&!!this.ld_1.equals(t.ld_1)&&!!oe(this.md_1,t.md_1)},se(ff).ud=function(n,t){return this.td_1(n,t)},se(ff).compare=function(n,t){return this.ud(n,t)},se(bf).toString=function(){return\"LearnMore(text=\"+this.sc_1+\", documentationLink=\"+this.tc_1+\")\"},se(bf).hashCode=function(){var n=ue(this.sc_1);return zn(n,31)+ue(this.tc_1)|0},se(bf).equals=function(n){if(this===n)return!0;if(!(n instanceof bf))return!1;var t=n instanceof bf?n:_e();return this.sc_1===t.sc_1&&this.tc_1===t.tc_1},se(pf).toString=function(){return\"Text(text=\"+this.fa_1+\")\"},se(pf).hashCode=function(){return ue(this.fa_1)},se(pf).equals=function(n){if(this===n)return!0;if(!(n instanceof pf))return!1;var t=n instanceof pf?n:_e();return this.fa_1===t.fa_1},se(mf).toString=function(){return\"Reference(name=\"+this.da_1+\", clipboardString=\"+this.ea_1+\")\"},se(mf).hashCode=function(){var n=ue(this.da_1);return zn(n,31)+ue(this.ea_1)|0},se(mf).equals=function(n){if(this===n)return!0;if(!(n instanceof mf))return!1;var t=n instanceof mf?n:_e();return this.da_1===t.da_1&&this.ea_1===t.ea_1},se(yf).ed=function(n){return this.dd_1.d(new pf(n)),this},se(yf).xd=function(n,t){return this.dd_1.d(new mf(n,t)),this},se(yf).fd=function(n,t,r){return t=t===A?n:t,r===A?this.xd(n,t):r.xd.call(this,n,t)},se(yf).j5=function(){return new Cf(Rn(this.dd_1))},se(qf).rd=function(n){return new Cf(gr(new pf(n)))},se(qf).qd=function(n){var t=new yf;return n(t),t.j5()},se(Cf).vd=function(n){return new Cf(n)},se(Cf).toString=function(){return\"PrettyText(fragments=\"+this.ca_1+\")\"},se(Cf).hashCode=function(){return ee(this.ca_1)},se(Cf).equals=function(n){if(this===n)return!0;if(!(n instanceof Cf))return!1;var t=n instanceof Cf?n:_e();return!!oe(this.ca_1,t.ca_1)},se(xf).sd=function(n){return function(n){for(var t=Gr(),r=n.f();r.g();)for(var i=t,e=r.h().f();e.g();){var u,o=e.h(),f=i,s=f.v1(o);if(null==s){var c=Gr();f.h5(o,c),u=c}else u=s;i=u instanceof Vr?u:_e()}return t}(n)},se(Sf).toString=function(){return\"Trie(nestedMaps=\"+this.wd_1+\")\"},se(Sf).hashCode=function(){return ee(this.wd_1)},se(Sf).equals=function(n){return function(n,t){return t instanceof Sf&&!!oe(n,t instanceof Sf?t.wd_1:_e())}(this.wd_1,n)},se(Uf).ga=function(n){return Qf().yd(this.x9_1,A,n)},se(Uf).ha=function(n){return Qf().yd(this.x9_1,A,A,n)},se(Uf).ja=function(n){return Qf().yd(this.x9_1,A,A,nu(n))},se(Uf).y9=function(n,t){return Qf().yd(this.x9_1,n,A,nu(t))},se(Uf).zd=function(n,t){return Qf().yd(this.x9_1,n,A,t)},se(Uf).fb=function(n,t){return Qf().yd(this.x9_1,n,t)},se(Uf).rc=function(n,t){return Qf().yd(this.x9_1,A,n,nu(t))},se(Uf).toString=function(){return\"ViewFactory(elementName=\"+this.x9_1+\")\"},se(Uf).hashCode=function(){return ue(this.x9_1)},se(Uf).equals=function(n){if(this===n)return!0;if(!(n instanceof Uf))return!1;var t=n instanceof Uf?n:_e();return this.x9_1===t.x9_1},se(Vf).ae=function(n,t,r,i){return new Wf(n,t,r,i)},se(Vf).yd=function(n,t,r,i,e){return t=t===A?pt():t,r=r===A?null:r,i=i===A?pt():i,e===A?this.ae(n,t,r,i):e.ae.call(this,n,t,r,i)},se(Wf).toString=function(){return\"Element(elementName=\"+this.be_1+\", attributes=\"+this.ce_1+\", innerText=\"+this.de_1+\", children=\"+this.ee_1+\")\"},se(Wf).hashCode=function(){var n=ue(this.be_1);return n=zn(n,31)+ee(this.ce_1)|0,n=zn(n,31)+(null==this.de_1?0:ue(this.de_1))|0,zn(n,31)+ee(this.ee_1)|0},se(Wf).equals=function(n){if(this===n)return!0;if(!(n instanceof Wf))return!1;var t=n instanceof Wf?n:_e();return this.be_1===t.be_1&&!!oe(this.ce_1,t.ce_1)&&this.de_1==t.de_1&&!!oe(this.ee_1,t.ee_1)},se(ns).u9=function(n){return this.r9_1(new ts(\"click\",n))},se(ns).t9=function(n){return this.r9_1(new rs(n))},se(ns).gb=function(n){for(var t=0,r=n.length;t<r;){var i=n[t];t=t+1|0,this.r9_1(new rs(i))}return lr()},se(ns).s9=function(n){return this.r9_1(new is(\"title\",n))},se(ns).bd=function(n){return this.r9_1(new is(\"href\",n))},se(ss).oe=function(){return this.ne_1},se(ss).toString=function(){return\"Toggle(focus=\"+this.ne_1+\")\"},se(ss).hashCode=function(){return ee(this.ne_1)},se(ss).equals=function(n){if(this===n)return!0;if(!(n instanceof ss))return!1;var t=n instanceof ss?n:_e();return!!oe(this.ne_1,t.ne_1)},se(cs).pe=function(n,t){return this.re(n.qe((r=t,function(n){return n.me(r(n.ub_1))})));var r},se(cs).re=function(n){return new cs(n)},se(cs).toString=function(){return\"Model(tree=\"+this.xb_1+\")\"},se(cs).hashCode=function(){return this.xb_1.hashCode()},se(cs).equals=function(n){if(this===n)return!0;if(!(n instanceof cs))return!1;var t=n instanceof cs?n:_e();return!!this.xb_1.equals(t.xb_1)},se(ls).id=function(n,t){var r;if(n instanceof ss){var i=n.oe();r=t.re(i.qe(hs))}else le();return r},se(ds).cd=function(){return this.ve_1},se(ds).we=function(){return 0},se(ds).qe=function(n){return n(this.ve_1)},se(ds).toString=function(){return\"Original(tree=\"+this.ve_1+\")\"},se(ds).hashCode=function(){return this.ve_1.hashCode()},se(ds).equals=function(n){if(this===n)return!0;if(!(n instanceof ds))return!1;var t=n instanceof ds?n:_e();return!!this.ve_1.equals(t.ve_1)},se(gs).cd=function(){return this.ue_1},se(gs).we=function(){return this.se_1.we()+1|0},se(gs).qe=function(n){return this.se_1.qe((t=this,r=n,function(n){for(var i,e=n.vb_1,u=t.te_1,o=Nr(xt(e,10)),f=0,s=e.f();s.g();){var c,a=s.h(),h=f;f=h+1|0,c=u===wr(h)?r(a):a,o.d(c)}return i=o,n.me(A,i)}));var t,r},se(gs).toString=function(){return\"Child(parent=\"+this.se_1+\", index=\"+this.te_1+\", tree=\"+this.ue_1+\")\"},se(gs).hashCode=function(){var n=ee(this.se_1);return n=zn(n,31)+this.te_1|0,zn(n,31)+this.ue_1.hashCode()|0},se(gs).equals=function(n){if(this===n)return!0;if(!(n instanceof gs))return!1;var t=n instanceof gs?n:_e();return!!oe(this.se_1,t.se_1)&&this.te_1===t.te_1&&!!this.ue_1.equals(t.ue_1)},se(ws).ad=function(){var n;switch(this.q8_1){case 0:n=ms();break;case 1:n=ps();break;default:le()}return n},se(bs).vc=function(){var n,t;return Jn(On(Oe(0,this.cd().vb_1.k()-1|0)),(n=this,(t=function(t){return n.xe(t)}).callableName=\"child\",t))},se(bs).xe=function(n){return new gs(this,n,this.cd().vb_1.j(n))},se(ks).uc=function(){return new ds(this)},se(ks).ye=function(){return!this.vb_1.i()},se(ks).ze=function(n,t,r){return new ks(n,t,r)},se(ks).me=function(n,t,r,i){return n=n===A?this.ub_1:n,t=t===A?this.vb_1:t,r=r===A?this.wb_1:r,i===A?this.ze(n,t,r):i.ze.call(this,n,t,r)},se(ks).toString=function(){return\"Tree(label=\"+this.ub_1+\", children=\"+this.vb_1+\", state=\"+this.wb_1+\")\"},se(ks).hashCode=function(){var n=null==this.ub_1?0:ee(this.ub_1);return n=zn(n,31)+ee(this.vb_1)|0,zn(n,31)+this.wb_1.hashCode()|0},se(ks).equals=function(n){if(this===n)return!0;if(!(n instanceof ks))return!1;var t=n instanceof ks?n:_e();return!!oe(this.ub_1,t.ub_1)&&!!oe(this.vb_1,t.vb_1)&&!!this.wb_1.equals(t.wb_1)},se(Cs).toString=function(){return\"ProblemIdElement(name=\"+this.df_1+\", displayName=\"+this.ef_1+\")\"},se(Cs).hashCode=function(){var n=ue(this.df_1);return zn(n,31)+ue(this.ef_1)|0},se(Cs).equals=function(n){if(this===n)return!0;if(!(n instanceof Cs))return!1;var t=n instanceof Cs?n:_e();return this.df_1===t.df_1&&this.ef_1===t.ef_1},se(xs).toString=function(){return\"ProblemSummary(problemId=\"+this.ff_1+\", count=\"+this.gf_1+\")\"},se(xs).hashCode=function(){var n=ee(this.ff_1);return zn(n,31)+this.gf_1|0},se(xs).equals=function(n){if(this===n)return!0;if(!(n instanceof xs))return!1;var t=n instanceof xs?n:_e();return!!oe(this.ff_1,t.ff_1)&&this.gf_1===t.gf_1},se(Is).toString=function(){return\"ProblemNodeGroup(tree=\"+this.hf_1+\", children=\"+this.if_1+\", childGroups=\"+this.jf_1+\", id=\"+this.kf_1+\")\"},se(Is).hashCode=function(){var n=this.hf_1.hashCode();return n=zn(n,31)+ee(this.if_1)|0,n=zn(n,31)+ee(this.jf_1)|0,zn(n,31)+this.kf_1|0},se(Is).equals=function(n){if(this===n)return!0;if(!(n instanceof Is))return!1;var t=n instanceof Is?n:_e();return!!this.hf_1.equals(t.hf_1)&&!!oe(this.if_1,t.if_1)&&!!oe(this.jf_1,t.jf_1)&&this.kf_1===t.kf_1},se(Us).toString=function(){return\"Text(text=\"+this.lf_1+\")\"},se(Us).hashCode=function(){return ue(this.lf_1)},se(Us).equals=function(n){if(this===n)return!0;if(!(n instanceof Us))return!1;var t=n instanceof Us?n:_e();return this.lf_1===t.lf_1},se(Vs).toString=function(){return\"ProblemIdNode(prettyText=\"+this.mf_1+\", separator=\"+this.nf_1+\")\"},se(Vs).hashCode=function(){var n=this.mf_1.hashCode();return zn(n,31)+(0|this.nf_1)|0},se(Vs).equals=function(n){if(this===n)return!0;if(!(n instanceof Vs))return!1;var t=n instanceof Vs?n:_e();return!!this.mf_1.equals(t.mf_1)&&this.nf_1===t.nf_1},se(Qs).toString=function(){return\"Advice(label=\"+this.of_1+\", docLink=\"+this.pf_1+\")\"},se(Qs).hashCode=function(){var n=ee(this.of_1);return zn(n,31)+(null==this.pf_1?0:ee(this.pf_1))|0},se(Qs).equals=function(n){if(this===n)return!0;if(!(n instanceof Qs))return!1;var t=n instanceof Qs?n:_e();return!!oe(this.of_1,t.of_1)&&!!oe(this.pf_1,t.pf_1)},se(Ys).zb=function(){return this.qf_1},se(Ys).toString=function(){return\"MessageTreeIntent(delegate=\"+this.qf_1+\")\"},se(Ys).hashCode=function(){return ee(this.qf_1)},se(Ys).equals=function(n){if(this===n)return!0;if(!(n instanceof Ys))return!1;var t=n instanceof Ys?n:_e();return!!oe(this.qf_1,t.qf_1)},se(Ws).zb=function(){return this.rf_1},se(Ws).toString=function(){return\"ProblemIdTreeIntent(delegate=\"+this.rf_1+\")\"},se(Ws).hashCode=function(){return ee(this.rf_1)},se(Ws).equals=function(n){if(this===n)return!0;if(!(n instanceof Ws))return!1;var t=n instanceof Ws?n:_e();return!!oe(this.rf_1,t.rf_1)},se(Ks).zb=function(){return this.sf_1},se(Ks).toString=function(){return\"FileLocationTreeIntent(delegate=\"+this.sf_1+\")\"},se(Ks).hashCode=function(){return ee(this.sf_1)},se(Ks).equals=function(n){if(this===n)return!0;if(!(n instanceof Ks))return!1;var t=n instanceof Ks?n:_e();return!!oe(this.sf_1,t.sf_1)},se(Xs).toString=function(){return\"SetTab(tab=\"+this.tf_1+\")\"},se(Xs).hashCode=function(){return this.tf_1.hashCode()},se(Xs).equals=function(n){if(this===n)return!0;if(!(n instanceof Xs))return!1;var t=n instanceof Xs?n:_e();return!!this.tf_1.equals(t.tf_1)},se(Js).cg=function(n,t,r,i,e,u,o,f){return new Js(n,t,r,i,e,u,o,f)},se(Js).dg=function(n,t,r,i,e,u,o,f,s){return n=n===A?this.uf_1:n,t=t===A?this.vf_1:t,r=r===A?this.wf_1:r,i=i===A?this.xf_1:i,e=e===A?this.yf_1:e,u=u===A?this.zf_1:u,o=o===A?this.ag_1:o,f=f===A?this.bg_1:f,s===A?this.cg(n,t,r,i,e,u,o,f):s.cg.call(this,n,t,r,i,e,u,o,f)},se(Js).toString=function(){return\"Model(heading=\"+this.uf_1+\", summary=\"+this.vf_1+\", learnMore=\"+this.wf_1+\", messageTree=\"+this.xf_1+\", problemIdTree=\"+this.yf_1+\", fileLocationTree=\"+this.zf_1+\", problemCount=\"+this.ag_1+\", tab=\"+this.bg_1+\")\"},se(Js).hashCode=function(){var n=this.uf_1.hashCode();return n=zn(n,31)+ee(this.vf_1)|0,n=zn(n,31)+this.wf_1.hashCode()|0,n=zn(n,31)+this.xf_1.hashCode()|0,n=zn(n,31)+this.yf_1.hashCode()|0,n=zn(n,31)+this.zf_1.hashCode()|0,n=zn(n,31)+this.ag_1|0,zn(n,31)+this.bg_1.hashCode()|0},se(Js).equals=function(n){if(this===n)return!0;if(!(n instanceof Js))return!1;var t=n instanceof Js?n:_e();return!!(this.uf_1.equals(t.uf_1)&&oe(this.vf_1,t.vf_1)&&this.wf_1.equals(t.wf_1)&&this.xf_1.equals(t.xf_1)&&this.yf_1.equals(t.yf_1)&&this.zf_1.equals(t.zf_1)&&this.ag_1===t.ag_1&&this.bg_1.equals(t.bg_1))},se(bc).eg=function(n,t){var r,i;return n instanceof Ks?r=t.dg(A,A,A,A,A,_s().id(n.sf_1,t.zf_1)):n instanceof Ws?r=t.dg(A,A,A,A,_s().id(n.rf_1,t.yf_1)):n instanceof Ys?r=t.dg(A,A,A,_s().id(n.qf_1,t.xf_1)):n instanceof qc?r=function(n,t,r,i){var e;return r instanceof Ys?e=n.dg(A,A,A,mc(n.xf_1,r,i)):r instanceof Ws?e=n.dg(A,A,A,A,mc(n.yf_1,r,i)):r instanceof Ks?e=n.dg(A,A,A,A,A,mc(n.zf_1,r,i)):(console.error(\"Unhandled tree intent: \"+r),e=n),e}(t,0,n.xc_1,(i=n,function(n){var t;if(!(n instanceof Ou))throw fu(ie(\"Failed requirement.\"));for(var r=n.oa_1,e=i.wc_1,u=Nr(xt(r,10)),o=0,f=r.f();f.g();){var s,c,a=f.h(),h=o;if(o=h+1|0,e===wr(h)){var l=a.sa_1;c=a.ua(A,null==l?null:l.ad())}else c=a;s=c,u.d(s)}return t=u,n.qa(A,A,t)})):n instanceof kc?(window.navigator.clipboard.writeText(n.hd_1),r=t):n instanceof Xs?r=t.dg(A,A,A,A,A,A,A,n.tf_1):(console.error(\"Unhandled intent: \"+n),r=t),r},se(bc).ba=function(n,t){var r=n instanceof Bc?n:_e();return this.eg(r,t instanceof Js?t:_e())},se(bc).fg=function(n){return Af().y9(Jf(ac),[tc(0,n),rc(0,n)])},se(bc).z9=function(n){return this.fg(n instanceof Js?n:_e())},se(kc).toString=function(){return\"Copy(text=\"+this.hd_1+\")\"},se(kc).hashCode=function(){return ue(this.hd_1)},se(kc).equals=function(n){if(this===n)return!0;if(!(n instanceof kc))return!1;var t=n instanceof kc?n:_e();return this.hd_1===t.hd_1},se(qc).toString=function(){return\"ToggleStackTracePart(partIndex=\"+this.wc_1+\", location=\"+this.xc_1+\")\"},se(qc).hashCode=function(){var n=this.wc_1;return zn(n,31)+ee(this.xc_1)|0},se(qc).equals=function(n){if(this===n)return!0;if(!(n instanceof qc))return!1;var t=n instanceof qc?n:_e();return this.wc_1===t.wc_1&&!!oe(this.xc_1,t.xc_1)},se(Jr).k6=function(){var n=Object.create(null);return n.foo=1,delete n.foo,lr(),n},l=null,wn=0,function(){var n=configurationCacheProblems();if(null==n.problemsReport)zf(Ef(\"report\"),Vo(),function(n){var t,r,i,e,u,o,f,s,c,a,h=function(n){for(var t=Lr(),r=Lr(),i=Lr(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;var f,s=o.input,c=null==s?null:r.d(Wo(s,o));if(null==c){var a=o.incompatibleTask;f=null==a?null:i.d(Wo(a,o))}else f=c;if(null==f){var h=he(o.problem);t.d(Wo(h,o))}}return new Yo(t,r,i)}(n.diagnostics),l=n.totalProblemCount;return new mo((f=(t=n).buildName,s=t.requestedTasks,c=null==s?null:Wt(s,\" \",A,r=r!==A&&r)>=0,a=null==c||c,Bf().qd((i=t,e=f,u=s,o=a,function(n){n.ed(function(n){var t;if(Wi(n)>0){var r,i=Zi(n,0);r=function(n){return 97<=n&&n<=122||!(ji(n,128)<0)&&function(n){var t;return t=1===function(n){var t=n,r=ru(eu().h9_1,t),i=eu().h9_1[r],e=(i+eu().i9_1[r]|0)-1|0,u=eu().j9_1[r];if(t>e)return 0;var o=3&u;if(0===o){var f=2,s=i,c=0;if(c<=1)do{if(c=c+1|0,(s=s+(u>>f&127)|0)>t)return 3;if((s=s+(u>>(f=f+7|0)&127)|0)>t)return 0;f=f+7|0}while(c<=1);return 3}if(u<=7)return o;var a=t-i|0;return u>>zn(2,u<=31?a%2|0:a)&3}(n)||function(n){var t=ru(ou().k9_1,n);return t>=0&&n<(ou().k9_1[t]+ou().l9_1[t]|0)}(n),t}(n)}(i)?function(n){return function(n){var t=Pi(n).toUpperCase();if(t.length>1){var r;if(329===n)r=t;else{var i=Zi(t,0),e=t.substring(1).toLowerCase();r=Pi(i)+e}return r}return Pi(function(n){return function(n){var t=n;return 452<=t&&t<=460||497<=t&&t<=499?De(zn(3,(t+1|0)/3|0)):4304<=t&&t<=4346||4349<=t&&t<=4351?n:mi(n)}(n)}(n))}(n)}(i):Pi(i),t=ie(r)+n.substring(1)}else t=n;return t}(i.cacheAction)+\" the configuration cache for \");var t=e;null==t||n.fd(t),null==e||n.ed(\" build and \");var r=u;return null==(null==r?null:n.fd(r))&&n.ed(\"default\"),n.ed(o?\" tasks\":\" task\"),lr()}))),function(n,t){var r=n.cacheActionDescription,i=null==r?null:vf(r),e=Bf().rd(function(n){var t=n.od_1.k(),r=df(t,\"build configuration input\");return t>0?r+\" and will cause the cache to be discarded when \"+(t<=1?\"its\":\"their\")+\" value change\":r}(t)),u=Bf().rd(function(n,t){var r=n.totalProblemCount,i=t.nd_1.k(),e=df(r,\"problem\");return r>i?e+\", only the first \"+i+\" \"+wf(i)+\" included in this report\":e}(n,t));return function(n,t){for(var r=0,i=n.length;r<i;){var e=n[r];r=r+1|0,null!=e&&t.d(e)}return t}([i,e,u],Lr())}(n,h),new bf(\"Gradle Configuration Cache\",n.documentationLink),uf(new Zu(Ho().qc_1),Jn(On(h.nd_1),af)),uf(new Zu($o().qc_1),function(n){return Jn(On(n),hf)}(h.nd_1)),uf(new Zu(Ro().qc_1),Jn(On(h.od_1),sf)),uf(new Zu(Go().qc_1),Jn(On(h.pd_1),cf)),0===l?Ro():Ho())}(n));else{var t=n.problemsReport;zf(Ef(\"report\"),pc(),function(n,t){for(var r=n.summaries,i=Nr(r.length),e=0,u=r.length;e<u;){var o,f=r[e];e=e+1|0;for(var s=f.problemId,c=Nr(s.length),a=0,h=s.length;a<h;){var l,_=s[a];a=a+1|0,l=new Cs(_.name,_.displayName),c.d(l)}o=new xs(c,f.count),i.d(o)}for(var v=i,d=function(n,t){for(var r=oi(),i=0,e=n.length;i<e;){var u=n[i];i=i+1|0;var o,f=Ln(u.problemId,\":\",A,A,A,A,Ds),s=r.v1(f);if(null==s){var c=Lr();r.h5(f,c),o=c}else o=s;o.d(u)}for(var a=r.o(),h=Nr(xt(a,10)),l=a.f();l.g();){for(var _,v=l.h(),d=v.i1(),g=Nr(xt(d,10)),w=d.f();w.g();){var b;b=Es(w.h(),null,!0),g.d(b)}var p,m=Hn(g),k=Dn(v.i1()),y=Ls(k,new Gu(Ns(Ts(k)).ed(\" (\"+v.i1().k()+\")\").j5()));n:{for(var q=t.f();q.g();){var B=q.h();if(zs(B.ff_1,k.problemId)){p=B;break n}}p=null}var C=p;null==C||m.d(js(C.gf_1)),_=new ks(y,m),h.d(_)}var x=h;return new cs(new ks(new Us(\"message tree root\"),x))}(t,v),g=function(n,t){for(var r=function(){var n=Lr();return new Is(new ks(new Vs(Bf().rd(\"Ungrouped\"),!0),n),n,oi())}(),i=oi(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;for(var f=$n(Tn(o.problemId,1)),s=Nr(xt(f,10)),c=f.f();c.g();){var a,h=c.h();a=new Cs(h.name,h.displayName),s.d(a)}var l=Ss(i,s),_=Es(o);null==l?r.if_1.d(_):l.if_1.d(_)}for(var v=Nr(xt(t,10)),d=t.f();d.g();){var g,w=d.h();g=new xs($n(Gn(w.ff_1,1)),w.gf_1),v.d(g)}for(var b=oi(),p=v.f();p.g();){var m,k=p.h(),y=k.ff_1,q=b.v1(y);if(null==q){var B=Lr();b.h5(y,B),m=B}else m=q;m.d(k)}for(var C=b.o(),x=Nr(xt(C,10)),j=C.f();j.g();){for(var P,I=j.h(),S=I.j1(),z=0,E=I.i1().f();E.g();)z=z+E.h().gf_1|0;P=new xs(S,z),x.d(P)}for(var T=x.f();T.g();){var L=T.h(),N=Ss(i,L.ff_1),A=null==N?null:N.if_1;null==A||A.d(js(L.gf_1))}for(var M=i.w1(),F=Nr(xt(M,10)),D=M.f();D.g();){var O;O=D.h().hf_1,F.d(O)}var R=function(n,t){var r=Nr(n.k());return r.m(n),r.d(t),r}(F,r.hf_1);return new cs(new ks(new Us(\"group tree root\"),R))}(t,v),w=0,b=v.f();b.g();)w=w+b.h().gf_1|0;var p=function(n,t){for(var r=Lr(),i=oi(),e=0,u=n.length;e<u;){var o=n[e];e=e+1|0;var f=o.locations;if(null==f||0===f.length)r.d(Es(o));else{var s,c=o.locations;if(null==c)s=null;else{for(var a=Lr(),h=Ri(c);h.g();){var l=h.h();null!=l.path&&a.d(l)}s=a}if(null==s);else for(var _=s.f();_.g();){var v=_.h();Ps(i,he(v.path),o,v)}var d,g=o.locations;if(null==g)d=null;else{for(var w=Lr(),b=Ri(g);b.g();){var p=b.h();null!=p.pluginId&&w.d(p)}d=w}if(null==d);else for(var m=d.f();m.g();){var k=m.h();Ps(i,he(k.pluginId),o,k)}var y,q=o.locations;if(null==q)y=null;else{for(var B=Lr(),C=Ri(q);C.g();){var x=C.h();null!=x.taskPath&&B.d(x)}y=B}if(null==y);else for(var j=y.f();j.g();){var P=j.h();Ps(i,he(P.taskPath),o,P)}}}var I=function(n,t,r){for(var i=n.w1(),e=Nr(xt(i,10)),u=i.f();u.g();){var o;o=u.h().t3_1,e.d(o)}var f=Hn(e);return t.i()||f.d(new ks(new Vs(Bf().rd(\"no location\"),!0),t)),r>0&&f.d(js(r)),f}(i,r,t);return new cs(new ks(new Us(\"text\"),I))}(t,w);return new Js(Bf().rd(\"Problems Report\"),function(n,t){var r,i,e,u=n.description,o=null==u?null:gr(vf(u));return r=null==o?gr(Bf().qd((i=t,e=n,function(n){n.ed(i.length+\" problems have been reported during the execution\");var t=e.buildName;null==t||(n.ed(\" of build \"),n.fd(t));var r=e.requestedTasks;return null==r||(n.ed(\" for the following tasks:\"),n.fd(r),lr()),lr()}))):o,r}(n,t),new bf(\"reporting problems\",n.documentationLink),d,g,p,t.length,function(n,t,r){return lo(r)>0?Gs():lo(n)>0?Hs():lo(t)>0?$s():Hs()}(d,g,p))}(t,n.diagnostics))}}(),n}(void 0===this[\"configuration-cache-report\"]?{}:this[\"configuration-cache-report\"])}}[70](),{}))));\n//# sourceMappingURL=configuration-cache-report.js.map\n                </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "simple_live_app/android/build.gradle.kts",
    "content": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nval newBuildDir: Directory =\n    rootProject.layout.buildDirectory\n        .dir(\"../../build\")\n        .get()\nrootProject.layout.buildDirectory.value(newBuildDir)\n\nsubprojects {\n    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)\n    project.layout.buildDirectory.value(newSubprojectBuildDir)\n}\nsubprojects {\n    project.evaluationDependsOn(\":app\")\n}\n\ntasks.register<Delete>(\"clean\") {\n    delete(rootProject.layout.buildDirectory)\n}\n"
  },
  {
    "path": "simple_live_app/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.12-all.zip\n"
  },
  {
    "path": "simple_live_app/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "simple_live_app/android/settings.gradle.kts",
    "content": "pluginManagement {\n    val flutterSdkPath =\n        run {\n            val properties = java.util.Properties()\n            file(\"local.properties\").inputStream().use { properties.load(it) }\n            val flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n            require(flutterSdkPath != null) { \"flutter.sdk not set in local.properties\" }\n            flutterSdkPath\n        }\n\n    includeBuild(\"$flutterSdkPath/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id(\"dev.flutter.flutter-plugin-loader\") version \"1.0.0\"\n    id(\"com.android.application\") version \"8.9.1\" apply false\n    id(\"org.jetbrains.kotlin.android\") version \"2.1.0\" apply false\n}\n\ninclude(\":app\")\n"
  },
  {
    "path": "simple_live_app/assets/lotties/empty.json",
    "content": "{\"v\":\"4.7.0\",\"fr\":25,\"ip\":0,\"op\":50,\"w\":120,\"h\":120,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"ruoi\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.967]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p967_0p167_0p033\"],\"t\":35,\"s\":[100],\"e\":[0]},{\"t\":49}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0,\"y\":0},\"n\":\"0p833_0p833_0_0\",\"t\":0,\"s\":[57.361,61.016,0],\"e\":[57.699,41.796,0],\"to\":[-4.67500305175781,-4.12800598144531,0],\"ti\":[-13.9099960327148,5.27300262451172,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":10.219,\"s\":[57.699,41.796,0],\"e\":[79.084,33.982,0],\"to\":[12.8159942626953,-4.85800170898438,0],\"ti\":[-4.54498291015625,3.73400115966797,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":19.445,\"s\":[79.084,33.982,0],\"e\":[59.691,9.121,0],\"to\":[6.61601257324219,-5.43799591064453,0],\"ti\":[20.0290069580078,1.20700073242188,0]},{\"t\":35}]},\"a\":{\"a\":0,\"k\":[60.531,10.945,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-0.994,0],[0,-0.994],[0.995,0],[0,0.994]],\"o\":[[0.995,0],[0,0.994],[-0.994,0],[0,-0.994]],\"v\":[[-0.001,-1.801],[1.801,-0.001],[-0.001,1.801],[-1.801,-0.001]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[62.4,13.144],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-1.422,0],[0,-1.422],[1.421,0],[0,1.422]],\"o\":[[1.421,0],[0,1.422],[-1.422,0],[0,-1.422]],\"v\":[[0.001,-2.574],[2.574,0],[0.001,2.574],[-2.574,0]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0.7},\"lc\":1,\"lj\":1,\"ml\":10,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[64.145,9.606],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 2\",\"np\":3,\"cix\":2,\"ix\":2,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-1.996,0],[0,-1.996],[1.996,0],[0,1.996]],\"o\":[[1.996,0],[0,1.996],[-1.996,0],[0,-1.996]],\"v\":[[0,-3.614],[3.614,0],[0,3.614],[-3.614,0]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0.7},\"lc\":1,\"lj\":1,\"ml\":10,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[57.957,10.552],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 3\",\"np\":3,\"cix\":2,\"ix\":3,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60.531,10.941],\"ix\":2},\"a\":{\"a\":0,\"k\":[60.531,10.941],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"ruoi\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Shape Layer 2\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.967]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p967_0p167_0p033\"],\"t\":35,\"s\":[100],\"e\":[0]},{\"t\":49}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[-0.75,-0.75,0]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-13.91,5.273],[-4.545,3.734],[20.029,1.207]],\"o\":[[-4.675,-4.128],[12.816,-4.858],[6.616,-5.438],[0,0]],\"v\":[[-7.383,24.76],[-7.046,5.54],[14.34,-2.273],[-3.178,-24.76]],\"c\":false}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.34901960784313724,0.3686274509803922,0.4,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":1},\"lc\":2,\"lj\":2,\"d\":[{\"n\":\"d\",\"nm\":\"dash\",\"v\":{\"a\":0,\"k\":2.028}},{\"n\":\"g\",\"nm\":\"gap\",\"v\":{\"a\":0,\"k\":2.028}},{\"n\":\"o\",\"nm\":\"offset\",\"v\":{\"a\":0,\"k\":0}}],\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[67.87,37.631],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 6\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tm\",\"s\":{\"a\":0,\"k\":0,\"ix\":1},\"e\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.953]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p953_0p167_0p033\"],\"t\":0,\"s\":[0],\"e\":[100]},{\"t\":35}],\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"im_emptyBox Outlines\",\"ks\":{\"o\":{\"a\":0,\"k\":100},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[60,60,0]},\"a\":{\"a\":0,\"k\":[60,60,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-0.001,-16.607],[-32.143,-0.002],[-0.001,16.607],[32.144,-0.002]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8,0.82,0.851,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,55.75],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 7\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[12.856,-23.249],[0,-16.605],[-12.857,-23.249],[-45,-6.641],[-32.144,0.001],[-45,6.645],[-12.857,23.249],[0,16.609],[12.856,23.249],[45,6.645],[32.143,0.001],[45,-6.641]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9372549019607843,0.9372549019607843,0.9372549019607843,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,55.748],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 8\",\"np\":2,\"cix\":2,\"ix\":2,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-16.072,24.171],[16.072,11.312],[16.072,-24.171],[-16.072,-24.171]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9529411764705882,0.9529411764705882,0.9529411764705882,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[76.072,83.33],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 9\",\"np\":2,\"cix\":2,\"ix\":3,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[-32.143,-24.171],[-32.143,11.311],[-0.001,24.171],[32.144,11.311],[32.144,-24.171]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8,0.82,0.851,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,83.33],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 10\",\"np\":2,\"cix\":2,\"ix\":4,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,60.186],\"ix\":2},\"a\":{\"a\":0,\"k\":[60,60.186],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"box\",\"np\":4,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1}]}"
  },
  {
    "path": "simple_live_app/assets/lotties/error.json",
    "content": "{\"v\":\"5.8.1\",\"fr\":29.9700012207031,\"ip\":0,\"op\":301.000012259981,\"w\":1080,\"h\":900,\"nm\":\"Composition 1\",\"ddd\":0,\"assets\":[{\"id\":\"comp_0\",\"nm\":\"Nuage\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 11\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[54,54],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-22,-239],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 12\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[544.675,315.475,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-54.5,-226.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[80,80,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[31,31],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-54.5,-226.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[31,31],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-54.5,-226.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[100,20],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":20,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-26,-216],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_1\",\"nm\":\"éolienne\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"Hélices\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.137],\"y\":[1]},\"o\":{\"x\":[0.567],\"y\":[0]},\"t\":1,\"s\":[0]},{\"t\":300.00001221925,\"s\":[1440]}],\"ix\":10},\"p\":{\"a\":0,\"k\":[800,440,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[800,440,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Socle eolienne\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[264.75,-95],[257,-95],[242,252],[288,251]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_2\",\"nm\":\"Hélices\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 11\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-239.6,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-122.747,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[800.5,439.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[266.5,-94.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[27,27],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[266.5,-94.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_3\",\"nm\":\"plot base\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[541,387.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[1,-152.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[13,-223],[-13,-223],[-52,-82],[54,-82]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,502,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,-38,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[58,-56],[-59,-56],[-70,-20],[70,-20]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 5\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[539.75,606.25,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-0.25,66.25,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[256.5,28.5],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.7647058823529411,0.3215686274509804,0.23137254901960785,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-0.25,66.25],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,572,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,32,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[78,3],[-76,3],[-93,60],[93,61]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_4\",\"nm\":\"Tree\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-171.5,-79.5],[-152.5,-45]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980451995,0.84313731474,0.84313731474,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":7,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-154.5,-23.5],[-137.5,-48.5]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980451995,0.84313731474,0.84313731474,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":7,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[386,620,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-154,80,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-154,256],[-154,-96]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980392157,0.844306078144,0.844306078144,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":10,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[384,475,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-156,-65,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[96,222],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":62,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.949019667682,0.949019667682,0.949019667682,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-156,-65],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_5\",\"nm\":\"ground\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[515,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[662,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[817,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[78,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 3\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[752,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[89,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[270,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[102,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]}],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"Nuage\",\"refId\":\"comp_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.833],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":51,\"s\":[100]},{\"i\":{\"x\":[0.833],\"y\":[1]},\"o\":{\"x\":[0.167],\"y\":[0]},\"t\":234,\"s\":[100]},{\"t\":299.00001217852,\"s\":[0]}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.284,\"y\":1},\"o\":{\"x\":0.387,\"y\":0},\"t\":0,\"s\":[704,380,0],\"to\":[-36.667,0,0],\"ti\":[36.667,0,0]},{\"t\":299.00001217852,\"s\":[484,380,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[514,308,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],\"o\":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],\"v\":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.83137254902,0.821591725069,0.821591725069,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"éolienne\",\"refId\":\"comp_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[804,796,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[804,796,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"plot base\",\"refId\":\"comp_3\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":7.368,\"s\":[6]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":14.736,\"s\":[-5]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":22.264,\"s\":[4]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":29.633,\"s\":[-2]},{\"t\":37.0000015070409,\"s\":[0]}],\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":0,\"s\":[540,792,0],\"to\":[0,-2.667,0],\"ti\":[0,2,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":7.368,\"s\":[540,776,0],\"to\":[0,-2,0],\"ti\":[0,-1.333,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":14.736,\"s\":[540,780,0],\"to\":[0,1.333,0],\"ti\":[0,-1.333,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":22.264,\"s\":[540,784,0],\"to\":[0,1.333,0],\"ti\":[0,-2,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":29.633,\"s\":[540,788,0],\"to\":[0,2,0],\"ti\":[0,-1.333,0]},{\"t\":37.0000015070409,\"s\":[540,796,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,616,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"éolienne\",\"refId\":\"comp_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[670,796,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[804,796,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[63,63,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"Tree\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[280,790,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[384,790,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[82,82,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"Tree\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":8,\"ty\":4,\"nm\":\"Arbuste\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],\"o\":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],\"v\":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":9,\"ty\":0,\"nm\":\"ground\",\"refId\":\"comp_5\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":10,\"ty\":0,\"nm\":\"Nuage\",\"refId\":\"comp_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":51,\"s\":[100]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":234,\"s\":[100]},{\"t\":299.00001217852,\"s\":[0]}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":0,\"s\":[193,606,0],\"to\":[56.5,0,0],\"ti\":[-56.5,0,0]},{\"t\":299.00001217852,\"s\":[532,606,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[514,308,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[60,60,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":11,\"ty\":4,\"nm\":\"Calque de forme 6\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[572,712,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[784,628],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.909803921569,0.909803921569,0.909803921569,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-36,-234],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":12,\"ty\":4,\"nm\":\"Calque de forme 5\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,716,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[728,728],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.976470588235,0.976470588235,0.976470588235,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[8,-140],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":14,\"ty\":1,\"nm\":\"Blanc uni 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"sw\":1080,\"sh\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "simple_live_app/assets/lotties/loadding.json",
    "content": "{\n    \"v\": \"5.5.8\",\n    \"fr\": 50,\n    \"ip\": 0,\n    \"op\": 147,\n    \"w\": 800,\n    \"h\": 600,\n    \"nm\": \"Paperplane\",\n    \"ddd\": 0,\n    \"assets\": [\n        {\n            \"id\": \"comp_0\",\n            \"layers\": [\n                {\n                    \"ddd\": 0,\n                    \"ind\": 1,\n                    \"ty\": 4,\n                    \"nm\": \"planete Outlines - Group 4\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 38,\n                                    \"s\": [\n                                        50\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 88,\n                                    \"s\": [\n                                        50\n                                    ]\n                                },\n                                {\n                                    \"t\": 120,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.833,\n                                        \"y\": 0.833\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.167,\n                                        \"y\": 0.167\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        468.336,\n                                        323.378,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        -29,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        29,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 102,\n                                    \"s\": [\n                                        294.336,\n                                        323.378,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                453.672,\n                                304.756,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                50,\n                                50,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ind\": 0,\n                                    \"ty\": \"sh\",\n                                    \"ix\": 1,\n                                    \"ks\": {\n                                        \"a\": 0,\n                                        \"k\": {\n                                            \"i\": [\n                                                [\n                                                    6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0.741,\n                                                    -0.14\n                                                ],\n                                                [\n                                                    0,\n                                                    0.074\n                                                ],\n                                                [\n                                                    13.484,\n                                                    0\n                                                ],\n                                                [\n                                                    1.669,\n                                                    -0.361\n                                                ],\n                                                [\n                                                    19.79,\n                                                    0\n                                                ],\n                                                [\n                                                    3.317,\n                                                    -19.082\n                                                ],\n                                                [\n                                                    2.691,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -0.048,\n                                                    -0.629\n                                                ],\n                                                [\n                                                    2.405,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.742\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.743\n                                                ]\n                                            ],\n                                            \"o\": [\n                                                [\n                                                    -0.781,\n                                                    0\n                                                ],\n                                                [\n                                                    0.001,\n                                                    -0.074\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -1.778,\n                                                    0\n                                                ],\n                                                [\n                                                    -3.594,\n                                                    -18.742\n                                                ],\n                                                [\n                                                    -20.03,\n                                                    0\n                                                ],\n                                                [\n                                                    -2.421,\n                                                    -0.804\n                                                ],\n                                                [\n                                                    -13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0.642\n                                                ],\n                                                [\n                                                    -1.89,\n                                                    -1.199\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.743\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.742\n                                                ]\n                                            ],\n                                            \"v\": [\n                                                [\n                                                    75.134,\n                                                    16.175\n                                                ],\n                                                [\n                                                    72.85,\n                                                    16.396\n                                                ],\n                                                [\n                                                    72.856,\n                                                    16.175\n                                                ],\n                                                [\n                                                    48.44,\n                                                    -8.241\n                                                ],\n                                                [\n                                                    43.262,\n                                                    -7.685\n                                                ],\n                                                [\n                                                    3.406,\n                                                    -40.591\n                                                ],\n                                                [\n                                                    -36.571,\n                                                    -6.995\n                                                ],\n                                                [\n                                                    -44.269,\n                                                    -8.241\n                                                ],\n                                                [\n                                                    -68.685,\n                                                    16.175\n                                                ],\n                                                [\n                                                    -68.604,\n                                                    18.079\n                                                ],\n                                                [\n                                                    -75.133,\n                                                    16.175\n                                                ],\n                                                [\n                                                    -87.341,\n                                                    28.383\n                                                ],\n                                                [\n                                                    -75.133,\n                                                    40.592\n                                                ],\n                                                [\n                                                    75.134,\n                                                    40.592\n                                                ],\n                                                [\n                                                    87.342,\n                                                    28.383\n                                                ]\n                                            ],\n                                            \"c\": true\n                                        },\n                                        \"ix\": 2\n                                    },\n                                    \"nm\": \"Path 1\",\n                                    \"mn\": \"ADBE Vector Shape - Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"fl\",\n                                    \"c\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0.815686334348,\n                                            0.823529471603,\n                                            0.827451040231,\n                                            1\n                                        ],\n                                        \"ix\": 4\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 5\n                                    },\n                                    \"r\": 1,\n                                    \"bm\": 0,\n                                    \"nm\": \"Fill 1\",\n                                    \"mn\": \"ADBE Vector Graphic - Fill\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            453.672,\n                                            304.756\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0,\n                                            0\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            100,\n                                            100\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"Group 4\",\n                            \"np\": 2,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                },\n                {\n                    \"ddd\": 0,\n                    \"ind\": 2,\n                    \"ty\": 4,\n                    \"nm\": \"Merged Shape Layer\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.547\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.845\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 77,\n                                    \"s\": [\n                                        35\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        390.319,\n                                        298.2,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        -2.583,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 44,\n                                    \"s\": [\n                                        390.319,\n                                        282.7,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 110,\n                                    \"s\": [\n                                        390.319,\n                                        319.25,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        390.319,\n                                        298.2,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                664.319,\n                                256.2,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                100,\n                                100,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            18.967,\n                                                            -3.189\n                                                        ],\n                                                        [\n                                                            -18.967,\n                                                            19.935\n                                                        ],\n                                                        [\n                                                            -0.949,\n                                                            -19.935\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.223528981209,\n                                                    0.192156970501,\n                                                    0.674510002136,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    236.879,\n                                                    292.737\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 1\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            633.939,\n                                            275.369\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            236.879,\n                                            292.737\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 1\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        },\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            -98.335,\n                                                            64.79\n                                                        ],\n                                                        [\n                                                            -105.619,\n                                                            4.984\n                                                        ],\n                                                        [\n                                                            105.619,\n                                                            -64.79\n                                                        ],\n                                                        [\n                                                            -80.316,\n                                                            24.919\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.278430998325,\n                                                    0.294117987156,\n                                                    0.847059011459,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    316.247,\n                                                    247.882\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 2\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            673.623,\n                                            252.941\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            316.247,\n                                            247.882\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 2\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 2,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        },\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            -133.812,\n                                                            -42.171\n                                                        ],\n                                                        [\n                                                            133.812,\n                                                            -75.141\n                                                        ],\n                                                        [\n                                                            5.765,\n                                                            75.141\n                                                        ],\n                                                        [\n                                                            -61.708,\n                                                            18.402\n                                                        ],\n                                                        [\n                                                            124.227,\n                                                            -71.307\n                                                        ],\n                                                        [\n                                                            -87.011,\n                                                            -1.534\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.365000009537,\n                                                    0.407999992371,\n                                                    0.976000010967,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    297.638,\n                                                    254.4\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 3\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            664.319,\n                                            256.2\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            297.638,\n                                            254.4\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 3\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 3,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                },\n                {\n                    \"ddd\": 0,\n                    \"ind\": 3,\n                    \"ty\": 4,\n                    \"nm\": \"planete Outlines - Group 5\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 45,\n                                    \"s\": [\n                                        100\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 102,\n                                    \"s\": [\n                                        100\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.833,\n                                        \"y\": 0.833\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.167,\n                                        \"y\": 0.167\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        327.38,\n                                        267.583,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        25.833,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        -25.833,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        482.38,\n                                        267.583,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                171.76,\n                                193.166,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                50,\n                                50,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ind\": 0,\n                                    \"ty\": \"sh\",\n                                    \"ix\": 1,\n                                    \"ks\": {\n                                        \"a\": 0,\n                                        \"k\": {\n                                            \"i\": [\n                                                [\n                                                    13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    4.38,\n                                                    -4.171\n                                                ],\n                                                [\n                                                    21.913,\n                                                    0\n                                                ],\n                                                [\n                                                    3.575,\n                                                    -18.765\n                                                ],\n                                                [\n                                                    1.851,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -0.011,\n                                                    -0.291\n                                                ],\n                                                [\n                                                    1.599,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.743\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    13.485\n                                                ]\n                                            ],\n                                            \"o\": [\n                                                [\n                                                    -6.526,\n                                                    0\n                                                ],\n                                                [\n                                                    -0.793,\n                                                    -21.719\n                                                ],\n                                                [\n                                                    -19.806,\n                                                    0\n                                                ],\n                                                [\n                                                    -1.734,\n                                                    -0.391\n                                                ],\n                                                [\n                                                    -13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0.293\n                                                ],\n                                                [\n                                                    -1.4,\n                                                    -0.559\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.742\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ]\n                                            ],\n                                            \"v\": [\n                                                [\n                                                    59.669,\n                                                    -8.242\n                                                ],\n                                                [\n                                                    42.84,\n                                                    -1.506\n                                                ],\n                                                [\n                                                    2.287,\n                                                    -40.592\n                                                ],\n                                                [\n                                                    -37.576,\n                                                    -7.638\n                                                ],\n                                                [\n                                                    -42.962,\n                                                    -8.242\n                                                ],\n                                                [\n                                                    -67.378,\n                                                    16.174\n                                                ],\n                                                [\n                                                    -67.356,\n                                                    17.049\n                                                ],\n                                                [\n                                                    -71.878,\n                                                    16.174\n                                                ],\n                                                [\n                                                    -84.086,\n                                                    28.383\n                                                ],\n                                                [\n                                                    -71.878,\n                                                    40.591\n                                                ],\n                                                [\n                                                    59.669,\n                                                    40.591\n                                                ],\n                                                [\n                                                    84.086,\n                                                    16.174\n                                                ]\n                                            ],\n                                            \"c\": true\n                                        },\n                                        \"ix\": 2\n                                    },\n                                    \"nm\": \"Path 1\",\n                                    \"mn\": \"ADBE Vector Shape - Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"fl\",\n                                    \"c\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0.816000007181,\n                                            0.823999980852,\n                                            0.827000038297,\n                                            1\n                                        ],\n                                        \"ix\": 4\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 5\n                                    },\n                                    \"r\": 1,\n                                    \"bm\": 0,\n                                    \"nm\": \"Fill 1\",\n                                    \"mn\": \"ADBE Vector Graphic - Fill\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            171.76,\n                                            193.166\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0,\n                                            0\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            100,\n                                            100\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"Group 5\",\n                            \"np\": 2,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                }\n            ]\n        }\n    ],\n    \"layers\": [\n        {\n            \"ddd\": 0,\n            \"ind\": 1,\n            \"ty\": 0,\n            \"nm\": \"Pre-comp 1\",\n            \"refId\": \"comp_0\",\n            \"sr\": 1,\n            \"ks\": {\n                \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 11\n                },\n                \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 10\n                },\n                \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                        406,\n                        306,\n                        0\n                    ],\n                    \"ix\": 2\n                },\n                \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                        400,\n                        300,\n                        0\n                    ],\n                    \"ix\": 1\n                },\n                \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                        179,\n                        179,\n                        100\n                    ],\n                    \"ix\": 6\n                }\n            },\n            \"ao\": 0,\n            \"w\": 800,\n            \"h\": 600,\n            \"ip\": 0,\n            \"op\": 147,\n            \"st\": 0,\n            \"bm\": 0\n        }\n    ],\n    \"markers\": []\n}"
  },
  {
    "path": "simple_live_app/assets/statement.txt",
    "content": "在使用本软件之前，请您仔细阅读以下内容，并确保您充分理解并同意以下条款：\n1、本软件为开源软件，您可以免费获取并使用该软件。\n2、本软件完全基于您个人意愿使用，您应该对自己的使用行为和所有结果承担全部责任。\n3、本软件仅供学习交流、科研等非商业性质的用途，严禁将本软件用于商业目的。如有任何商业行为，均与本软件无关。\n4、本软件并不保证与所有操作系统或硬件设备兼容。本软件作者或贡献者不对因使用本软件而产生的任何技术或安全问题承担责任。\n5、本软件作者或贡献者不承担因使用本软件而造成的任何直接、间接、特殊或后果性的损失或损害的责任，包括但不限于财产损失、商业利润损失、信息或数据丢失或损坏等。\n6、本软件使用者应遵守国家相关法律法规和使用规范，不得利用本软件从事任何违法违规行为。如因使用本软件而导致的违法行为，使用者应承担相应的法律责任。\n7、本软件不会收集、存储、使用任何用户的个人信息，包括但不限于姓名、地址、电子邮件地址、电话号码等。在使用本软件过程中，不会进行任何形式的个人信息采集。如用户提供任何个人信息，将被视为用户已自愿提供，并且用户将自行承担由此产生的所有法律责任。\n8、本软件作者或贡献者保留随时修改、增加、删除本免责声明中的内容而不另行通知的权利。\n9、如果本软件存在侵犯您的合法权益的情况，请及时与作者联系，作者将会及时删除有关内容。\n如您不同意本免责声明中的任何内容，请勿使用本软件。使用本软件即代表您已完全理解并同意上述内容。"
  },
  {
    "path": "simple_live_app/distribute_options.yaml",
    "content": "output: build/dist/"
  },
  {
    "path": "simple_live_app/ios/.gitignore",
    "content": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/ephemeral/\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "simple_live_app/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>13.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/ios/Flutter/Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/ios/Flutter/Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '13.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\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n    target.build_configurations.each do |config|\n      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n        '$(inherited)',\n\n        ## dart: PermissionGroup.calendar\n        # 'PERMISSION_EVENTS=1',\n\n        ## dart: PermissionGroup.reminders\n        # 'PERMISSION_REMINDERS=1',\n\n        ## dart: PermissionGroup.contacts\n        # 'PERMISSION_CONTACTS=1',\n\n        ## dart: PermissionGroup.camera\n        #'PERMISSION_CAMERA=1',\n\n        ## dart: PermissionGroup.microphone\n        # 'PERMISSION_MICROPHONE=1',\n\n        ## dart: PermissionGroup.speech\n        # 'PERMISSION_SPEECH_RECOGNIZER=1',\n\n        ## dart: PermissionGroup.photos\n        'PERMISSION_PHOTOS=1',\n\n        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]\n        #'PERMISSION_LOCATION=1',\n\n        ## dart: PermissionGroup.notification\n        #'PERMISSION_NOTIFICATIONS=1',\n\n        ## dart: PermissionGroup.mediaLibrary\n        # 'PERMISSION_MEDIA_LIBRARY=1',\n\n        ## dart: PermissionGroup.sensors\n        # 'PERMISSION_SENSORS=1',   \n\n        ## dart: PermissionGroup.bluetooth\n        # 'PERMISSION_BLUETOOTH=1',\n\n        ## dart: PermissionGroup.appTrackingTransparency\n        # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',\n\n        ## dart: PermissionGroup.criticalAlerts\n        # 'PERMISSION_CRITICAL_ALERTS=1'\n      ]\n\n    end \n  end\nend\n"
  },
  {
    "path": "simple_live_app/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@main\n@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n\n  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {\n    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)\n  }\n\n}\n"
  },
  {
    "path": "simple_live_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n    \"images\": [\n        {\n            \"size\": \"20x20\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-20@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"20x20\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-20@3x.png\",\n            \"scale\": \"3x\"\n        },\n        {\n            \"size\": \"29x29\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-29.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"29x29\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-29@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"29x29\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-29@3x.png\",\n            \"scale\": \"3x\"\n        },\n        {\n            \"size\": \"40x40\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-40@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"40x40\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-40@3x.png\",\n            \"scale\": \"3x\"\n        },\n        {\n            \"size\": \"60x60\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-60@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"60x60\",\n            \"idiom\": \"iphone\",\n            \"filename\": \"icon-60@3x.png\",\n            \"scale\": \"3x\"\n        },\n        {\n            \"size\": \"20x20\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-20-ipad.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"20x20\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-20@2x-ipad.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"29x29\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-29-ipad.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"29x29\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-29@2x-ipad.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"40x40\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-40.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"40x40\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-40@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"76x76\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-76.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"76x76\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-76@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"83.5x83.5\",\n            \"idiom\": \"ipad\",\n            \"filename\": \"icon-83.5@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"1024x1024\",\n            \"idiom\": \"ios-marketing\",\n            \"filename\": \"icon-1024.png\",\n            \"scale\": \"1x\"\n        }\n    ],\n    \"info\": {\n        \"version\": 1,\n        \"author\": \"icon.wuruihong.com\"\n    }\n}"
  },
  {
    "path": "simple_live_app/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": "simple_live_app/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": "simple_live_app/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": "simple_live_app/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": "simple_live_app/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>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>Simple Live</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>simple_live_app</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>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\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\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</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>UIBackgroundModes</key>\n\t<array>\n\t\t<string>audio</string>\n\t</array>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>保存图片至相册</string>\n\t<key>UISupportsDocumentBrowser</key>\n\t<true/>\n\t<key>io.flutter.embedded_views_preview</key>\n\t<true/>\n\t<key>NSCameraUsageDescription</key>\n\t<string>用于扫描二维码</string>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneClassName</key><string>UIWindowScene</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key><string>FlutterSceneDelegate</string>\n\t\t\t\t\t<key>UISceneConfigurationName</key><string>flutter</string>\n\t\t\t\t\t<key>UISceneStoryboardFile</key><string>Main</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t73C9599770D417F3E7B681E2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60E92DDDD814CB6531C03BCD /* Pods_Runner.framework */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t0874FB99E210639E7D21C1F0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\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\t2778CC04696D7C0E532931A0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t60E92DDDD814CB6531C03BCD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6C36D91D13E89663DBB13E51 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* 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\t73C9599770D417F3E7B681E2 /* 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\t65B8FB167D986F3BCF168FB6 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t60E92DDDD814CB6531C03BCD /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\tFD158AC2F4211953A42B4A25 /* Pods */,\n\t\t\t\t65B8FB167D986F3BCF168FB6 /* 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\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFD158AC2F4211953A42B4A25 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2778CC04696D7C0E532931A0 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t6C36D91D13E89663DBB13E51 /* Pods-Runner.release.xcconfig */,\n\t\t\t\t0874FB99E210639E7D21C1F0 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEEC3C9B6719E92514BD4D205 /* [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\t6D32CBFCD866586D78A69BE1 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t92FA5F4E31AA12D8C9AA408A /* [CP] Copy Pods Resources */,\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 = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\",\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\t6D32CBFCD866586D78A69BE1 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t92FA5F4E31AA12D8C9AA408A /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\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\tEEC3C9B6719E92514BD4D205 /* [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/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 9R87RMF9C9;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.xycz.simple-live\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 9R87RMF9C9;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.xycz.simple-live\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\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\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 9R87RMF9C9;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.xycz.simple-live\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\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": "simple_live_app/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": "simple_live_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\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      enableGPUValidationMode = \"1\"\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": "simple_live_app/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": "simple_live_app/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": "simple_live_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/lib/app/app_style.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\n\nclass AppColors {\n  static ColorScheme lightColorScheme = ColorScheme.fromSeed(\n    // primarySwatch: Colors.blue,\n    seedColor: const Color(0xff3498db),\n    brightness: Brightness.light,\n  );\n  static ColorScheme darkColorScheme = ColorScheme.fromSeed(\n    seedColor: const Color(0xff3498db),\n    brightness: Brightness.dark,\n  );\n\n  static const Color black333 = Color(0xFF333333);\n}\n\nclass AppStyle {\n  static ThemeData lightTheme = ThemeData(\n    colorScheme: AppColors.lightColorScheme,\n    useMaterial3: true,\n    fontFamily: Platform.isWindows ? \"Microsoft YaHei\" : null,\n    visualDensity: VisualDensity.standard,\n    appBarTheme: AppBarTheme(\n      //elevation: 0,\n      centerTitle: true,\n      titleTextStyle: const TextStyle(\n        fontSize: 16,\n        color: AppColors.black333,\n      ),\n      foregroundColor: AppColors.black333,\n      systemOverlayStyle: SystemUiOverlayStyle.dark.copyWith(\n        systemNavigationBarColor: Colors.transparent,\n      ),\n    ),\n\n    // radioTheme: RadioThemeData(\n    //   fillColor: MaterialStateProperty.all(AppColors.lightColorScheme.primary),\n    // ),\n    // checkboxTheme: CheckboxThemeData(\n    //   fillColor: MaterialStateProperty.all(AppColors.lightColorScheme.primary),\n    // ),\n    // tabBarTheme: TabBarTheme(\n    //   labelColor: AppColors.lightColorScheme.primary,\n    //   unselectedLabelColor: Colors.white70,\n    //   indicatorSize: TabBarIndicatorSize.tab,\n    //   indicator: RectangularIndicator(\n    //     color: Colors.white.withOpacity(.8),\n    //     topLeftRadius: 24,\n    //     bottomLeftRadius: 24,\n    //     topRightRadius: 24,\n    //     bottomRightRadius: 24,\n    //     verticalPadding: 8,\n    //     horizontalPadding: 0,\n    //   ),\n    // ),\n  );\n\n  static ThemeData darkTheme = ThemeData.dark().copyWith(\n    colorScheme: AppColors.darkColorScheme,\n    visualDensity: VisualDensity.standard,\n    textTheme: ThemeData.dark().textTheme.apply(\n          fontFamily: Platform.isWindows ? \"Microsoft YaHei\" : null,\n        ),\n    primaryTextTheme: ThemeData().textTheme.apply(\n          fontFamily: Platform.isWindows ? \"Microsoft YaHei\" : null,\n        ),\n    appBarTheme: AppBarTheme(\n      //elevation: 0,\n\n      centerTitle: true,\n      titleTextStyle: const TextStyle(\n        fontSize: 16,\n        color: Colors.white,\n      ),\n      foregroundColor: Colors.white,\n      systemOverlayStyle: SystemUiOverlayStyle.light.copyWith(\n        systemNavigationBarColor: Colors.transparent,\n      ),\n    ),\n    // radioTheme: RadioThemeData(\n    //   fillColor: MaterialStateProperty.all(AppColors.darkColorScheme.primary),\n    // ),\n    // checkboxTheme: CheckboxThemeData(\n    //   fillColor: MaterialStateProperty.all(AppColors.darkColorScheme.primary),\n    // ),\n    // tabBarTheme: TabBarTheme(\n    //   labelColor: AppColors.darkColorScheme.primary,\n    //   unselectedLabelColor: Colors.white70,\n    //   indicator: RectangularIndicator(\n    //     color: Colors.white.withAlpha(50),\n    //     topLeftRadius: 24,\n    //     bottomLeftRadius: 24,\n    //     topRightRadius: 24,\n    //     bottomRightRadius: 24,\n    //     verticalPadding: 8,\n    //     horizontalPadding: 0,\n    //   ),\n    // ),\n  );\n  static const vGap4 = SizedBox(\n    height: 4,\n  );\n  static const vGap8 = SizedBox(\n    height: 8,\n  );\n  static const vGap12 = SizedBox(\n    height: 12,\n  );\n  static const vGap24 = SizedBox(\n    height: 24,\n  );\n  static const vGap32 = SizedBox(\n    height: 32,\n  );\n  static const vGap48 = SizedBox(\n    height: 48,\n  );\n\n  static const hGap4 = SizedBox(\n    width: 4,\n  );\n  static const hGap8 = SizedBox(\n    width: 8,\n  );\n  static const hGap12 = SizedBox(\n    width: 12,\n  );\n  static const hGap16 = SizedBox(\n    width: 16,\n  );\n\n  static const hGap24 = SizedBox(\n    width: 24,\n  );\n  static const hGap32 = SizedBox(\n    width: 32,\n  );\n  static const hGap48 = SizedBox(\n    width: 48,\n  );\n\n  static const edgeInsetsH4 = EdgeInsets.symmetric(horizontal: 4);\n  static const edgeInsetsH8 = EdgeInsets.symmetric(horizontal: 8);\n  static const edgeInsetsH12 = EdgeInsets.symmetric(horizontal: 12);\n  static const edgeInsetsH16 = EdgeInsets.symmetric(horizontal: 16);\n  static const edgeInsetsH20 = EdgeInsets.symmetric(horizontal: 20);\n  static const edgeInsetsH24 = EdgeInsets.symmetric(horizontal: 24);\n\n  static const edgeInsetsV4 = EdgeInsets.symmetric(vertical: 4);\n  static const edgeInsetsV8 = EdgeInsets.symmetric(vertical: 8);\n  static const edgeInsetsV12 = EdgeInsets.symmetric(vertical: 12);\n  static const edgeInsetsV24 = EdgeInsets.symmetric(vertical: 24);\n\n  static const edgeInsetsA4 = EdgeInsets.all(4);\n  static const edgeInsetsA8 = EdgeInsets.all(8);\n  static const edgeInsetsA12 = EdgeInsets.all(12);\n  static const edgeInsetsA16 = EdgeInsets.all(16);\n  static const edgeInsetsA20 = EdgeInsets.all(20);\n  static const edgeInsetsA24 = EdgeInsets.all(24);\n\n  static const edgeInsetsR4 = EdgeInsets.only(right: 4);\n  static const edgeInsetsR8 = EdgeInsets.only(right: 8);\n  static const edgeInsetsR12 = EdgeInsets.only(right: 12);\n  static const edgeInsetsR16 = EdgeInsets.only(right: 16);\n  static const edgeInsetsR20 = EdgeInsets.only(right: 20);\n  static const edgeInsetsR24 = EdgeInsets.only(right: 24);\n\n  static const edgeInsetsL4 = EdgeInsets.only(left: 4);\n  static const edgeInsetsL8 = EdgeInsets.only(left: 8);\n  static const edgeInsetsL12 = EdgeInsets.only(left: 12);\n  static const edgeInsetsL16 = EdgeInsets.only(left: 16);\n  static const edgeInsetsL20 = EdgeInsets.only(left: 20);\n  static const edgeInsetsL24 = EdgeInsets.only(left: 24);\n\n  static const edgeInsetsT4 = EdgeInsets.only(top: 4);\n  static const edgeInsetsT8 = EdgeInsets.only(top: 8);\n  static const edgeInsetsT12 = EdgeInsets.only(top: 12);\n  static const edgeInsetsT24 = EdgeInsets.only(top: 24);\n\n  static const edgeInsetsB4 = EdgeInsets.only(bottom: 4);\n  static const edgeInsetsB8 = EdgeInsets.only(bottom: 8);\n  static const edgeInsetsB12 = EdgeInsets.only(bottom: 12);\n  static const edgeInsetsB24 = EdgeInsets.only(bottom: 24);\n\n  static BorderRadius radius4 = BorderRadius.circular(4);\n  static BorderRadius radius8 = BorderRadius.circular(8);\n  static BorderRadius radius12 = BorderRadius.circular(12);\n  static BorderRadius radius24 = BorderRadius.circular(24);\n  static BorderRadius radius32 = BorderRadius.circular(32);\n  static BorderRadius radius48 = BorderRadius.circular(48);\n\n  /// 顶部状态栏的高度\n  static double get statusBarHeight => MediaQuery.of(Get.context!).padding.top;\n\n  /// 底部导航条的高度\n  static double get bottomBarHeight =>\n      MediaQuery.of(Get.context!).padding.bottom;\n\n  static Divider get divider => Divider(\n        height: 1,\n        thickness: 1,\n        indent: 16,\n        endIndent: 16,\n        color: Colors.grey.withAlpha(25),\n      );\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/constant.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:remixicon/remixicon.dart';\n\nclass Constant {\n  static const String kUpdateFollow = \"UpdateFollow\";\n  static const String kUpdateHistory = \"UpdateHistory\";\n\n  static final Map<String, HomePageItem> allHomePages = {\n    \"recommend\": HomePageItem(\n      iconData: Remix.home_smile_line,\n      title: \"首页\",\n      index: 0,\n    ),\n    \"follow\": HomePageItem(\n      iconData: Remix.heart_line,\n      title: \"关注\",\n      index: 1,\n    ),\n    \"category\": HomePageItem(\n      iconData: Remix.apps_line,\n      title: \"分类\",\n      index: 2,\n    ),\n    \"user\": HomePageItem(\n      iconData: Remix.user_smile_line,\n      title: \"我的\",\n      index: 3,\n    ),\n  };\n\n  static const String kBiliBili = \"bilibili\";\n  static const String kDouyu = \"douyu\";\n  static const String kHuya = \"huya\";\n  static const String kDouyin = \"douyin\";\n}\n\nclass HomePageItem {\n  final IconData iconData;\n  final String title;\n  final int index;\n  HomePageItem({\n    required this.iconData,\n    required this.title,\n    required this.index,\n  });\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/controller/app_settings_controller.dart",
    "content": "import 'dart:io';\n\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass AppSettingsController extends GetxController {\n  static AppSettingsController get instance =>\n      Get.find<AppSettingsController>();\n\n  /// 缩放模式\n  var scaleMode = 0.obs;\n\n  var themeMode = 0.obs;\n\n  var firstRun = false;\n\n  @override\n  void onInit() {\n    themeMode.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kThemeMode, 0);\n    firstRun = LocalStorageService.instance\n        .getValue(LocalStorageService.kFirstRun, true);\n    danmuSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuSize, 16.0);\n    danmuOpacity.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuOpacity, 1.0);\n    danmuArea.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuArea, 0.8);\n    danmuSpeed.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuSpeed, 10.0);\n    danmuEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuEnable, true);\n    danmuStrokeWidth.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuStrokeWidth, 2.0);\n    danmuTopMargin.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuTopMargin, 0.0);\n    danmuBottomMargin.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuBottomMargin, 0.0);\n    danmuFontWeight.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuFontWeight, 4);\n\n    hardwareDecode.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kHardwareDecode, true);\n    chatTextSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kChatTextSize, 14.0);\n\n    chatTextGap.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kChatTextGap, 4.0);\n\n    chatBubbleStyle.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kChatBubbleStyle,\n      false,\n    );\n\n    qualityLevel.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kQualityLevel, 1);\n    qualityLevelCellular.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kQualityLevelCellular, 1);\n\n    autoExitEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoExitEnable, false);\n\n    autoExitDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoExitDuration, 60);\n\n    roomAutoExitDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kRoomAutoExitDuration, 60);\n\n    playerCompatMode.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerCompatMode, false);\n\n    playerAutoPause.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerAutoPause, false);\n\n    playerForceHttps.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerForceHttps, false);\n\n    autoFullScreen.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoFullScreen, false);\n\n    // ignore: invalid_use_of_protected_member\n    shieldList.value = LocalStorageService.instance.shieldBox.values.toSet();\n\n    scaleMode.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kPlayerScaleMode,\n      0,\n    );\n\n    playerVolume.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kPlayerVolume,\n      100.0,\n    );\n    pipHideDanmu.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPIPHideDanmu, true);\n\n    styleColor.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kStyleColor, 0xff3498db);\n\n    isDynamic.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kIsDynamic, false);\n\n    bilibiliLoginTip.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kBilibiliLoginTip, true);\n\n    playerBufferSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerBufferSize, 32);\n\n    logEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kLogEnable, false);\n    if (logEnable.value) {\n      Log.initWriter();\n    }\n\n    customPlayerOutput.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kCustomPlayerOutput, false);\n\n    videoOutputDriver.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kVideoOutputDriver,\n      Platform.isAndroid ? \"gpu\" : \"libmpv\",\n    );\n\n    audioOutputDriver.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kAudioOutputDriver,\n      Platform.isAndroid\n          ? \"audiotrack\"\n          : Platform.isLinux\n              ? \"pulse\"\n              : Platform.isWindows\n                  ? \"wasapi\"\n                  : Platform.isIOS\n                      ? \"audiounit\"\n                      : Platform.isMacOS\n                          ? \"coreaudio\"\n                          : \"sdl\",\n    );\n\n    videoHardwareDecoder.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kVideoHardwareDecoder,\n      Platform.isAndroid ? \"auto-safe\" : \"auto\",\n    );\n\n    autoUpdateFollowEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoUpdateFollowEnable, true);\n\n    autoUpdateFollowDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kUpdateFollowDuration, 10);\n\n    updateFollowThreadCount.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kUpdateFollowThreadCount, 0);  // 默认 0 = 自动\n\n    initSiteSort();\n    initHomeSort();\n\n    super.onInit();\n  }\n\n  void initSiteSort() {\n    var sort = LocalStorageService.instance\n        .getValue(\n          LocalStorageService.kSiteSort,\n          Sites.allSites.keys.join(\",\"),\n        )\n        .split(\",\");\n    //如果数量与allSites的数量不一致，将缺失的添加上\n    if (sort.length != Sites.allSites.length) {\n      var keys = Sites.allSites.keys.toList();\n      for (var i = 0; i < keys.length; i++) {\n        if (!sort.contains(keys[i])) {\n          sort.add(keys[i]);\n        }\n      }\n    }\n\n    siteSort.value = sort;\n  }\n\n  void initHomeSort() {\n    var sort = LocalStorageService.instance\n        .getValue(\n          LocalStorageService.kHomeSort,\n          Constant.allHomePages.keys.join(\",\"),\n        )\n        .split(\",\");\n    //如果数量与allSites的数量不一致，将缺失的添加上\n    if (sort.length != Constant.allHomePages.length) {\n      var keys = Constant.allHomePages.keys.toList();\n      for (var i = 0; i < keys.length; i++) {\n        if (!sort.contains(keys[i])) {\n          sort.add(keys[i]);\n        }\n      }\n    }\n\n    homeSort.value = sort;\n  }\n\n  void setNoFirstRun() {\n    LocalStorageService.instance.setValue(LocalStorageService.kFirstRun, false);\n  }\n\n  void changeTheme() {\n    Get.dialog(\n      RadioGroup(\n        groupValue: themeMode.value,\n        onChanged: (e) {\n          Get.back();\n          setTheme(e ?? 0);\n        },\n        child: const SimpleDialog(\n          title: Text(\"设置主题\"),\n          children: [\n            RadioListTile<int>(\n              title: Text(\"跟随系统\"),\n              value: 0,\n            ),\n            RadioListTile<int>(\n              title: Text(\"浅色模式\"),\n              value: 1,\n            ),\n            RadioListTile<int>(\n              title: Text(\"深色模式\"),\n              value: 2,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void setTheme(int i) {\n    themeMode.value = i;\n    var mode = ThemeMode.values[i];\n\n    LocalStorageService.instance.setValue(LocalStorageService.kThemeMode, i);\n    Get.changeThemeMode(mode);\n  }\n\n  var hardwareDecode = true.obs;\n  void setHardwareDecode(bool e) {\n    hardwareDecode.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kHardwareDecode, e);\n  }\n\n  var chatTextSize = 14.0.obs;\n  void setChatTextSize(double e) {\n    chatTextSize.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kChatTextSize, e);\n  }\n\n  var chatTextGap = 4.0.obs;\n  void setChatTextGap(double e) {\n    chatTextGap.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kChatTextGap, e);\n  }\n\n  var chatBubbleStyle = false.obs;\n  void setChatBubbleStyle(bool e) {\n    chatBubbleStyle.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kChatBubbleStyle, e);\n  }\n\n  var danmuSize = 16.0.obs;\n  void setDanmuSize(double e) {\n    danmuSize.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuSize, e);\n  }\n\n  var danmuSpeed = 10.0.obs;\n  void setDanmuSpeed(double e) {\n    danmuSpeed.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuSpeed, e);\n  }\n\n  var danmuArea = 0.8.obs;\n  void setDanmuArea(double e) {\n    danmuArea.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuArea, e);\n  }\n\n  var danmuOpacity = 1.0.obs;\n  void setDanmuOpacity(double e) {\n    danmuOpacity.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuOpacity, e);\n  }\n\n  var danmuEnable = true.obs;\n  void setDanmuEnable(bool e) {\n    danmuEnable.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuEnable, e);\n  }\n\n  var danmuStrokeWidth = 2.0.obs;\n  void setDanmuStrokeWidth(double e) {\n    danmuStrokeWidth.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuStrokeWidth, e);\n  }\n\n  var danmuFontWeight = 4.obs;\n  void setDanmuFontWeight(int e) {\n    danmuFontWeight.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuFontWeight, e);\n  }\n\n  var qualityLevel = 1.obs;\n  void setQualityLevel(int level) {\n    qualityLevel.value = level;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kQualityLevel, level);\n  }\n\n  var qualityLevelCellular = 1.obs;\n  void setQualityLevelCellular(int level) {\n    qualityLevelCellular.value = level;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kQualityLevelCellular, level);\n  }\n\n  var autoExitEnable = false.obs;\n  void setAutoExitEnable(bool e) {\n    autoExitEnable.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoExitEnable, e);\n  }\n\n  var autoExitDuration = 60.obs;\n  void setAutoExitDuration(int e) {\n    autoExitDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoExitDuration, e);\n  }\n\n  var roomAutoExitDuration = 60.obs;\n  void setRoomAutoExitDuration(int e) {\n    roomAutoExitDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kRoomAutoExitDuration, e);\n  }\n\n  var playerCompatMode = false.obs;\n  void setPlayerCompatMode(bool e) {\n    playerCompatMode.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerCompatMode, e);\n  }\n\n  var playerBufferSize = 32.obs;\n  void setPlayerBufferSize(int e) {\n    playerBufferSize.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerBufferSize, e);\n  }\n\n  var playerAutoPause = false.obs;\n  void setPlayerAutoPause(bool e) {\n    playerAutoPause.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerAutoPause, e);\n  }\n\n  var autoFullScreen = false.obs;\n  void setAutoFullScreen(bool e) {\n    autoFullScreen.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoFullScreen, e);\n  }\n\n  var playershowSuperChat = true.obs;\n  void setPlayerShowSuperChat(bool e) {\n    playershowSuperChat.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerShowSuperChat, e);\n  }\n\n  RxSet<String> shieldList = <String>{}.obs;\n  void addShieldList(String e) {\n    shieldList.add(e);\n    LocalStorageService.instance.shieldBox.put(e, e);\n  }\n\n  void removeShieldList(String e) {\n    shieldList.remove(e);\n    LocalStorageService.instance.shieldBox.delete(e);\n  }\n\n  Future clearShieldList() async {\n    shieldList.clear();\n    await LocalStorageService.instance.shieldBox.clear();\n  }\n\n  void setScaleMode(int value) {\n    scaleMode.value = value;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kPlayerScaleMode,\n      value,\n    );\n  }\n\n  RxList<String> siteSort = RxList<String>();\n  void setSiteSort(List<String> e) {\n    siteSort.value = e;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kSiteSort,\n      siteSort.join(\",\"),\n    );\n  }\n\n  RxList<String> homeSort = RxList<String>();\n  void setHomeSort(List<String> e) {\n    homeSort.value = e;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kHomeSort,\n      homeSort.join(\",\"),\n    );\n  }\n\n  Rx<double> playerVolume = 100.0.obs;\n  void setPlayerVolume(double value) {\n    playerVolume.value = value;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kPlayerVolume,\n      value,\n    );\n  }\n\n  var pipHideDanmu = true.obs;\n  void setPIPHideDanmu(bool e) {\n    pipHideDanmu.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kPIPHideDanmu, e);\n  }\n\n  var styleColor = 0xff3498db.obs;\n  void setStyleColor(int e) {\n    styleColor.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kStyleColor, e);\n  }\n\n  var isDynamic = false.obs;\n  void setIsDynamic(bool e) {\n    isDynamic.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kIsDynamic, e);\n  }\n\n  var danmuTopMargin = 0.0.obs;\n  void setDanmuTopMargin(double e) {\n    danmuTopMargin.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuTopMargin, e);\n  }\n\n  var danmuBottomMargin = 0.0.obs;\n  void setDanmuBottomMargin(double e) {\n    danmuBottomMargin.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuBottomMargin, e);\n  }\n\n  var bilibiliLoginTip = true.obs;\n  void setBiliBiliLoginTip(bool e) {\n    bilibiliLoginTip.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliLoginTip, e);\n  }\n\n  var logEnable = false.obs;\n  void setLogEnable(bool e) {\n    logEnable.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kLogEnable, e);\n  }\n\n  var customPlayerOutput = false.obs;\n  void setCustomPlayerOutput(bool e) {\n    customPlayerOutput.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kCustomPlayerOutput, e);\n  }\n\n  var videoOutputDriver = \"\".obs;\n  void setVideoOutputDriver(String e) {\n    videoOutputDriver.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kVideoOutputDriver, e);\n  }\n\n  var audioOutputDriver = \"\".obs;\n  void setAudioOutputDriver(String e) {\n    audioOutputDriver.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAudioOutputDriver, e);\n  }\n\n  var videoHardwareDecoder = \"\".obs;\n  void setVideoHardwareDecoder(String e) {\n    videoHardwareDecoder.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kVideoHardwareDecoder, e);\n  }\n\n  var autoUpdateFollowEnable = false.obs;\n  void setAutoUpdateFollowEnable(bool e) {\n    autoUpdateFollowEnable.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoUpdateFollowEnable, e);\n  }\n\n  var autoUpdateFollowDuration = 10.obs;\n  void setAutoUpdateFollowDuration(int e) {\n    autoUpdateFollowDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kUpdateFollowDuration, e);\n  }\n\n  var updateFollowThreadCount = 4.obs;\n  void setUpdateFollowThreadCount(int e) {\n    updateFollowThreadCount.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kUpdateFollowThreadCount, e);\n  }\n\n  var playerForceHttps = false.obs;\n  void setPlayerForceHttps(bool e) {\n    playerForceHttps.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerForceHttps, e);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/controller/base_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/widgets.dart';\n\nimport 'package:simple_live_app/app/log.dart';\n\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass BaseController extends GetxController {\n  /// 加载中，更新页面\n  var pageLoadding = false.obs;\n\n  /// 加载中,不会更新页面\n  var loadding = false;\n\n  /// 空白页面\n  var pageEmpty = false.obs;\n\n  /// 页面错误\n  var pageError = false.obs;\n\n  /// 未登录\n  var notLogin = false.obs;\n\n  /// 错误信息\n  var errorMsg = \"\".obs;\n\n  /// 显示错误\n  /// * [msg] 错误信息\n  /// * [showPageError] 显示页面错误\n  /// * 只在第一页加载错误时showPageError=true，后续页加载错误时使用Toast弹出通知\n  void handleError(Object exception, {bool showPageError = false}) {\n    Log.e(exception.toString(), StackTrace.current);\n    var msg = exceptionToString(exception);\n\n    if (showPageError) {\n      pageError.value = true;\n      errorMsg.value = msg;\n    } else {\n      SmartDialog.showToast(exceptionToString(msg));\n    }\n  }\n\n  String exceptionToString(Object exception) {\n    return exception.toString().replaceAll(\"Exception:\", \"\");\n  }\n\n  void onLogin() {}\n  void onLogout() {}\n}\n\nclass BasePageController<T> extends BaseController {\n  final ScrollController scrollController = ScrollController();\n  final EasyRefreshController easyRefreshController = EasyRefreshController();\n  int currentPage = 1;\n  int count = 0;\n  int maxPage = 0;\n  int pageSize = 24;\n  var canLoadMore = false.obs;\n  var list = <T>[].obs;\n\n  Future refreshData() async {\n    currentPage = 1;\n    list.value = [];\n    await loadData();\n  }\n\n  Future loadData() async {\n    try {\n      if (loadding) return;\n      loadding = true;\n      pageError.value = false;\n      pageEmpty.value = false;\n      notLogin.value = false;\n      pageLoadding.value = currentPage == 1;\n\n      var result = await getData(currentPage, pageSize);\n      //是否可以加载更多\n      if (result.isNotEmpty) {\n        currentPage++;\n        canLoadMore.value = true;\n        pageEmpty.value = false;\n      } else {\n        canLoadMore.value = false;\n        if (currentPage == 1) {\n          pageEmpty.value = true;\n        }\n      }\n      // 赋值数据\n      if (currentPage == 1) {\n        list.value = result;\n      } else {\n        list.addAll(result);\n      }\n    } catch (e) {\n      handleError(e, showPageError: currentPage == 1);\n    } finally {\n      loadding = false;\n      pageLoadding.value = false;\n    }\n  }\n\n  Future<List<T>> getData(int page, int pageSize) async {\n    return [];\n  }\n\n  void scrollToTopOrRefresh() {\n    if (scrollController.offset > 0) {\n      scrollController.animateTo(\n        0,\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.linear,\n      );\n    } else {\n      easyRefreshController.callRefresh();\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/custom_throttle.dart",
    "content": "/// 这个类的目的是简化 throttle 的操作，以便更好的理解代码\n/// 主要作用：节流，如果在很短时间内都会调用同一个方法，除了第一个方法有用以外\n/// 剩下的方法将会被舍弃，在 [eachDelayMilli] 时间后，才会允许下一次调用\n/// 会保存一个方法，在最后还会调用一次，和普通的 throttle 不太一样\nclass DelayedThrottle {\n  bool isInvoking = false;\n  int eachDelayMilli;\n  Future Function()? storeFunc;\n\n  DelayedThrottle(this.eachDelayMilli);\n\n  void invoke(Future Function() longCostFunc) {\n    if (isInvoking) {\n      storeFunc = longCostFunc;\n      return;\n    }\n    storeFunc = null;\n    isInvoking = true;\n    longCostFunc().then((value) {\n      Future.delayed(Duration(milliseconds: eachDelayMilli), () {\n        isInvoking = false;\n        if (storeFunc != null) {\n          invoke(storeFunc!);\n        }\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/event_bus.dart",
    "content": "import 'dart:async';\n\nimport 'package:simple_live_app/app/log.dart';\n\n/// 全局事件\nclass EventBus {\n  /// 点击了底部导航\n  static const String kBottomNavigationBarClicked =\n      \"BottomNavigationBarClicked\";\n  static EventBus? _instance;\n\n  static EventBus get instance {\n    _instance ??= EventBus();\n    return _instance!;\n  }\n\n  final Map<String, StreamController> _streams = {};\n\n  /// 触发事件\n  void emit<T>(String name, T data) {\n    if (!_streams.containsKey(name)) {\n      _streams.addAll({name: StreamController.broadcast()});\n    }\n    Log.d(\"Emit Event：$name\\r\\n$data\");\n\n    _streams[name]!.add(data);\n  }\n\n  /// 监听事件\n  StreamSubscription<dynamic> listen(String name, Function(dynamic)? onData) {\n    if (!_streams.containsKey(name)) {\n      _streams.addAll({name: StreamController.broadcast()});\n    }\n    return _streams[name]!.stream.listen(onData);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/log.dart",
    "content": "import 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:intl/intl.dart';\nimport 'package:logger/logger.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:simple_live_app/app/utils.dart';\n\nclass Log {\n  static LogFileWriter? logFileWriter;\n  static void initWriter() {\n    logFileWriter = LogFileWriter();\n  }\n\n  static void disposeWriter() {\n    logFileWriter?.close();\n    logFileWriter = null;\n  }\n\n  static void writeLog(content, [Level level = Level.info]) {\n    logFileWriter\n        ?.write(\"[${level.name.toUpperCase()}] $_currentTime：$content\");\n  }\n\n  static RxList<DebugLogModel> debugLogs = <DebugLogModel>[].obs;\n\n  static void addDebugLog(String content, Color? color) {\n    if (kReleaseMode) {\n      return;\n    }\n    if (content.contains(\"请求响应\")) {\n      content = content.split(\"\\n\").join('\\n💡 ');\n    }\n    try {\n      debugLogs.insert(0, DebugLogModel(DateTime.now(), content, color: color));\n    } catch (e) {\n      if (kDebugMode) {\n        print(e);\n      }\n    }\n  }\n\n  static Logger logger = Logger(\n    printer: PrettyPrinter(\n      methodCount: 0,\n      errorMethodCount: 8,\n      lineLength: 120,\n      colors: true,\n      printEmojis: true,\n      dateTimeFormat: DateTimeFormat.none,\n    ),\n  );\n\n  static void d(String message, [bool writeFile = true]) {\n    addDebugLog(message, Colors.orange);\n    logger.d(\"${DateTime.now().toString()}\\n$message\");\n    if (writeFile) {\n      writeLog(message, Level.debug);\n    }\n  }\n\n  static void i(String message, [bool writeFile = true]) {\n    addDebugLog(message, Colors.blue);\n    logger.i(\"${DateTime.now().toString()}\\n$message\");\n    if (writeFile) {\n      logFileWriter?.write(\"[INFO] $_currentTime：$message\");\n      writeLog(message, Level.info);\n    }\n  }\n\n  static void e(String message, StackTrace stackTrace,\n      [bool writeFile = true]) {\n    addDebugLog('$message\\r\\n\\r\\n$stackTrace', Colors.red);\n    logger.e(\"${DateTime.now().toString()}\\n$message\", stackTrace: stackTrace);\n    if (writeFile) {\n      writeLog(\"$message\\n$stackTrace\", Level.error);\n    }\n  }\n\n  static void w(String message, [bool writeFile = true]) {\n    addDebugLog(message, Colors.pink);\n    logger.w(\"${DateTime.now().toString()}\\n$message\");\n    if (writeFile) {\n      writeLog(message, Level.warning);\n    }\n  }\n\n  static void logPrint(dynamic obj, [bool writeFile = true]) {\n    addDebugLog(obj.toString(), Colors.red);\n    if (writeFile) {\n      writeLog(obj, Level.info);\n    }\n    //logger.e(obj.toString(), obj, obj?.stackTrace);\n    if (kDebugMode) {\n      print(obj);\n    }\n  }\n\n  static String get _currentTime => Utils.timeFormat.format(DateTime.now());\n}\n\nclass LogFileWriter {\n  late String fileName;\n  LogFileWriter() {\n    var dt = DateFormat(\"yyyy-MM-dd HH-mm-ss\").format(DateTime.now());\n    fileName = \"$dt.log\";\n    initFile();\n  }\n  IOSink? fileWriter;\n  void initFile() async {\n    var supportDir = await getApplicationSupportDirectory();\n    var logDir = Directory(\"${supportDir.path}/log\");\n    if (!await logDir.exists()) {\n      await logDir.create();\n    }\n    var logFile = File(\"${logDir.path}/$fileName\");\n    fileWriter = logFile.openWrite(mode: FileMode.append);\n    writeSystemInfo();\n  }\n\n  void write(String content) {\n    fileWriter?.write(content);\n    fileWriter?.write(\"\\r\\n\");\n  }\n\n  Future close() async {\n    await fileWriter?.close();\n  }\n\n  void writeSystemInfo() async {\n    DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n    write(\"System Info:\");\n    write(\"Current Time: ${DateTime.now()}\");\n    write(\"Platform: ${Platform.operatingSystem}\");\n    write(\"Version: ${Platform.operatingSystemVersion}\");\n    write(\"Local: ${Platform.localeName}\");\n    write(\n        \"App Version: ${Utils.packageInfo.version}+${Utils.packageInfo.buildNumber}\");\n    if (Platform.isAndroid) {\n      write((await deviceInfo.androidInfo).data.toString());\n    } else if (Platform.isIOS) {\n      write((await deviceInfo.iosInfo).data.toString());\n    } else if (Platform.isLinux) {\n      write((await deviceInfo.linuxInfo).data.toString());\n    } else if (Platform.isMacOS) {\n      write((await deviceInfo.macOsInfo).data.toString());\n    } else if (Platform.isWindows) {\n      write((await deviceInfo.windowsInfo).data.toString());\n    }\n    write(\"End System Info\");\n  }\n}\n\nclass DebugLogModel {\n  final String content;\n  final DateTime datetime;\n  final Color? color;\n  DebugLogModel(this.datetime, this.content, {this.color});\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/sites.dart",
    "content": "import 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass Sites {\n  static final Map<String, Site> allSites = {\n    Constant.kBiliBili: Site(\n      id: Constant.kBiliBili,\n      logo: \"assets/images/bilibili_2.png\",\n      name: \"哔哩哔哩\",\n      liveSite: BiliBiliSite(),\n    ),\n    Constant.kDouyu: Site(\n      id: Constant.kDouyu,\n      logo: \"assets/images/douyu.png\",\n      name: \"斗鱼直播\",\n      liveSite: DouyuSite(),\n    ),\n    Constant.kHuya: Site(\n      id: Constant.kHuya,\n      logo: \"assets/images/huya.png\",\n      name: \"虎牙直播\",\n      liveSite: HuyaSite(),\n    ),\n    Constant.kDouyin: Site(\n      id: Constant.kDouyin,\n      logo: \"assets/images/douyin.png\",\n      name: \"抖音直播\",\n      liveSite: DouyinSite(),\n    ),\n  };\n\n  static List<Site> get supportSites {\n    return AppSettingsController.instance.siteSort\n        .map((key) => allSites[key]!)\n        .toList();\n  }\n}\n\nclass Site {\n  final String id;\n  final String name;\n  final String logo;\n  final LiveSite liveSite;\n  Site({\n    required this.id,\n    required this.liveSite,\n    required this.logo,\n    required this.name,\n  });\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/utils/archive.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:archive/archive_io.dart';\nimport 'package:path/path.dart';\n\nextension ArchiveExt on Archive {\n  addDirectoryToArchive(String dirPath, String parentPath) {\n    final dir = Directory(dirPath);\n    final entities = dir.listSync(recursive: false);\n    for (final entity in entities) {\n      final relativePath = relative(entity.path, from: parentPath);\n      if (entity is File) {\n        final data = entity.readAsBytesSync();\n        final archiveFile = ArchiveFile(relativePath, data.length, data);\n        addFile(archiveFile);\n      } else if (entity is Directory) {\n        addDirectoryToArchive(entity.path, parentPath);\n      }\n    }\n  }\n\n  add<T>(String name, T raw) {\n    final data = json.encode(raw);\n    addFile(\n        // 这样会出现问题 不清楚原因\n        ArchiveFile.string(name, data)\n        //ArchiveFile(name, data.length, data),\n        );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/utils/document.dart",
    "content": "import 'dart:io';\n\nimport 'package:simple_live_app/app/log.dart';\n\n// 扩展 Directory 类，添加清空文件夹的功能并验证是否为文件夹\nextension DirectoryCleaner on Directory {\n  Future<void> clear() async {\n    // 首先判断是否为文件夹\n    if (await exists() && await FileSystemEntity.isDirectory(path)) {\n      // 列出文件夹中的所有文件和子文件夹\n      List<FileSystemEntity> files = listSync();\n\n      // 遍历文件列表并删除每个文件或子文件夹\n      for (FileSystemEntity file in files) {\n        if (file is File) {\n          await file.delete();\n          Log.i('删除文件: ${file.path}');\n        } else if (file is Directory) {\n          await Directory(file.path).delete(recursive: true);\n          Log.i('删除文件夹: ${file.path}');\n        }\n      }\n\n      Log.i('文件夹清空完成');\n    } else {\n      Log.i('$path 不是一个有效的文件夹');\n    }\n  }\n  // 阻塞主线程\n  void clearSync()  {\n    if ( existsSync() && FileSystemEntity.isDirectorySync(path)) {\n      List<FileSystemEntity> files = listSync();\n      for (FileSystemEntity file in files) {\n        if (file is File) {\n          file.deleteSync();\n          Log.i('删除文件: ${file.path}');\n        } else if (file is Directory) {\n          Directory(file.path).deleteSync(recursive: true);\n          Log.i('删除文件夹: ${file.path}');\n        }\n      }\n\n      Log.i('文件夹清空完成');\n    } else {\n      Log.i('$path 不是一个有效的文件夹');\n    }\n  }\n}"
  },
  {
    "path": "simple_live_app/lib/app/utils/listen_fourth_button.dart",
    "content": "import 'package:flutter/gestures.dart';\n\n/// 鼠标侧键点击手势识别器\n/// - https://github.com/flutter/flutter/issues/115641\n/// - https://github.com/witnet/my-wit-wallet/pull/261\nclass FourthButtonTapGestureRecognizer extends BaseTapGestureRecognizer {\n  GestureTapDownCallback? onTapDown;\n\n  @override\n  void handleTapDown({required PointerDownEvent down}) {\n    final TapDownDetails details = TapDownDetails(\n      globalPosition: down.position,\n      localPosition: down.localPosition,\n      kind: getKindForPointer(down.pointer),\n    );\n    switch (down.buttons) {\n      case 8:\n        if (onTapDown != null) {\n          invokeCallback<void>('onTapDown', () => onTapDown!(details));\n        }\n        break;\n      default:\n    }\n  }\n\n  @override\n  void handleTapCancel(\n      {required PointerDownEvent down,\n      PointerCancelEvent? cancel,\n      required String reason}) {}\n\n  @override\n  void handleTapUp(\n      {required PointerDownEvent down, required PointerUpEvent up}) {}\n}\n"
  },
  {
    "path": "simple_live_app/lib/app/utils.dart",
    "content": "import 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:intl/intl.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/log.dart';\n\ntypedef TextValidate = bool Function(String text);\n\nclass Utils {\n  static late PackageInfo packageInfo;\n  static DateFormat dateFormat = DateFormat(\"MM-dd HH:mm\");\n  static DateFormat dateFormatWithYear = DateFormat(\"yyyy-MM-dd HH:mm\");\n  static DateFormat timeFormat = DateFormat(\"HH:mm:ss\");\n\n  /// 处理时间\n  static String parseTime(DateTime? dt) {\n    if (dt == null) {\n      return \"\";\n    }\n\n    var dtNow = DateTime.now();\n    if (dt.year == dtNow.year &&\n        dt.month == dtNow.month &&\n        dt.day == dtNow.day) {\n      return \"${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}\";\n    }\n\n    if (dt.year == dtNow.year) {\n      return dateFormat.format(dt);\n    }\n\n    return dateFormatWithYear.format(dt);\n  }\n\n  /// 提示弹窗\n  /// - `content` 内容\n  /// - `title` 弹窗标题\n  /// - `confirm` 确认按钮内容，留空为确定\n  /// - `cancel` 取消按钮内容，留空为取消\n  static Future<bool> showAlertDialog(\n    String content, {\n    String title = '',\n    String confirm = '',\n    String cancel = '',\n    bool selectable = false,\n    List<Widget>? actions,\n  }) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: Container(\n          constraints: const BoxConstraints(\n            maxHeight: 400,\n          ),\n          child: SingleChildScrollView(\n            child: Padding(\n              padding: AppStyle.edgeInsetsV12,\n              child: selectable ? SelectableText(content) : Text(content),\n            ),\n          ),\n        ),\n        actions: [\n          ...?actions,\n          TextButton(\n            onPressed: (() => Get.back(result: false)),\n            child: Text(cancel.isEmpty ? \"取消\" : cancel),\n          ),\n          TextButton(\n            onPressed: (() => Get.back(result: true)),\n            child: Text(confirm.isEmpty ? \"确定\" : confirm),\n          ),\n        ],\n      ),\n    );\n    return result ?? false;\n  }\n\n  /// 提示弹窗\n  /// - `content` 内容\n  /// - `title` 弹窗标题\n  /// - `confirm` 确认按钮内容，留空为确定\n  static Future<bool> showMessageDialog(String content,\n      {String title = '', String confirm = '', bool selectable = false}) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: Padding(\n          padding: AppStyle.edgeInsetsV12,\n          child: selectable ? SelectableText(content) : Text(content),\n        ),\n        actions: [\n          TextButton(\n            onPressed: (() => Get.back(result: true)),\n            child: Text(confirm.isEmpty ? \"确定\" : confirm),\n          ),\n        ],\n      ),\n    );\n    return result ?? false;\n  }\n\n  static void showRightDialog({\n    required String title,\n    Function()? onDismiss,\n    required Widget child,\n    double width = 320,\n    bool useSystem = false,\n  }) {\n    SmartDialog.show(\n      alignment: Alignment.topRight,\n      animationBuilder: (controller, child, animationParam) {\n        //从右到左\n        return SlideTransition(\n          position: Tween<Offset>(\n            begin: const Offset(1, 0),\n            end: Offset.zero,\n          ).animate(controller.view),\n          child: child,\n        );\n      },\n      useSystem: useSystem,\n      maskColor: Colors.transparent,\n      animationTime: const Duration(milliseconds: 200),\n      builder: (context) => Container(\n        width: width + MediaQuery.of(context).padding.right,\n        padding: EdgeInsets.only(right: MediaQuery.of(context).padding.right),\n        decoration: BoxDecoration(\n          color: Get.theme.cardColor,\n          borderRadius: const BorderRadius.only(\n            topLeft: Radius.circular(4),\n            bottomLeft: Radius.circular(4),\n          ),\n        ),\n        child: SafeArea(\n          left: false,\n          right: false,\n          child: MediaQuery(\n            data: const MediaQueryData(padding: EdgeInsets.zero),\n            child: Column(\n              children: [\n                ListTile(\n                  visualDensity: VisualDensity.compact,\n                  contentPadding: EdgeInsets.zero,\n                  leading: IconButton(\n                    onPressed: () {\n                      SmartDialog.dismiss(status: SmartStatus.allCustom).then(\n                        (value) => onDismiss?.call(),\n                      );\n                    },\n                    icon: const Icon(Icons.arrow_back),\n                  ),\n                  title: Text(\n                    title,\n                    style: Get.textTheme.titleMedium,\n                  ),\n                ),\n                Divider(\n                  height: 1,\n                  color: Colors.grey.withAlpha(25),\n                ),\n                Expanded(\n                  child: child,\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  static void hideRightDialog() {\n    SmartDialog.dismiss(status: SmartStatus.allCustom);\n  }\n\n  static Future showBottomSheet({\n    required String title,\n    required Widget child,\n    double maxWidth = 600,\n  }) async {\n    var result = await showModalBottomSheet(\n      context: Get.context!,\n      constraints: BoxConstraints(\n        maxWidth: maxWidth,\n      ),\n      shape: const RoundedRectangleBorder(\n        borderRadius: BorderRadius.only(\n          topLeft: Radius.circular(12),\n          topRight: Radius.circular(12),\n        ),\n      ),\n      builder: (_) => Column(\n        children: [\n          ListTile(\n            contentPadding: const EdgeInsets.only(\n              left: 12,\n            ),\n            title: Text(title),\n            trailing: IconButton(\n              onPressed: Get.back,\n              icon: const Icon(Remix.close_line),\n            ),\n          ),\n          Expanded(\n            child: child,\n          ),\n        ],\n      ),\n    );\n    return result;\n  }\n\n  /// 文本编辑的弹窗\n  /// - `content` 编辑框默认的内容\n  /// - `title` 弹窗标题\n  /// - `confirm` 确认按钮内容\n  /// - `cancel` 取消按钮内容\n  static Future<String?> showEditTextDialog(\n    String content, {\n    String title = '',\n    String? hintText,\n    String confirm = '',\n    String cancel = '',\n    TextValidate? validate,\n  }) async {\n    final TextEditingController textEditingController =\n        TextEditingController(text: content);\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: Padding(\n          padding: AppStyle.edgeInsetsT12,\n          child: TextField(\n            controller: textEditingController,\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              //prefixText: title,\n              contentPadding: AppStyle.edgeInsetsA12,\n              hintText: hintText ?? title,\n            ),\n            // style: TextStyle(\n            //     height: 1.0,\n            //     color: Get.isDarkMode ? Colors.white : Colors.black),\n            autofocus: true,\n          ),\n        ),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: const Text(\"取消\"),\n          ),\n          TextButton(\n            onPressed: () {\n              if (validate != null && !validate(textEditingController.text)) {\n                return;\n              }\n\n              Get.back(result: textEditingController.text);\n            },\n            child: const Text(\"确定\"),\n          ),\n        ],\n      ),\n      // barrierColor:\n      //     Get.isDarkMode ? Colors.grey.withOpacity(.3) : Colors.black38,\n    );\n    return result;\n  }\n\n  static Future<T?> showOptionDialog<T>(\n    List<T> contents,\n    T value, {\n    String title = '',\n  }) async {\n    var result = await Get.dialog(\n      RadioGroup(\n        groupValue: value,\n        onChanged: (e) {\n          Get.back(result: e);\n        },\n        child: SimpleDialog(\n          title: Text(title),\n          children: contents\n              .map(\n                (e) => RadioListTile<T>(\n                  title: Text(e.toString()),\n                  value: e,\n                ),\n              )\n              .toList(),\n        ),\n      ),\n    );\n    return result;\n  }\n\n  /// 多段指引用户内容的弹窗\n  /// - `content` 内容：可滚动\n  /// - `title` 顶部弹窗标题\n  /// - `actions` 底部按钮\n  static Future<T?> showInformationHelpDialog<T>({\n    required List<Widget> content,\n    Widget? title,\n    List<Widget>? actions,\n  }) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: title ?? const Text(\"帮助\"),\n        scrollable: true,\n        content: SingleChildScrollView(child: ListBody(children: content)),\n        actions: actions ??\n            [\n              TextButton(\n                onPressed: Get.back,\n                child: const Text(\"确定\"),\n              ),\n            ],\n      ),\n    );\n    return result;\n  }\n\n  static Future showStatement() async {\n    var text = await rootBundle.loadString(\"assets/statement.txt\");\n\n    var result = await showAlertDialog(\n      text,\n      selectable: true,\n      title: \"免责声明\",\n      confirm: \"已阅读并同意\",\n      cancel: \"退出\",\n    );\n    if (!result) {\n      exit(0);\n    }\n  }\n\n  static Future<T?> showMapOptionDialog<T>(\n    Map<T, String> contents,\n    T value, {\n    String title = '',\n  }) async {\n    var result = await Get.dialog(\n      RadioGroup(\n        groupValue: value,\n        onChanged: (e) {\n          Get.back(result: e);\n        },\n        child: SimpleDialog(\n          title: Text(title),\n          children: contents.keys\n              .map(\n                (e) => RadioListTile<T>(\n                  title: Text((contents[e] ?? '-').tr),\n                  value: e,\n                ),\n              )\n              .toList(),\n        ),\n      ),\n    );\n    return result;\n  }\n\n  static int parseVersion(String version) {\n    var sp = version.split('.');\n    var num = \"\";\n    for (var item in sp) {\n      num = num + item.padLeft(2, '0');\n    }\n    return int.parse(num);\n  }\n\n  static String onlineToString(int num) {\n    if (num >= 10000) {\n      return \"${(num / 10000.0).toStringAsFixed(1)}万\";\n    }\n    return num.toString();\n  }\n\n  /// 检查相册权限\n  static Future<bool> checkPhotoPermission() async {\n    try {\n      if (!Platform.isIOS) {\n        return true;\n      }\n      var status = await Permission.photos.status;\n      if (status == PermissionStatus.granted) {\n        return true;\n      }\n      status = await Permission.photos.request();\n      if (status.isGranted) {\n        return true;\n      } else {\n        SmartDialog.showToast(\n          \"请授予相册访问权限\",\n        );\n        return false;\n      }\n    } catch (e) {\n      return false;\n    }\n  }\n\n  static final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n\n  /// 检查文件权限\n  static Future<bool> checkStorgePermission() async {\n    try {\n      if (!Platform.isAndroid) {\n        return true;\n      }\n      Permission permission = Permission.storage;\n      var androidIndo = await deviceInfo.androidInfo;\n      if (androidIndo.version.sdkInt >= 33) {\n        permission = Permission.manageExternalStorage;\n      }\n\n      var status = await permission.status;\n      if (status == PermissionStatus.granted) {\n        return true;\n      }\n      status = await permission.request();\n      if (status.isGranted) {\n        return true;\n      } else {\n        SmartDialog.showToast(\n          \"请授予文件访问权限\",\n        );\n        return false;\n      }\n    } catch (e) {\n      return false;\n    }\n  }\n\n  ///16进制颜色转换\n  static Color convertHexColor(String hexColor) {\n    hexColor = hexColor.replaceAll(\"#\", \"\");\n    if (hexColor.length == 4) {\n      hexColor = \"00$hexColor\";\n    }\n\n    if (hexColor.length == 6) {\n      var R = int.parse(hexColor.substring(0, 2), radix: 16);\n      var G = int.parse(hexColor.substring(2, 4), radix: 16);\n      var B = int.parse(hexColor.substring(4, 6), radix: 16);\n      return Color.fromARGB(255, R, G, B);\n    }\n    if (hexColor.length == 8) {\n      var A = int.parse(hexColor.substring(0, 2), radix: 16);\n      var R = int.parse(hexColor.substring(2, 4), radix: 16);\n      var G = int.parse(hexColor.substring(4, 6), radix: 16);\n      var B = int.parse(hexColor.substring(6, 8), radix: 16);\n\n      return Color.fromARGB(A, R, G, B);\n    }\n\n    return Colors.white;\n  }\n\n  /// 复制内容到剪贴板\n  static void copyToClipboard(String text) async {\n    try {\n      await Clipboard.setData(ClipboardData(text: text));\n      SmartDialog.showToast(\"已复制到剪贴板\");\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"复制到剪贴板失败: $e\");\n    }\n  }\n\n  /// 获取剪贴板内容\n  static Future<String?> getClipboard() async {\n    try {\n      var content = await Clipboard.getData(Clipboard.kTextPlain);\n      if (content == null) {\n        SmartDialog.showToast(\"无法读取剪贴板内容\");\n        return null;\n      }\n      return content.text;\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"读取剪切板内容失败：$e\");\n    }\n    return null;\n  }\n\n  static bool isRegexFormat(String keyword) {\n    return keyword.startsWith('/') &&\n        keyword.endsWith('/') &&\n        keyword.length > 2;\n  }\n\n  static String removeRegexFormat(String keyword) {\n    return keyword.substring(1, keyword.length - 1);\n  }\n\n  static String parseFileSize(int size) {\n    if (size < 1024) {\n      return \"$size B\";\n    }\n    if (size < 1024 * 1024) {\n      return \"${(size / 1024).toStringAsFixed(2)} KB\";\n    }\n    if (size < 1024 * 1024 * 1024) {\n      return \"${(size / 1024 / 1024).toStringAsFixed(2)} MB\";\n    }\n    return \"${(size / 1024 / 1024 / 1024).toStringAsFixed(2)} GB\";\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/main.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_flutter/hive_flutter.dart';\nimport 'package:logger/logger.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/app/utils/listen_fourth_button.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/modules/other/debug_log_page.dart';\nimport 'package:simple_live_app/routes/app_pages.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/douyin_account_service.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\nimport 'package:simple_live_app/services/sync_service.dart';\nimport 'package:simple_live_app/widgets/status/app_loadding_widget.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:window_manager/window_manager.dart';\n\nimport 'package:path/path.dart' as p;\nimport 'package:dynamic_color/dynamic_color.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await migrateData();\n  await initWindow();\n  MediaKit.ensureInitialized();\n  await Hive.initFlutter(\n    (!Platform.isAndroid && !Platform.isIOS)\n        ? (await getApplicationSupportDirectory()).path\n        : null,\n  );\n  //初始化服务\n  await initServices();\n  SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n  //设置状态栏为透明\n  SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(\n    statusBarColor: Colors.transparent,\n    statusBarIconBrightness: Brightness.dark,\n    systemNavigationBarColor: Colors.transparent,\n  );\n  SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);\n  runApp(const MyApp());\n}\n\n/// 将Hive数据迁移到Application Support\nFuture migrateData() async {\n  if (Platform.isAndroid || Platform.isIOS) {\n    return;\n  }\n  var hiveFileList = [\n    \"followuser\",\n    //旧版本写错成hostiry了\n    \"hostiry\",\n    \"followusertag\",\n    \"localstorage\",\n    \"danmushield\",\n  ];\n  try {\n    var newDir = await getApplicationSupportDirectory();\n    var hiveFile = File(p.join(newDir.path, \"followuser.hive\"));\n    if (await hiveFile.exists()) {\n      return;\n    }\n\n    var oldDir = await getApplicationDocumentsDirectory();\n    for (var element in hiveFileList) {\n      var oldFile = File(p.join(oldDir.path, \"$element.hive\"));\n      if (await oldFile.exists()) {\n        var fileName = \"$element.hive\";\n        if (element == \"hostiry\") {\n          fileName = \"history.hive\";\n        }\n        await oldFile.copy(p.join(newDir.path, fileName));\n        await oldFile.delete();\n      }\n      var lockFile = File(p.join(oldDir.path, \"$element.lock\"));\n      if (await lockFile.exists()) {\n        await lockFile.delete();\n      }\n    }\n  } catch (e) {\n    Log.logPrint(e);\n  }\n}\n\nFuture initWindow() async {\n  if (!(Platform.isMacOS || Platform.isWindows || Platform.isLinux)) {\n    return;\n  }\n  await windowManager.ensureInitialized();\n  WindowOptions windowOptions = const WindowOptions(\n    minimumSize: Size(280, 280),\n    center: true,\n    title: \"Simple Live\",\n  );\n  windowManager.waitUntilReadyToShow(windowOptions, () async {\n    await windowManager.show();\n    await windowManager.focus();\n  });\n}\n\nFuture initServices() async {\n  Hive.registerAdapter(FollowUserAdapter());\n  Hive.registerAdapter(HistoryAdapter());\n  Hive.registerAdapter(FollowUserTagAdapter());\n\n  //包信息\n  Utils.packageInfo = await PackageInfo.fromPlatform();\n  //本地存储\n  Log.d(\"Init LocalStorage Service\");\n  await Get.put(LocalStorageService()).init();\n  await Get.put(DBService()).init();\n  //初始化设置控制器\n  Get.put(AppSettingsController());\n\n  Get.put(BiliBiliAccountService());\n\n  Get.put(DouyinAccountService());\n\n  Get.put(SyncService());\n\n  Get.put(FollowService());\n\n  initCoreLog();\n}\n\nvoid initCoreLog() {\n  //日志信息\n  CoreLog.enableLog =\n      !kReleaseMode || AppSettingsController.instance.logEnable.value;\n  CoreLog.requestLogType = RequestLogType.short;\n  CoreLog.onPrintLog = (level, msg) {\n    switch (level) {\n      case Level.debug:\n        Log.d(msg);\n        break;\n      case Level.error:\n        Log.e(msg, StackTrace.current);\n        break;\n      case Level.info:\n        Log.i(msg);\n        break;\n      case Level.warning:\n        Log.w(msg);\n        break;\n      default:\n        Log.logPrint(msg);\n    }\n  };\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    bool isDynamicColor = AppSettingsController.instance.isDynamic.value;\n    Color styleColor = Color(AppSettingsController.instance.styleColor.value);\n    return DynamicColorBuilder(\n        builder: ((ColorScheme? lightDynamic, ColorScheme? darkDynamic) {\n      ColorScheme? lightColorScheme;\n      ColorScheme? darkColorScheme;\n      if (lightDynamic != null && darkDynamic != null && isDynamicColor) {\n        lightColorScheme = lightDynamic;\n        darkColorScheme = darkDynamic;\n      } else {\n        lightColorScheme = ColorScheme.fromSeed(\n          seedColor: styleColor,\n          brightness: Brightness.light,\n        );\n        darkColorScheme = ColorScheme.fromSeed(\n            seedColor: styleColor, brightness: Brightness.dark);\n      }\n      return GetMaterialApp(\n        title: \"Simple Live\",\n        theme: AppStyle.lightTheme.copyWith(colorScheme: lightColorScheme),\n        darkTheme: AppStyle.darkTheme.copyWith(colorScheme: darkColorScheme),\n        themeMode:\n            ThemeMode.values[Get.find<AppSettingsController>().themeMode.value],\n        initialRoute: RoutePath.kIndex,\n        getPages: AppPages.routes,\n        //国际化\n        locale: const Locale(\"zh\", \"CN\"),\n        localizationsDelegates: const [\n          GlobalMaterialLocalizations.delegate,\n          GlobalWidgetsLocalizations.delegate,\n          GlobalCupertinoLocalizations.delegate,\n        ],\n        supportedLocales: const [Locale(\"zh\", \"CN\")],\n        logWriterCallback: (text, {bool? isError}) {\n          Log.addDebugLog(text, (isError ?? false) ? Colors.red : Colors.grey);\n          Log.writeLog(text, (isError ?? false) ? Level.error : Level.info);\n        },\n        // 升级后Android页面过渡动画似乎有BUG\n        defaultTransition: Platform.isAndroid ? Transition.cupertino : null,\n        //debugShowCheckedModeBanner: false,\n        navigatorObservers: [FlutterSmartDialog.observer],\n        builder: FlutterSmartDialog.init(\n          loadingBuilder: ((msg) => const AppLoaddingWidget()),\n          //字体大小不跟随系统变化\n          builder: (context, child) {\n            // Fix for HyperOS windowed-mode Flutter bug:\n            // - Values > 50 indicate the bug (windowed mode on HyperOS)\n            // - Values == 0 are valid for fullscreen/immersive mode and must NOT be treated as abnormal\n            const fallbackPadding = EdgeInsets.only(top: 25, bottom: 35);\n            const maxNormalPadding = 50.0;\n\n            final mediaQueryData = MediaQuery.of(context);\n            final hasAbnormalPadding = mediaQueryData.viewPadding.top > maxNormalPadding;\n\n            final fixedMediaQueryData = hasAbnormalPadding\n                ? mediaQueryData.copyWith(\n                    viewPadding: fallbackPadding,\n                    padding: fallbackPadding,\n                    textScaler: const TextScaler.linear(1.0),\n                  )\n                : mediaQueryData.copyWith(textScaler: const TextScaler.linear(1.0));\n\n            return MediaQuery(\n              data: fixedMediaQueryData,\n              child: Stack(\n              children: [\n                //侧键返回\n                RawGestureDetector(\n                  excludeFromSemantics: true,\n                  gestures: <Type, GestureRecognizerFactory>{\n                    FourthButtonTapGestureRecognizer:\n                        GestureRecognizerFactoryWithHandlers<\n                            FourthButtonTapGestureRecognizer>(\n                      () => FourthButtonTapGestureRecognizer(),\n                      (FourthButtonTapGestureRecognizer instance) {\n                        instance.onTapDown = (TapDownDetails details) async {\n                          //如果处于全屏状态，退出全屏\n                          if (!Platform.isAndroid && !Platform.isIOS) {\n                            if (await windowManager.isFullScreen()) {\n                              await windowManager.setFullScreen(false);\n                              return;\n                            }\n                          }\n                          Get.back();\n                        };\n                      },\n                    ),\n                  },\n                  child: KeyboardListener(\n                    focusNode: FocusNode(),\n                    onKeyEvent: (KeyEvent event) async {\n                      if (event is KeyDownEvent &&\n                          event.logicalKey == LogicalKeyboardKey.escape) {\n                        // ESC退出全屏\n                        // 如果处于全屏状态，退出全屏\n                        if (!Platform.isAndroid && !Platform.isIOS) {\n                          if (await windowManager.isFullScreen()) {\n                            await windowManager.setFullScreen(false);\n                            return;\n                          }\n                        }\n                      }\n                    },\n                    child: child!,\n                  ),\n                ),\n\n                //查看DEBUG日志按钮\n                //只在Debug、Profile模式显示\n                Visibility(\n                  visible: !kReleaseMode,\n                  child: Positioned(\n                    right: 12,\n                    bottom: 100 + context.mediaQueryViewPadding.bottom,\n                    child: Opacity(\n                      opacity: 0.4,\n                      child: ElevatedButton(\n                        child: const Text(\"DEBUG LOG\"),\n                        onPressed: () {\n                          Get.bottomSheet(\n                            const DebugLogPage(),\n                          );\n                        },\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n            );\n          },\n        ),\n      );\n    }));\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/account/bilibili_user_info_page.dart",
    "content": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass BiliBiliUserInfoModel {\n  BiliBiliUserInfoModel({\n    this.mid,\n    this.uname,\n    this.userid,\n    this.sign,\n    this.birthday,\n    this.sex,\n    this.nickFree,\n    this.rank,\n  });\n\n  factory BiliBiliUserInfoModel.fromJson(Map<String, dynamic> json) =>\n      BiliBiliUserInfoModel(\n        mid: asT<int?>(json['mid']),\n        uname: asT<String?>(json['uname']),\n        userid: asT<String?>(json['userid']),\n        sign: asT<String?>(json['sign']),\n        birthday: asT<String?>(json['birthday']),\n        sex: asT<String?>(json['sex']),\n        nickFree: asT<bool?>(json['nick_free']),\n        rank: asT<String?>(json['rank']),\n      );\n\n  int? mid;\n  String? uname;\n  String? userid;\n  String? sign;\n  String? birthday;\n  String? sex;\n  bool? nickFree;\n  String? rank;\n\n  @override\n  String toString() {\n    return jsonEncode(this);\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n        'mid': mid,\n        'uname': uname,\n        'userid': userid,\n        'sign': sign,\n        'birthday': birthday,\n        'sex': sex,\n        'nick_free': nickFree,\n        'rank': rank,\n      };\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\n\npart 'follow_user.g.dart';\n\n@HiveType(typeId: 1)\nclass FollowUser {\n  FollowUser({\n    required this.id,\n    required this.roomId,\n    required this.siteId,\n    required this.userName,\n    required this.face,\n    required this.addTime,\n    this.tag = \"全部\"\n  });\n\n  ///id=siteId_roomId\n  @HiveField(0)\n  String id;\n\n  @HiveField(1)\n  String roomId;\n\n  @HiveField(2)\n  String siteId;\n\n  @HiveField(3)\n  String userName;\n\n  @HiveField(4)\n  String face;\n\n  @HiveField(5)\n  DateTime addTime;\n\n  @HiveField(6)\n  String tag;\n\n  /// 直播状态\n  /// 0=未知(加载中) 1=未开播 2=直播中\n  Rx<int> liveStatus = 0.obs;\n\n  /// 开播时间戳\n  String? liveStartTime;\n\n  factory FollowUser.fromJson(Map<String, dynamic> json) => FollowUser(\n        id: json['id'],\n        roomId: json['roomId'],\n        siteId: json['siteId'],\n        userName: json['userName'],\n        face: json['face'],\n        addTime: DateTime.parse(json['addTime']),\n        tag: json[\"tag\"]??\"全部\",\n      );\n\n  Map<String, dynamic> toJson() => {\n        'id': id,\n        'roomId': roomId,\n        'siteId': siteId,\n        'userName': userName,\n        'face': face,\n        'addTime': addTime.toString(),\n        'tag':tag,\n      };\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'follow_user.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass FollowUserAdapter extends TypeAdapter<FollowUser> {\n  @override\n  final int typeId = 1;\n\n  @override\n  FollowUser read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return FollowUser(\n      id: fields[0] as String,\n      roomId: fields[1] as String,\n      siteId: fields[2] as String,\n      userName: fields[3] as String,\n      face: fields[4] as String,\n      addTime: fields[5] as DateTime,\n      tag: fields[6] ?? \"全部\",\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, FollowUser obj) {\n    writer\n      ..writeByte(7)\n      ..writeByte(0)\n      ..write(obj.id)\n      ..writeByte(1)\n      ..write(obj.roomId)\n      ..writeByte(2)\n      ..write(obj.siteId)\n      ..writeByte(3)\n      ..write(obj.userName)\n      ..writeByte(4)\n      ..write(obj.face)\n      ..writeByte(5)\n      ..write(obj.addTime)\n      ..writeByte(6)\n      ..write(obj.tag);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is FollowUserAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user_tag.dart",
    "content": "import 'package:hive/hive.dart';\n\npart 'follow_user_tag.g.dart';\n\n@HiveType(typeId: 3)\nclass FollowUserTag {\n  @HiveField(1)\n  String id;\n\n  // 用户自定义tag\n  @HiveField(2)\n  String tag;\n\n  // followUserId\n  @HiveField(3)\n  List<String> userId;\n\n  FollowUserTag({\n    required this.id,\n    required this.tag,\n    required this.userId,\n  });\n\n  factory FollowUserTag.fromJson(Map<String, dynamic> json) {\n    return FollowUserTag(\n      id: json['id'],\n      tag: json['tag'],\n      userId: List<String>.from(json['userId']),\n    );\n  }\n\n  Map<String, dynamic> toJson() {\n    return {\n      'id': id,\n      'tag': tag,\n      'userId': userId,\n    };\n  }\n\n  FollowUserTag copyWith({\n    String? id,\n    String? tag,\n    List<String>? userId,\n  }) {\n    return FollowUserTag(\n      id: id ?? this.id,\n      tag: tag ?? this.tag,\n      userId: userId ?? this.userId,\n    );\n  }\n}"
  },
  {
    "path": "simple_live_app/lib/models/db/follow_user_tag.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'follow_user_tag.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass FollowUserTagAdapter extends TypeAdapter<FollowUserTag> {\n  @override\n  final int typeId = 3;\n\n  @override\n  FollowUserTag read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return FollowUserTag(\n      id: fields[1] as String,\n      tag: fields[2] as String,\n      userId: (fields[3] as List).cast<String>(),\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, FollowUserTag obj) {\n    writer\n      ..writeByte(3)\n      ..writeByte(1)\n      ..write(obj.id)\n      ..writeByte(2)\n      ..write(obj.tag)\n      ..writeByte(3)\n      ..write(obj.userId);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n          other is FollowUserTagAdapter &&\n              runtimeType == other.runtimeType &&\n              typeId == other.typeId;\n}"
  },
  {
    "path": "simple_live_app/lib/models/db/history.dart",
    "content": "import 'package:hive/hive.dart';\n\npart 'history.g.dart';\n\n@HiveType(typeId: 2)\nclass History {\n  History({\n    required this.id,\n    required this.roomId,\n    required this.siteId,\n    required this.userName,\n    required this.face,\n    required this.updateTime,\n  });\n\n  ///id=siteId_roomId\n  @HiveField(0)\n  String id;\n\n  @HiveField(1)\n  String roomId;\n\n  @HiveField(2)\n  String siteId;\n\n  @HiveField(3)\n  String userName;\n\n  @HiveField(4)\n  String face;\n\n  @HiveField(5)\n  DateTime updateTime;\n\n  factory History.fromJson(Map<String, dynamic> json) => History(\n        id: json[\"id\"],\n        roomId: json[\"roomId\"],\n        siteId: json[\"siteId\"],\n        userName: json[\"userName\"],\n        face: json[\"face\"],\n        updateTime: DateTime.parse(json[\"updateTime\"]),\n      );\n\n  Map<String, dynamic> toJson() => {\n        \"id\": id,\n        \"roomId\": roomId,\n        \"siteId\": siteId,\n        \"userName\": userName,\n        \"face\": face,\n        \"updateTime\": updateTime.toString(),\n      };\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/db/history.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'history.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass HistoryAdapter extends TypeAdapter<History> {\n  @override\n  final int typeId = 2;\n\n  @override\n  History read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return History(\n      id: fields[0] as String,\n      roomId: fields[1] as String,\n      siteId: fields[2] as String,\n      userName: fields[3] as String,\n      face: fields[4] as String,\n      updateTime: fields[5] as DateTime,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, History obj) {\n    writer\n      ..writeByte(6)\n      ..writeByte(0)\n      ..write(obj.id)\n      ..writeByte(1)\n      ..write(obj.roomId)\n      ..writeByte(2)\n      ..write(obj.siteId)\n      ..writeByte(3)\n      ..write(obj.userName)\n      ..writeByte(4)\n      ..write(obj.face)\n      ..writeByte(5)\n      ..write(obj.updateTime);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is HistoryAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/follow_user_item.dart",
    "content": "\n"
  },
  {
    "path": "simple_live_app/lib/models/sync_client_info_model.dart",
    "content": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass SyncClientInfoModel {\n  SyncClientInfoModel({\n    required this.name,\n    required this.version,\n    required this.address,\n    required this.port,\n    required this.type,\n  });\n\n  factory SyncClientInfoModel.fromJson(Map<String, dynamic> json) =>\n      SyncClientInfoModel(\n        type: asT<String>(json['type'])!,\n        name: asT<String>(json['name'])!,\n        version: asT<String>(json['version'])!,\n        address: asT<String>(json['address'])!,\n        port: asT<int>(json['port'])!,\n      );\n  String type;\n  String name;\n  String version;\n  String address;\n  int port;\n\n  @override\n  String toString() {\n    return jsonEncode(this);\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n        'name': name,\n        'version': version,\n        'address': address,\n        'port': port,\n        'type': type,\n      };\n}\n"
  },
  {
    "path": "simple_live_app/lib/models/version_model.dart",
    "content": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass VersionModel {\n  VersionModel({\n    required this.version,\n    required this.versionNum,\n    required this.versionDesc,\n    required this.downloadUrl,\n  });\n\n  factory VersionModel.fromJson(Map<String, dynamic> json) => VersionModel(\n        version: asT<String>(json['version'])!,\n        versionNum: asT<int>(json['version_num'])!,\n        versionDesc: asT<String>(json['version_desc'])!,\n        downloadUrl: asT<String>(json['download_url'])!,\n      );\n\n  String version;\n  int versionNum;\n  String versionDesc;\n  String downloadUrl;\n\n  @override\n  String toString() {\n    return jsonEncode(this);\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n        'version': version,\n        'version_num': versionNum,\n        'version_desc': versionDesc,\n        'download_url': downloadUrl,\n      };\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/category/category_list_controller.dart';\n\nclass CategoryController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late TabController tabController;\n  CategoryController() {\n    tabController =\n        TabController(length: Sites.supportSites.length, vsync: this);\n  }\n  StreamSubscription<dynamic>? streamSubscription;\n  @override\n  void onInit() {\n    streamSubscription = EventBus.instance.listen(\n      EventBus.kBottomNavigationBarClicked,\n      (index) {\n        if (index == 2) {\n          refreshOrScrollTop();\n        }\n      },\n    );\n    for (var site in Sites.supportSites) {\n      Get.put(CategoryListController(site), tag: site.id);\n    }\n\n    super.onInit();\n  }\n\n  void refreshOrScrollTop() {\n    var tabIndex = tabController.index;\n    BasePageController controller;\n    controller =\n        Get.find<CategoryListController>(tag: Sites.supportSites[tabIndex].id);\n    controller.scrollToTopOrRefresh();\n  }\n\n  @override\n  void onClose() {\n    streamSubscription?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_list_controller.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass CategoryListController extends BasePageController<AppLiveCategory> {\n  final Site site;\n  CategoryListController(this.site);\n\n  @override\n  Future<List<AppLiveCategory>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getCategores();\n\n    return result.map((e) => AppLiveCategory.fromLiveCategory(e)).toList();\n  }\n}\n\nclass AppLiveCategory extends LiveCategory {\n  var showAll = false.obs;\n  AppLiveCategory({\n    required super.id,\n    required super.name,\n    required super.children,\n  }) {\n    showAll.value = children.length < 19;\n  }\n\n  List<LiveSubCategory> get take15 => children.take(15).toList();\n\n  factory AppLiveCategory.fromLiveCategory(LiveCategory item) {\n    return AppLiveCategory(\n      children: item.children,\n      id: item.id,\n      name: item.name,\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_list_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/category/category_list_controller.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_app/widgets/shadow_card.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:sticky_headers/sticky_headers.dart';\n\nclass CategoryListView extends StatelessWidget {\n  final String tag;\n  const CategoryListView(this.tag, {Key? key}) : super(key: key);\n  CategoryListController get controller =>\n      Get.find<CategoryListController>(tag: tag);\n  @override\n  Widget build(BuildContext context) {\n    return KeepAliveWrapper(\n      child: Obx(\n        () => EasyRefresh(\n          firstRefresh: true,\n          controller: controller.easyRefreshController,\n          onRefresh: controller.refreshData,\n          header: MaterialHeader(\n            completeDuration: const Duration(milliseconds: 400),\n          ),\n          child: ListView.builder(\n            padding: AppStyle.edgeInsetsA12,\n            itemCount: controller.list.length,\n            controller: controller.scrollController,\n            itemBuilder: (_, i) {\n              var item = controller.list[i];\n              return Column(\n                children: [\n                  StickyHeader(\n                    header: Container(\n                      padding: AppStyle.edgeInsetsV8.copyWith(left: 4),\n                      color: Theme.of(context).scaffoldBackgroundColor,\n                      alignment: Alignment.centerLeft,\n                      child: Text(\n                        item.name,\n                        style: const TextStyle(\n                            fontSize: 18, fontWeight: FontWeight.bold),\n                      ),\n                    ),\n                    content: Obx(\n                      () => GridView.count(\n                        shrinkWrap: true,\n                        padding: AppStyle.edgeInsetsV8,\n                        physics: const NeverScrollableScrollPhysics(),\n                        crossAxisCount: MediaQuery.of(context).size.width ~/ 80,\n                        crossAxisSpacing: 8,\n                        mainAxisSpacing: 8,\n                        children: item.showAll.value\n                            ? (item.children\n                                .map(\n                                  (e) => buildSubCategory(e),\n                                )\n                                .toList())\n                            : (item.take15\n                                .map(\n                                  (e) => buildSubCategory(e),\n                                )\n                                .toList()\n                              ..add(buildShowMore(item))),\n                      ),\n                    ),\n                  ),\n                ],\n              );\n            },\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildSubCategory(LiveSubCategory item) {\n    return ShadowCard(\n      onTap: () {\n        AppNavigator.toCategoryDetail(site: controller.site, category: item);\n      },\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: [\n          NetImage(\n            item.pic ?? \"\",\n            width: 40,\n            height: 40,\n            borderRadius: 8,\n          ),\n          AppStyle.vGap4,\n          Text(\n            item.name,\n            maxLines: 1,\n            textAlign: TextAlign.center,\n            style: const TextStyle(fontSize: 12),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildShowMore(AppLiveCategory item) {\n    return ShadowCard(\n      onTap: () {\n        item.showAll.value = true;\n      },\n      child: const Center(\n        child: Text(\n          \"显示全部\",\n          maxLines: 1,\n          textAlign: TextAlign.center,\n          style: TextStyle(fontSize: 12),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/category_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/category/category_controller.dart';\nimport 'package:simple_live_app/modules/category/category_list_view.dart';\n\nclass CategoryPage extends GetView<CategoryController> {\n  const CategoryPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        titleSpacing: 8,\n        title: TabBar(\n          controller: controller.tabController,\n          padding: EdgeInsets.zero,\n          tabAlignment: TabAlignment.center,\n          tabs: Sites.supportSites\n              .map(\n                (e) => Tab(\n                  //text: e.name,\n                  child: Row(\n                    children: [\n                      Image.asset(\n                        e.logo,\n                        width: 24,\n                      ),\n                      AppStyle.hGap8,\n                      Text(e.name),\n                    ],\n                  ),\n                ),\n              )\n              .toList(),\n          labelPadding: AppStyle.edgeInsetsH20,\n          isScrollable: true,\n          indicatorSize: TabBarIndicatorSize.label,\n        ),\n      ),\n      body: TabBarView(\n        controller: controller.tabController,\n        children: Sites.supportSites\n            .map(\n              (e) => CategoryListView(\n                e.id,\n              ),\n            )\n            .toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/detail/category_detail_controller.dart",
    "content": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass CategoryDetailController extends BasePageController<LiveRoomItem> {\n  final Site site;\n  final LiveSubCategory subCategory;\n  CategoryDetailController({\n    required this.site,\n    required this.subCategory,\n  });\n\n  @override\n  Future<List<LiveRoomItem>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getCategoryRooms(subCategory, page: page);\n    return result.items;\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/category/detail/category_detail_page.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/category/detail/category_detail_controller.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/live_room_card.dart';\nimport 'package:simple_live_app/widgets/page_grid_view.dart';\n\nclass CategoryDetailPage extends GetView<CategoryDetailController> {\n  const CategoryDetailPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var c = MediaQuery.of(context).size.width ~/ 200;\n    if (c < 2) {\n      c = 2;\n    }\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(controller.subCategory.name),\n      ),\n      body: KeepAliveWrapper(\n        child: PageGridView(\n          pageController: controller,\n          padding: AppStyle.edgeInsetsA12,\n          firstRefresh: true,\n          mainAxisSpacing: 12,\n          crossAxisSpacing: 12,\n          crossAxisCount: c,\n          itemBuilder: (_, i) {\n            var item = controller.list[i];\n            return LiveRoomCard(controller.site, item);\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_user_controller.dart",
    "content": "// ignore_for_file: invalid_use_of_protected_member\n\nimport 'dart:async';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\n\nclass FollowUserController extends BasePageController<FollowUser> {\n  StreamSubscription<dynamic>? onUpdatedIndexedStream;\n  StreamSubscription<dynamic>? onUpdatedListStream;\n\n  /// 0:全部 1:直播中 2:未直播\n  var filterMode = FollowUserTag(id: \"0\", tag: \"全部\", userId: []).obs;\n  RxList<FollowUserTag> tagList = [\n    FollowUserTag(id: \"0\", tag: \"全部\", userId: []),\n    FollowUserTag(id: \"1\", tag: \"直播中\", userId: []),\n    FollowUserTag(id: \"2\", tag: \"未开播\", userId: []),\n  ].obs;\n\n  // 用户自定义标签\n  RxList<FollowUserTag> userTagList = <FollowUserTag>[].obs;\n\n  @override\n  void onInit() {\n    onUpdatedIndexedStream = EventBus.instance.listen(\n      EventBus.kBottomNavigationBarClicked,\n          (index) {\n        if (index == 1) {\n          scrollToTopOrRefresh();\n        }\n      },\n    );\n    onUpdatedListStream =\n        FollowService.instance.updatedListStream.listen((event) {\n      filterData();\n    });\n    super.onInit();\n  }\n\n  @override\n  Future refreshData() async {\n    await FollowService.instance.loadData();\n    updateTagList();\n    super.refreshData();\n  }\n\n  @override\n  Future<List<FollowUser>> getData(int page, int pageSize) async {\n    if (page > 1) {\n      return Future.value([]);\n    }\n    if (filterMode.value.tag == \"全部\") {\n      return FollowService.instance.followList.value;\n    } else if (filterMode.value.tag == \"直播中\") {\n      return FollowService.instance.liveList.value;\n    } else if (filterMode.value.tag == \"未开播\") {\n      return FollowService.instance.notLiveList.value;\n    } else {\n      FollowService.instance.filterDataByTag(filterMode.value);\n      return FollowService.instance.curTagFollowList.value;\n    }\n  }\n\n  void updateTagList() {\n    userTagList.assignAll(FollowService.instance.followTagList);\n    tagList.value = tagList.take(3).toList();\n    for (var i in userTagList) {\n      if (!tagList.contains(i)) {\n        tagList.add(i);\n      }\n    }\n  }\n\n  void filterData() {\n    if (filterMode.value.tag == \"全部\") {\n      list.assignAll(FollowService.instance.followList.value);\n    } else if (filterMode.value.tag == \"直播中\") {\n      list.assignAll(FollowService.instance.liveList.value);\n    } else if (filterMode.value.tag == \"未开播\") {\n      list.assignAll(FollowService.instance.notLiveList.value);\n    } else {\n      FollowService.instance.filterDataByTag(filterMode.value);\n      list.assignAll(FollowService.instance.curTagFollowList);\n    }\n  }\n\n  void setFilterMode(FollowUserTag tag) {\n    filterMode.value = tag;\n    filterData();\n  }\n\n  void removeItem(FollowUser item) async {\n    var result =\n    await Utils.showAlertDialog(\"确定要取消关注${item.userName}吗?\", title: \"取消关注\");\n    if (!result) {\n      return;\n    }\n    // 取消关注同时删除标签内的 userId\n    if(item.tag != \"全部\"){\n      var tag = tagList.firstWhere((tag) => tag.tag == item.tag);\n      tag.userId.remove(item.id);\n      updateTag(tag);\n    }\n    await DBService.instance.followBox.delete(item.id);\n    refreshData();\n  }\n\n  void updateItem(FollowUser item){\n    FollowService.instance.addFollow(item);\n  }\n  // 修改item的标签\n  void setItemTag(FollowUser item, FollowUserTag targetTag) {\n    FollowUserTag tarTag = targetTag;\n    FollowUserTag curTag =\n    tagList.firstWhere((tag) => tag.tag == item.tag);\n    // 从当前标签（非全部）删除item 向目标标签(全部包含所有item == 非全部)添加item\n    curTag.userId.remove(item.id);\n    tarTag.userId.addIf(!tarTag.userId.contains(item.id), item.id);\n    // 数据库更新\n    item.tag = tarTag.tag;\n    updateTag(curTag);\n    updateTag(tarTag);\n    updateItem(item);\n    filterData();\n  }\n\n  Future<void> removeTag(FollowUserTag tag) async {\n    // 将tag下的所有follow设置为全部\n    for(var i in tag.userId){\n      var follow = DBService.instance.followBox.get(i);\n      if(follow != null){\n        follow.tag = \"全部\";\n        updateItem(follow);\n      }\n    }\n    await FollowService.instance.delFollowUserTag(tag);\n    updateTagList();\n    Log.i('删除tag${tag.tag}');\n  }\n\n  void addTag(String tag) async {\n    FollowService.instance\n        .addFollowUserTag(tag)\n        .then((value) => updateTagList());\n  }\n\n  void updateTag(FollowUserTag followUserTag) {\n    if(followUserTag.tag == '全部'){\n      return;\n    }\n    FollowService.instance.updateFollowUserTag(followUserTag);\n  }\n\n  void updateTagName(FollowUserTag followUserTag, String newTagName) {\n    // 未操作\n    if (followUserTag.tag == newTagName) {\n      return;\n    }\n    // 避免重名\n    if (tagList.any((item) => item.tag == newTagName)) {\n      SmartDialog.showToast(\"标签名重复，修改失败\");\n      return;\n    }\n    final FollowUserTag newTag = followUserTag.copyWith(tag: newTagName);\n    updateTag(newTag);\n    // update item's tag when update tagName\n    for(var i in newTag.userId){\n      var follow = DBService.instance.followBox.get(i);\n      if(follow != null){\n        follow.tag = newTagName;\n        updateItem(follow);\n      }\n    }\n    SmartDialog.showToast(\"标签名修改成功\");\n    updateTagList();\n  }\n\n  // 调整标签顺序\n  void updateTagOrder(int oldIndex, int newIndex) {\n    if (newIndex > oldIndex) newIndex -= 1; // 处理索引调整\n    final item = userTagList.removeAt(oldIndex);\n    userTagList.insert(newIndex, item);\n    tagList.value = tagList.take(3).toList();\n    tagList.addAll(userTagList);\n    DBService.instance.updateFollowTagOrder(userTagList);\n  }\n\n  @override\n  void onClose() {\n    onUpdatedIndexedStream?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/follow_user/follow_user_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/modules/follow_user/follow_user_controller.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/widgets/filter_button.dart';\nimport 'package:simple_live_app/widgets/follow_user_item.dart';\nimport 'package:simple_live_app/widgets/page_grid_view.dart';\n\nclass FollowUserPage extends GetView<FollowUserController> {\n  const FollowUserPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var count = MediaQuery.of(context).size.width ~/ 500;\n    if (count < 1) count = 1;\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"关注用户\"),\n        actions: [\n          PopupMenuButton(\n            itemBuilder: (context) {\n              return const [\n                PopupMenuItem(\n                  value: 0,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(Remix.save_2_line),\n                      AppStyle.hGap12,\n                      Text(\"导出文件\")\n                    ],\n                  ),\n                ),\n                PopupMenuItem(\n                  value: 1,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(Remix.folder_open_line),\n                      AppStyle.hGap12,\n                      Text(\"导入文件\")\n                    ],\n                  ),\n                ),\n                PopupMenuItem(\n                  value: 2,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(Remix.text),\n                      AppStyle.hGap12,\n                      Text(\"导出文本\"),\n                    ],\n                  ),\n                ),\n                PopupMenuItem(\n                  value: 3,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(Remix.file_text_line),\n                      AppStyle.hGap12,\n                      Text(\"导入文本\"),\n                    ],\n                  ),\n                ),\n                PopupMenuItem(\n                  value: 4,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(Remix.price_tag_line),\n                      AppStyle.hGap12,\n                      Text(\"标签管理\"),\n                    ],\n                  ),\n                ),\n              ];\n            },\n            onSelected: (value) {\n              if (value == 0) {\n                FollowService.instance.exportFile();\n              } else if (value == 1) {\n                FollowService.instance.inputFile();\n              } else if (value == 2) {\n                FollowService.instance.exportText();\n              } else if (value == 3) {\n                FollowService.instance.inputText();\n              } else if (value == 4) {\n                showTagsManager();\n              }\n            },\n          ),\n        ],\n        leading: Obx(\n          () => FollowService.instance.updating.value\n              ? const IconButton(\n                  onPressed: null,\n                  icon: SizedBox(\n                    width: 16,\n                    height: 16,\n                    child: CircularProgressIndicator(\n                      strokeWidth: 2,\n                    ),\n                  ),\n                )\n              : IconButton(\n                  onPressed: () {\n                    controller.refreshData();\n                  },\n                  icon: const Icon(Icons.refresh),\n                ),\n        ),\n      ),\n      body: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          Padding(\n            padding: AppStyle.edgeInsetsL8,\n            child: Row(\n              children: [\n                Expanded(\n                  child: Obx(\n                    () => SingleChildScrollView(\n                      scrollDirection: Axis.horizontal,\n                      child: Wrap(\n                          spacing: 12,\n                          children: controller.tagList.map((option) {\n                            return FilterButton(\n                              text: option.tag,\n                              selected: controller.filterMode.value == option,\n                              onTap: () {\n                                controller.setFilterMode(option);\n                              },\n                            );\n                          }).toList()),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Expanded(\n            child: PageGridView(\n              crossAxisSpacing: 12,\n              crossAxisCount: count,\n              pageController: controller,\n              firstRefresh: true,\n              showPCRefreshButton: false,\n              itemBuilder: (_, i) {\n                var item = controller.list[i];\n                var site = Sites.allSites[item.siteId]!;\n                return FollowUserItem(\n                  item: item,\n                  onRemove: () {\n                    controller.removeItem(item);\n                  },\n                  onTap: () {\n                    AppNavigator.toLiveRoomDetail(\n                        site: site, roomId: item.roomId);\n                  },\n                  onLongPress: () {\n                    setFollowTagDialog(item);\n                  },\n                );\n              },\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void setFollowTagDialog(FollowUser item) {\n    /// 控制单选ui\n    List<FollowUserTag> copiedList = [\n      controller.tagList.first,\n      ...controller.tagList.skip(3),\n    ];\n    Rx<FollowUserTag> checkTag =\n        controller.tagList.indexOf(controller.filterMode.value) < 3\n            ? copiedList.first.obs\n            : controller.filterMode.value.obs;\n    final ScrollController scrollController = ScrollController();\n    Get.dialog(\n      AlertDialog(\n        contentPadding: const EdgeInsets.all(16.0),\n        shape: RoundedRectangleBorder(\n          borderRadius: BorderRadius.circular(12.0),\n        ),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            // 标题栏\n            Row(\n              mainAxisAlignment: MainAxisAlignment.spaceBetween,\n              children: [\n                const Text(\n                  '设置标签',\n                  style: TextStyle(\n                    fontSize: 18,\n                  ),\n                ),\n                IconButton(\n                  icon: const Icon(\n                    Icons.check,\n                  ),\n                  onPressed: () {\n                    controller.setItemTag(item, checkTag.value);\n                    Get.back();\n                  },\n                ),\n              ],\n            ),\n            const Divider(),\n            Obx(\n              () {\n                int selectedIndex = copiedList.indexOf(checkTag.value);\n                WidgetsBinding.instance.addPostFrameCallback((_) {\n                  if (selectedIndex >= 0) {\n                    scrollController.animateTo(\n                      selectedIndex * 60.0, // 假设每项高度为 60\n                      duration: const Duration(milliseconds: 300),\n                      curve: Curves.easeInOut,\n                    );\n                  }\n                });\n                return SizedBox(\n                  height: 300,\n                  width: 300,\n                  child: RadioGroup(\n                    groupValue: checkTag.value,\n                    onChanged: (value) {\n                      checkTag.value = value!;\n                    },\n                    child: ListView.builder(\n                      controller: scrollController,\n                      itemCount: copiedList.length,\n                      itemBuilder: (context, index) {\n                        var tagItem = copiedList[index];\n                        return Container(\n                          decoration: BoxDecoration(\n                            border: Border(\n                              bottom: BorderSide(\n                                  color: Colors.grey.shade300, width: 1.0),\n                            ),\n                          ),\n                          child: RadioListTile<FollowUserTag>(\n                            title: Text(tagItem.tag),\n                            value: tagItem,\n                          ),\n                        );\n                      },\n                    ),\n                  ),\n                );\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void showTagsManager() {\n    Utils.showBottomSheet(\n      title: '标签管理',\n      child: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            AppStyle.divider,\n            ListTile(\n              title: const Text(\"添加标签\"),\n              leading: const Icon(Icons.add),\n              onTap: () {\n                editTagDialog(\"添加标签\");\n              },\n            ),\n            AppStyle.divider,\n            // 列表内容\n            Expanded(\n              child: Obx(\n                () => ReorderableListView.builder(\n                  itemCount: controller.userTagList.length,\n                  itemBuilder: (context, index) {\n                    // 偏移\n                    FollowUserTag item = controller.userTagList[index];\n                    return ListTile(\n                      key: ValueKey(item.id),\n                      title: GestureDetector(\n                        child: Text(item.tag),\n                        onLongPress: () {\n                          {\n                            editTagDialog(\"修改标签\", followUserTag: item);\n                          }\n                        },\n                      ),\n                      leading: IconButton(\n                        icon: const Icon(Icons.delete),\n                        onPressed: () {\n                          controller.removeTag(item);\n                        },\n                      ),\n                    );\n                  },\n                  onReorder: (int oldIndex, int newIndex) {\n                    controller.updateTagOrder(oldIndex, newIndex);\n                  },\n                ),\n              ),\n            ),\n          ]),\n    );\n  }\n\n  void editTagDialog(String title, {FollowUserTag? followUserTag}) {\n    final TextEditingController tagEditController =\n        TextEditingController(text: followUserTag?.tag);\n    bool upMode = title == \"添加标签\" ? true : false;\n    Get.dialog(\n      AlertDialog(\n        contentPadding: const EdgeInsets.all(16.0),\n        shape: RoundedRectangleBorder(\n          borderRadius: BorderRadius.circular(12.0),\n        ),\n        content: SingleChildScrollView(\n          padding: EdgeInsets.only(\n              bottom: MediaQuery.of(Get.context!).viewInsets.bottom),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Text(\n                title,\n                style: const TextStyle(\n                  fontSize: 18,\n                ),\n              ),\n              TextField(\n                controller: tagEditController,\n                minLines: 1,\n                maxLines: 1,\n                decoration: InputDecoration(\n                  border: const OutlineInputBorder(),\n                  contentPadding: AppStyle.edgeInsetsA12,\n                  enabledBorder: OutlineInputBorder(\n                    borderSide: BorderSide(\n                      color: Colors.grey.withAlpha(51),\n                    ),\n                  ),\n                ),\n                onSubmitted: (tag) {\n                  upMode\n                      ? controller.addTag(tagEditController.text)\n                      : controller.updateTagName(\n                          followUserTag!, tagEditController.text);\n                  Get.back();\n                },\n              ),\n              Container(\n                margin: AppStyle.edgeInsetsB4,\n                width: double.infinity,\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [\n                    TextButton(\n                      onPressed: () {\n                        Get.back();\n                      },\n                      child: const Text('否'),\n                    ),\n                    TextButton(\n                      onPressed: () {\n                        upMode\n                            ? controller.addTag(tagEditController.text)\n                            : controller.updateTagName(\n                                followUserTag!, tagEditController.text);\n                        Get.back();\n                      },\n                      child: const Text('是'),\n                    ),\n                  ],\n                ),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/home/home_list_controller.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\n\nclass HomeController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late TabController tabController;\n  HomeController() {\n    tabController =\n        TabController(length: Sites.supportSites.length, vsync: this);\n  }\n\n  StreamSubscription<dynamic>? streamSubscription;\n\n  @override\n  void onInit() {\n    streamSubscription = EventBus.instance.listen(\n      EventBus.kBottomNavigationBarClicked,\n      (index) {\n        if (index == 0) {\n          refreshOrScrollTop();\n        }\n      },\n    );\n    for (var site in Sites.supportSites) {\n      Get.put(HomeListController(site), tag: site.id);\n    }\n\n    super.onInit();\n  }\n\n  void refreshOrScrollTop() {\n    var tabIndex = tabController.index;\n    BasePageController controller;\n    controller =\n        Get.find<HomeListController>(tag: Sites.supportSites[tabIndex].id);\n    controller.scrollToTopOrRefresh();\n  }\n\n  void toSearch() {\n    Get.toNamed(RoutePath.kSearch);\n  }\n\n  @override\n  void onClose() {\n    streamSubscription?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_list_controller.dart",
    "content": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass HomeListController extends BasePageController<LiveRoomItem> {\n  final Site site;\n  HomeListController(this.site);\n\n  @override\n  Future<List<LiveRoomItem>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getRecommendRooms(page: page);\n\n    return result.items;\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_list_view.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/home/home_list_controller.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/live_room_card.dart';\nimport 'package:simple_live_app/widgets/page_grid_view.dart';\n\nclass HomeListView extends StatelessWidget {\n  final String tag;\n  const HomeListView(this.tag, {Key? key}) : super(key: key);\n  HomeListController get controller => Get.find<HomeListController>(tag: tag);\n  @override\n  Widget build(BuildContext context) {\n    var c = MediaQuery.of(context).size.width ~/ 200;\n    if (c < 2) {\n      c = 2;\n    }\n    return KeepAliveWrapper(\n      child: PageGridView(\n        pageController: controller,\n        padding: AppStyle.edgeInsetsA12,\n        firstRefresh: true,\n        mainAxisSpacing: 12,\n        crossAxisSpacing: 12,\n        crossAxisCount: c,\n        itemBuilder: (_, i) {\n          var item = controller.list[i];\n          return LiveRoomCard(controller.site, item);\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/home/home_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/home/home_controller.dart';\nimport 'package:simple_live_app/modules/home/home_list_view.dart';\n\nclass HomePage extends GetView<HomeController> {\n  const HomePage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        titleSpacing: 8,\n        title: TabBar(\n          controller: controller.tabController,\n          labelPadding: AppStyle.edgeInsetsH20,\n          isScrollable: true,\n          indicatorSize: TabBarIndicatorSize.label,\n          tabAlignment: TabAlignment.center,\n          tabs: Sites.supportSites\n              .map(\n                (e) => Tab(\n                  //text: e.name,\n\n                  child: Row(\n                    children: [\n                      Image.asset(\n                        e.logo,\n                        width: 24,\n                      ),\n                      AppStyle.hGap8,\n                      Text(e.name),\n                    ],\n                  ),\n                ),\n              )\n              .toList(),\n        ),\n        actions: [\n          IconButton(\n            onPressed: controller.toSearch,\n            icon: const Icon(Icons.search),\n          )\n        ],\n      ),\n      body: TabBarView(\n        controller: controller.tabController,\n        children: Sites.supportSites\n            .map(\n              (e) => HomeListView(\n                e.id,\n              ),\n            )\n            .toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/indexed/indexed_controller.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/category/category_controller.dart';\nimport 'package:simple_live_app/modules/category/category_page.dart';\nimport 'package:simple_live_app/modules/home/home_controller.dart';\nimport 'package:simple_live_app/modules/home/home_page.dart';\nimport 'package:simple_live_app/modules/follow_user/follow_user_controller.dart';\nimport 'package:simple_live_app/modules/follow_user/follow_user_page.dart';\nimport 'package:simple_live_app/modules/mine/mine_page.dart';\n\nclass IndexedController extends GetxController {\n  RxList<HomePageItem> items = RxList<HomePageItem>([]);\n\n  var index = 0.obs;\n  RxList<Widget> pages = RxList<Widget>([\n    const SizedBox(),\n    const SizedBox(),\n    const SizedBox(),\n    const SizedBox(),\n  ]);\n\n  void setIndex(int i) {\n    if (pages[i] is SizedBox) {\n      switch (items[i].index) {\n        case 0:\n          Get.put(HomeController());\n          pages[i] = const HomePage();\n          break;\n        case 1:\n          Get.put(FollowUserController());\n          pages[i] = const FollowUserPage();\n          break;\n        case 2:\n          Get.put(CategoryController());\n          pages[i] = const CategoryPage();\n          break;\n        case 3:\n          pages[i] = const MinePage();\n          break;\n        default:\n      }\n    } else {\n      if (index.value == i) {\n        EventBus.instance\n            .emit<int>(EventBus.kBottomNavigationBarClicked, items[i].index);\n      }\n    }\n\n    index.value = i;\n  }\n\n  @override\n  void onInit() {\n    Future.delayed(Duration.zero, showFirstRun);\n    items.value = AppSettingsController.instance.homeSort\n        .map((key) => Constant.allHomePages[key]!)\n        .toList();\n    setIndex(0);\n    super.onInit();\n  }\n\n  void showFirstRun() async {\n    var settingsController = Get.find<AppSettingsController>();\n    if (settingsController.firstRun) {\n      settingsController.setNoFirstRun();\n      await Utils.showStatement();\n    } \n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/indexed/indexed_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nimport 'indexed_controller.dart';\n\nclass IndexedPage extends GetView<IndexedController> {\n  const IndexedPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return OrientationBuilder(\n      builder: (context, orientation) {\n        return Scaffold(\n          body: Row(\n            children: [\n              Visibility(\n                visible: orientation == Orientation.landscape,\n                child: Obx(\n                  () => NavigationRail(\n                    selectedIndex: controller.index.value,\n                    onDestinationSelected: controller.setIndex,\n                    labelType: NavigationRailLabelType.none,\n                    destinations: controller.items\n                        .map(\n                          (item) => NavigationRailDestination(\n                            icon: Icon(item.iconData),\n                            label: Text(item.title),\n                            padding: AppStyle.edgeInsetsV8,\n                          ),\n                        )\n                        .toList(),\n                  ),\n                ),\n              ),\n              Expanded(\n                child: Obx(\n                  () => Container(\n                    decoration: BoxDecoration(\n                      border: Border(\n                        left: orientation == Orientation.landscape\n                            ? BorderSide(\n                                color: Colors.grey.withAlpha(50),\n                                width: 1,\n                              )\n                            : BorderSide.none,\n                      ),\n                    ),\n                    child: IndexedStack(\n                      index: controller.index.value,\n                      children: controller.pages,\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          ),\n          bottomNavigationBar: Visibility(\n            visible: orientation == Orientation.portrait,\n            child: Obx(\n              () => NavigationBar(\n                selectedIndex: controller.index.value,\n                onDestinationSelected: controller.setIndex,\n                height: 56,\n                labelBehavior: NavigationDestinationLabelBehavior.alwaysHide,\n                destinations: controller.items\n                    .map(\n                      (item) => NavigationDestination(\n                        icon: Icon(item.iconData),\n                        label: item.title,\n                      ),\n                    )\n                    .toList(),\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/live_room_controller.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:share_plus/share_plus.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/modules/live_room/player/player_controller.dart';\nimport 'package:simple_live_app/modules/settings/danmu_settings_page.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/widgets/desktop_refresh_button.dart';\nimport 'package:simple_live_app/widgets/follow_user_item.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:wakelock_plus/wakelock_plus.dart';\n\nclass LiveRoomController extends PlayerController with WidgetsBindingObserver {\n  final Site pSite;\n  final String pRoomId;\n  late LiveDanmaku liveDanmaku;\n  LiveRoomController({\n    required this.pSite,\n    required this.pRoomId,\n  }) {\n    rxSite = pSite.obs;\n    rxRoomId = pRoomId.obs;\n    liveDanmaku = site.liveSite.getDanmaku();\n    // 抖音应该默认是竖屏的\n    if (site.id == \"douyin\") {\n      isVertical.value = true;\n    }\n  }\n\n  late Rx<Site> rxSite;\n  Site get site => rxSite.value;\n  late Rx<String> rxRoomId;\n  String get roomId => rxRoomId.value;\n\n  Rx<LiveRoomDetail?> detail = Rx<LiveRoomDetail?>(null);\n  var online = 0.obs;\n  var followed = false.obs;\n  var liveStatus = false.obs;\n  RxList<LiveSuperChatMessage> superChats = RxList<LiveSuperChatMessage>();\n\n  /// 滚动控制\n  final ScrollController scrollController = ScrollController();\n\n  /// 聊天信息\n  RxList<LiveMessage> messages = RxList<LiveMessage>();\n\n  /// 清晰度数据\n  RxList<LivePlayQuality> qualites = RxList<LivePlayQuality>();\n\n  /// 当前清晰度\n  var currentQuality = -1;\n  var currentQualityInfo = \"\".obs;\n\n  /// 线路数据\n  RxList<String> playUrls = RxList<String>();\n\n  Map<String, String>? playHeaders;\n\n  /// 当前线路\n  var currentLineIndex = -1;\n  var currentLineInfo = \"\".obs;\n\n  /// 退出倒计时\n  var countdown = 60.obs;\n\n  Timer? autoExitTimer;\n\n  /// 设置的自动关闭时间（分钟）\n  var autoExitMinutes = 60.obs;\n\n  ///是否延迟自动关闭\n  var delayAutoExit = false.obs;\n\n  /// 是否启用自动关闭\n  var autoExitEnable = false.obs;\n\n  /// 是否禁用自动滚动聊天栏\n  /// - 当用户向上滚动聊天栏时，不再自动滚动\n  var disableAutoScroll = false.obs;\n\n  /// 是否处于后台\n  var isBackground = false;\n\n  /// 直播间加载失败\n  var loadError = false.obs;\n  Error? error;\n\n  // 开播时长状态变量\n  var liveDuration = \"00:00:00\".obs;\n  Timer? _liveDurationTimer;\n\n  @override\n  void onInit() {\n    WidgetsBinding.instance.addObserver(this);\n    if (FollowService.instance.followList.isEmpty) {\n      FollowService.instance.loadData();\n    }\n    initAutoExit();\n    showDanmakuState.value = AppSettingsController.instance.danmuEnable.value;\n    followed.value = DBService.instance.getFollowExist(\"${site.id}_$roomId\");\n    loadData();\n\n    scrollController.addListener(scrollListener);\n\n    super.onInit();\n  }\n\n  void scrollListener() {\n    if (scrollController.position.userScrollDirection ==\n        ScrollDirection.forward) {\n      disableAutoScroll.value = true;\n    }\n  }\n\n  /// 初始化自动关闭倒计时\n  void initAutoExit() {\n    if (AppSettingsController.instance.autoExitEnable.value) {\n      autoExitEnable.value = true;\n      autoExitMinutes.value =\n          AppSettingsController.instance.autoExitDuration.value;\n      setAutoExit();\n    } else {\n      autoExitMinutes.value =\n          AppSettingsController.instance.roomAutoExitDuration.value;\n    }\n  }\n\n  void setAutoExit() {\n    if (!autoExitEnable.value) {\n      autoExitTimer?.cancel();\n      return;\n    }\n    autoExitTimer?.cancel();\n    countdown.value = autoExitMinutes.value * 60;\n    autoExitTimer = Timer.periodic(const Duration(seconds: 1), (timer) async {\n      countdown.value -= 1;\n      if (countdown.value <= 0) {\n        timer = Timer(const Duration(seconds: 10), () async {\n          await WakelockPlus.disable();\n          exit(0);\n        });\n        autoExitTimer?.cancel();\n        var delay = await Utils.showAlertDialog(\"定时关闭已到时,是否延迟关闭?\",\n            title: \"延迟关闭\", confirm: \"延迟\", cancel: \"关闭\", selectable: true);\n        if (delay) {\n          timer.cancel();\n          delayAutoExit.value = true;\n          showAutoExitSheet();\n          setAutoExit();\n        } else {\n          delayAutoExit.value = false;\n          await WakelockPlus.disable();\n          exit(0);\n        }\n      }\n    });\n  }\n  // 弹窗逻辑\n\n  void refreshRoom() {\n    //messages.clear();\n    superChats.clear();\n    liveDanmaku.stop();\n\n    loadData();\n  }\n\n  /// 聊天栏始终滚动到底部\n  void chatScrollToBottom() {\n    if (scrollController.hasClients) {\n      // 如果手动上拉过，就不自动滚动到底部\n      if (disableAutoScroll.value) {\n        return;\n      }\n      scrollController.jumpTo(scrollController.position.maxScrollExtent);\n    }\n  }\n\n  /// 初始化弹幕接收事件\n  void initDanmau() {\n    liveDanmaku.onMessage = onWSMessage;\n    liveDanmaku.onClose = onWSClose;\n    liveDanmaku.onReady = onWSReady;\n  }\n\n  /// 接收到WebSocket信息\n  void onWSMessage(LiveMessage msg) {\n    if (msg.type == LiveMessageType.chat) {\n      if (messages.length > 200 && !disableAutoScroll.value) {\n        messages.removeAt(0);\n      }\n\n      // 关键词屏蔽检查\n      for (var keyword in AppSettingsController.instance.shieldList) {\n        Pattern? pattern;\n        if (Utils.isRegexFormat(keyword)) {\n          String removedSlash = Utils.removeRegexFormat(keyword);\n          try {\n            pattern = RegExp(removedSlash);\n          } catch (e) {\n            // should avoid this during add keyword\n            Log.d(\"关键词：$keyword 正则格式错误\");\n          }\n        } else {\n          pattern = keyword;\n        }\n        if (pattern != null && msg.message.contains(pattern)) {\n          Log.d(\"关键词：$keyword\\n已屏蔽消息内容：${msg.message}\");\n          return;\n        }\n      }\n\n      messages.add(msg);\n\n      WidgetsBinding.instance.addPostFrameCallback(\n        (_) => chatScrollToBottom(),\n      );\n      if (!liveStatus.value || isBackground) {\n        return;\n      }\n\n      addDanmaku([\n        DanmakuContentItem(\n          msg.message,\n          color: Color.fromARGB(\n            255,\n            msg.color.r,\n            msg.color.g,\n            msg.color.b,\n          ),\n        ),\n      ]);\n    } else if (msg.type == LiveMessageType.online) {\n      online.value = msg.data;\n    } else if (msg.type == LiveMessageType.superChat) {\n      superChats.add(msg.data);\n    }\n  }\n\n  /// 添加一条系统消息\n  void addSysMsg(String msg) {\n    messages.add(\n      LiveMessage(\n        type: LiveMessageType.chat,\n        userName: \"LiveSysMessage\",\n        message: msg,\n        color: LiveMessageColor.white,\n      ),\n    );\n  }\n\n  /// 接收到WebSocket关闭信息\n  void onWSClose(String msg) {\n    addSysMsg(msg);\n  }\n\n  /// WebSocket准备就绪\n  void onWSReady() {\n    addSysMsg(\"弹幕服务器连接正常\");\n  }\n\n  /// 加载直播间信息\n  void loadData() async {\n    try {\n      SmartDialog.showLoading(msg: \"\");\n      loadError.value = false;\n      error = null;\n      update();\n      addSysMsg(\"正在读取直播间信息\");\n      detail.value = await site.liveSite.getRoomDetail(roomId: roomId);\n\n      if (site.id == Constant.kDouyin) {\n        // 1.6.0之前收藏的WebRid\n        // 1.6.0收藏的RoomID\n        // 1.6.0之后改回WebRid\n        if (detail.value!.roomId != roomId) {\n          var oldId = roomId;\n          rxRoomId.value = detail.value!.roomId;\n          if (followed.value) {\n            // 更新关注列表\n            DBService.instance.deleteFollow(\"${site.id}_$oldId\");\n            DBService.instance.addFollow(\n              FollowUser(\n                id: \"${site.id}_$roomId\",\n                roomId: roomId,\n                siteId: site.id,\n                userName: detail.value!.userName,\n                face: detail.value!.userAvatar,\n                addTime: DateTime.now(),\n              ),\n            );\n          } else {\n            followed.value =\n                DBService.instance.getFollowExist(\"${site.id}_$roomId\");\n          }\n        }\n      }\n\n      getSuperChatMessage();\n\n      addHistory();\n      // 确认房间关注状态\n      followed.value = DBService.instance.getFollowExist(\"${site.id}_$roomId\");\n      online.value = detail.value!.online;\n      liveStatus.value = detail.value!.status || detail.value!.isRecord;\n      if (liveStatus.value) {\n        getPlayQualites();\n      }\n      if (detail.value!.isRecord) {\n        addSysMsg(\"当前主播未开播，正在轮播录像\");\n      }\n      addSysMsg(\"开始连接弹幕服务器\");\n      initDanmau();\n      liveDanmaku.start(detail.value?.danmakuData);\n      startLiveDurationTimer(); // 启动开播时长定时器\n    } catch (e) {\n      Log.logPrint(e);\n      //SmartDialog.showToast(e.toString());\n      loadError.value = true;\n      error = e as Error;\n    } finally {\n      SmartDialog.dismiss(status: SmartStatus.loading);\n    }\n  }\n\n  /// 初始化播放器\n  void getPlayQualites() async {\n    qualites.clear();\n    currentQuality = -1;\n\n    try {\n      var playQualites =\n          await site.liveSite.getPlayQualites(detail: detail.value!);\n\n      if (playQualites.isEmpty) {\n        SmartDialog.showToast(\"无法读取播放清晰度\");\n        return;\n      }\n      qualites.value = playQualites;\n      var qualityLevel = await getQualityLevel();\n      if (qualityLevel == 2) {\n        //最高\n        currentQuality = 0;\n      } else if (qualityLevel == 0) {\n        //最低\n        currentQuality = playQualites.length - 1;\n      } else {\n        //中间值\n        int middle = (playQualites.length / 2).floor();\n        currentQuality = middle;\n      }\n\n      getPlayUrl();\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"无法读取播放清晰度\");\n    }\n  }\n\n  Future<int> getQualityLevel() async {\n    var qualityLevel = AppSettingsController.instance.qualityLevel.value;\n    try {\n      var connectivityResult = await (Connectivity().checkConnectivity());\n      if (connectivityResult.first == ConnectivityResult.mobile) {\n        qualityLevel =\n            AppSettingsController.instance.qualityLevelCellular.value;\n      }\n    } catch (e) {\n      Log.logPrint(e);\n    }\n    return qualityLevel;\n  }\n\n  void getPlayUrl() async {\n    playUrls.clear();\n    currentQualityInfo.value = qualites[currentQuality].quality;\n    currentLineInfo.value = \"\";\n    currentLineIndex = -1;\n    var playUrl = await site.liveSite\n        .getPlayUrls(detail: detail.value!, quality: qualites[currentQuality]);\n    if (playUrl.urls.isEmpty) {\n      SmartDialog.showToast(\"无法读取播放地址\");\n      return;\n    }\n    playUrls.value = playUrl.urls;\n    playHeaders = playUrl.headers;\n    currentLineIndex = 0;\n    currentLineInfo.value = \"线路${currentLineIndex + 1}\";\n    //重置错误次数\n    mediaErrorRetryCount = 0;\n    initPlaylist();\n  }\n\n  void changePlayLine(int index) {\n    currentLineIndex = index;\n    //重置错误次数\n    mediaErrorRetryCount = 0;\n    setPlayer();\n  }\n\n  void initPlaylist() async {\n    currentLineInfo.value = \"线路${currentLineIndex + 1}\";\n    errorMsg.value = \"\";\n\n    final mediaList = playUrls.map((url) {\n      var finalUrl = url;\n      if (AppSettingsController.instance.playerForceHttps.value) {\n        finalUrl = finalUrl.replaceAll(\"http://\", \"https://\");\n      }\n      return Media(finalUrl, httpHeaders: playHeaders);\n    }).toList();\n\n    // 初始化播放器并设置 ao 参数\n    await initializePlayer();\n\n    await player.open(Playlist(mediaList));\n  }\n\n  void setPlayer() async {\n    currentLineInfo.value = \"线路${currentLineIndex + 1}\";\n    errorMsg.value = \"\";\n\n    await player.jump(currentLineIndex);\n  }\n\n  @override\n  void mediaEnd() async {\n    super.mediaEnd();\n    if (mediaErrorRetryCount < 2) {\n      Log.d(\"播放结束，尝试第${mediaErrorRetryCount + 1}次刷新\");\n      if (mediaErrorRetryCount == 1) {\n        //延迟一秒再刷新\n        await Future.delayed(const Duration(seconds: 1));\n      }\n      mediaErrorRetryCount += 1;\n      //刷新一次\n      setPlayer();\n      return;\n    }\n\n    Log.d(\"播放结束\");\n    // 遍历线路，如果全部链接都断开就是直播结束了\n    if (playUrls.length - 1 == currentLineIndex) {\n      liveStatus.value = false;\n    } else {\n      changePlayLine(currentLineIndex + 1);\n\n      //setPlayer();\n    }\n  }\n\n  int mediaErrorRetryCount = 0;\n  @override\n  void mediaError(String error) async {\n    super.mediaEnd();\n    if (mediaErrorRetryCount < 2) {\n      Log.d(\"播放失败，尝试第${mediaErrorRetryCount + 1}次刷新\");\n      if (mediaErrorRetryCount == 1) {\n        //延迟一秒再刷新\n        await Future.delayed(const Duration(seconds: 1));\n      }\n      mediaErrorRetryCount += 1;\n      //刷新一次\n      setPlayer();\n      return;\n    }\n\n    if (playUrls.length - 1 == currentLineIndex) {\n      errorMsg.value = \"播放失败\";\n      SmartDialog.showToast(\"播放失败:$error\");\n    } else {\n      //currentLineIndex += 1;\n      //setPlayer();\n      changePlayLine(currentLineIndex + 1);\n    }\n  }\n\n  /// 读取SC\n  void getSuperChatMessage() async {\n    try {\n      var sc =\n          await site.liveSite.getSuperChatMessage(roomId: detail.value!.roomId);\n      superChats.addAll(sc);\n    } catch (e) {\n      Log.logPrint(e);\n      addSysMsg(\"SC读取失败\");\n    }\n  }\n\n  /// 移除掉已到期的SC\n  void removeSuperChats() async {\n    var now = DateTime.now().millisecondsSinceEpoch;\n    superChats.value = superChats\n        .where((x) => x.endTime.millisecondsSinceEpoch > now)\n        .toList();\n  }\n\n  /// 添加历史记录\n  void addHistory() {\n    if (detail.value == null) {\n      return;\n    }\n    var id = \"${site.id}_$roomId\";\n    var history = DBService.instance.getHistory(id);\n    if (history != null) {\n      history.updateTime = DateTime.now();\n    }\n    history ??= History(\n      id: id,\n      roomId: roomId,\n      siteId: site.id,\n      userName: detail.value?.userName ?? \"\",\n      face: detail.value?.userAvatar ?? \"\",\n      updateTime: DateTime.now(),\n    );\n\n    DBService.instance.addOrUpdateHistory(history);\n  }\n\n  /// 关注用户\n  void followUser() {\n    if (detail.value == null) {\n      return;\n    }\n    var id = \"${site.id}_$roomId\";\n    DBService.instance.addFollow(\n      FollowUser(\n        id: id,\n        roomId: roomId,\n        siteId: site.id,\n        userName: detail.value?.userName ?? \"\",\n        face: detail.value?.userAvatar ?? \"\",\n        addTime: DateTime.now(),\n      ),\n    );\n    followed.value = true;\n    EventBus.instance.emit(Constant.kUpdateFollow, id);\n  }\n\n  /// 取消关注用户\n  void removeFollowUser() async {\n    if (detail.value == null) {\n      return;\n    }\n    if (!await Utils.showAlertDialog(\"确定要取消关注该用户吗？\", title: \"取消关注\")) {\n      return;\n    }\n\n    var id = \"${site.id}_$roomId\";\n    DBService.instance.deleteFollow(id);\n    followed.value = false;\n    EventBus.instance.emit(Constant.kUpdateFollow, id);\n  }\n\n  void share() {\n    if (detail.value == null) {\n      return;\n    }\n    SharePlus.instance.share(ShareParams(uri: Uri.parse(detail.value!.url)));\n  }\n\n  void copyUrl() {\n    if (detail.value == null) {\n      return;\n    }\n    Utils.copyToClipboard(detail.value!.url);\n    SmartDialog.showToast(\"已复制直播间链接\");\n  }\n\n  /// 复制新生成的直播流\n  void copyPlayUrl() async {\n    // 未开播不复制\n    if (!liveStatus.value) {\n      return;\n    }\n    var playUrl = await site.liveSite\n        .getPlayUrls(detail: detail.value!, quality: qualites[currentQuality]);\n    if (playUrl.urls.isEmpty) {\n      SmartDialog.showToast(\"无法读取播放地址\");\n      return;\n    }\n    Utils.copyToClipboard(playUrl.urls.first);\n    SmartDialog.showToast(\"已复制播放直链\");\n  }\n\n  /// 底部打开播放器设置\n  void showDanmuSettingsSheet() {\n    Utils.showBottomSheet(\n      title: \"弹幕设置\",\n      child: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          DanmuSettingsView(\n            danmakuController: danmakuController,\n            onTapDanmuShield: () {\n              Get.back();\n              showDanmuShield();\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showVolumeSlider(BuildContext targetContext) {\n    SmartDialog.showAttach(\n      targetContext: targetContext,\n      alignment: Alignment.topCenter,\n      displayTime: const Duration(seconds: 3),\n      maskColor: const Color(0x00000000),\n      builder: (context) {\n        return Container(\n          decoration: BoxDecoration(\n            borderRadius: AppStyle.radius12,\n            color: Theme.of(context).cardColor,\n          ),\n          padding: AppStyle.edgeInsetsA4,\n          child: Obx(\n            () => SizedBox(\n              width: 200,\n              child: Slider(\n                min: 0,\n                max: 100,\n                value: AppSettingsController.instance.playerVolume.value,\n                onChanged: (newValue) {\n                  player.setVolume(newValue);\n                  AppSettingsController.instance.setPlayerVolume(newValue);\n                },\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  void showQualitySheet() {\n    Utils.showBottomSheet(\n      title: \"切换清晰度\",\n      child: RadioGroup(\n        groupValue: currentQuality,\n        onChanged: (e) {\n          Get.back();\n          currentQuality = e ?? 0;\n          getPlayUrl();\n        },\n        child: ListView.builder(\n          itemCount: qualites.length,\n          itemBuilder: (_, i) {\n            var item = qualites[i];\n            return RadioListTile(\n              value: i,\n              title: Text(item.quality),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  void showPlayUrlsSheet() {\n    Utils.showBottomSheet(\n      title: \"切换线路\",\n      child: RadioGroup(\n        groupValue: currentLineIndex,\n        onChanged: (e) {\n          Get.back();\n          //currentLineIndex = i;\n          //setPlayer();\n          changePlayLine(e ?? 0);\n        },\n        child: ListView.builder(\n          itemCount: playUrls.length,\n          itemBuilder: (_, i) {\n            return RadioListTile(\n              value: i,\n              title: Text(\"线路${i + 1}\"),\n              secondary: Text(\n                playUrls[i].contains(\".flv\") ? \"FLV\" : \"HLS\",\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  void showPlayerSettingsSheet() {\n    Utils.showBottomSheet(\n      title: \"画面尺寸\",\n      child: Obx(\n        () => RadioGroup(\n          groupValue: AppSettingsController.instance.scaleMode.value,\n          onChanged: (e) {\n            AppSettingsController.instance.setScaleMode(e ?? 0);\n            updateScaleMode();\n          },\n          child: ListView(\n            padding: AppStyle.edgeInsetsV12,\n            children: const [\n              RadioListTile(\n                value: 0,\n                title: Text(\"适应\"),\n                visualDensity: VisualDensity.compact,\n              ),\n              RadioListTile(\n                value: 1,\n                title: Text(\"拉伸\"),\n                visualDensity: VisualDensity.compact,\n              ),\n              RadioListTile(\n                value: 2,\n                title: Text(\"铺满\"),\n                visualDensity: VisualDensity.compact,\n              ),\n              RadioListTile(\n                value: 3,\n                title: Text(\"16:9\"),\n                visualDensity: VisualDensity.compact,\n              ),\n              RadioListTile(\n                value: 4,\n                title: Text(\"4:3\"),\n                visualDensity: VisualDensity.compact,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void showDanmuShield() {\n    TextEditingController keywordController = TextEditingController();\n\n    void addKeyword() {\n      if (keywordController.text.isEmpty) {\n        SmartDialog.showToast(\"请输入关键词\");\n        return;\n      }\n\n      AppSettingsController.instance\n          .addShieldList(keywordController.text.trim());\n      keywordController.text = \"\";\n    }\n\n    Utils.showBottomSheet(\n      title: \"关键词屏蔽\",\n      child: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          TextField(\n            controller: keywordController,\n            decoration: InputDecoration(\n              contentPadding: AppStyle.edgeInsetsH12,\n              border: const OutlineInputBorder(),\n              hintText: \"请输入关键词\",\n              suffixIcon: TextButton.icon(\n                onPressed: addKeyword,\n                icon: const Icon(Icons.add),\n                label: const Text(\"添加\"),\n              ),\n            ),\n            onSubmitted: (e) {\n              addKeyword();\n            },\n          ),\n          AppStyle.vGap12,\n          Obx(\n            () => Text(\n              \"已添加${AppSettingsController.instance.shieldList.length}个关键词（点击移除）\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          AppStyle.vGap12,\n          Obx(\n            () => Wrap(\n              runSpacing: 12,\n              spacing: 12,\n              children: AppSettingsController.instance.shieldList\n                  .map(\n                    (item) => InkWell(\n                      borderRadius: AppStyle.radius24,\n                      onTap: () {\n                        AppSettingsController.instance.removeShieldList(item);\n                      },\n                      child: Container(\n                        decoration: BoxDecoration(\n                          border: Border.all(color: Colors.grey),\n                          borderRadius: AppStyle.radius24,\n                        ),\n                        padding: AppStyle.edgeInsetsH12.copyWith(\n                          top: 4,\n                          bottom: 4,\n                        ),\n                        child: Text(\n                          item,\n                          style: Get.textTheme.bodyMedium,\n                        ),\n                      ),\n                    ),\n                  )\n                  .toList(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showFollowUserSheet() {\n    Utils.showBottomSheet(\n      title: \"关注列表\",\n      child: Obx(\n        () => Stack(\n          children: [\n            RefreshIndicator(\n              onRefresh: FollowService.instance.loadData,\n              child: ListView.builder(\n                itemCount: FollowService.instance.liveList.length,\n                itemBuilder: (_, i) {\n                  var item = FollowService.instance.liveList[i];\n                  return Obx(\n                    () => FollowUserItem(\n                      item: item,\n                      playing: rxSite.value.id == item.siteId &&\n                          rxRoomId.value == item.roomId,\n                      onTap: () {\n                        Get.back();\n                        resetRoom(\n                          Sites.allSites[item.siteId]!,\n                          item.roomId,\n                        );\n                      },\n                    ),\n                  );\n                },\n              ),\n            ),\n            if (Platform.isLinux || Platform.isWindows || Platform.isMacOS)\n              Positioned(\n                right: 12,\n                bottom: 12,\n                child: Obx(\n                  () => DesktopRefreshButton(\n                    refreshing: FollowService.instance.updating.value,\n                    onPressed: FollowService.instance.loadData,\n                  ),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void showAutoExitSheet() {\n    if (AppSettingsController.instance.autoExitEnable.value &&\n        !delayAutoExit.value) {\n      SmartDialog.showToast(\"已设置了全局定时关闭\");\n      return;\n    }\n    Utils.showBottomSheet(\n      title: \"定时关闭\",\n      child: ListView(\n        children: [\n          Obx(\n            () => SwitchListTile(\n              title: Text(\n                \"启用定时关闭\",\n                style: Get.textTheme.titleMedium,\n              ),\n              value: autoExitEnable.value,\n              onChanged: (e) {\n                autoExitEnable.value = e;\n\n                setAutoExit();\n                //controller.setAutoExitEnable(e);\n              },\n            ),\n          ),\n          Obx(\n            () => ListTile(\n              enabled: autoExitEnable.value,\n              title: Text(\n                \"自动关闭时间：${autoExitMinutes.value ~/ 60}小时${autoExitMinutes.value % 60}分钟\",\n                style: Get.textTheme.titleMedium,\n              ),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () async {\n                var value = await showTimePicker(\n                  context: Get.context!,\n                  initialTime: TimeOfDay(\n                    hour: autoExitMinutes.value ~/ 60,\n                    minute: autoExitMinutes.value % 60,\n                  ),\n                  initialEntryMode: TimePickerEntryMode.inputOnly,\n                  builder: (_, child) {\n                    return MediaQuery(\n                      data: Get.mediaQuery.copyWith(\n                        alwaysUse24HourFormat: true,\n                      ),\n                      child: child!,\n                    );\n                  },\n                );\n                if (value == null || (value.hour == 0 && value.minute == 0)) {\n                  return;\n                }\n                var duration =\n                    Duration(hours: value.hour, minutes: value.minute);\n                autoExitMinutes.value = duration.inMinutes;\n                AppSettingsController.instance\n                    .setRoomAutoExitDuration(autoExitMinutes.value);\n                //setAutoExitDuration(duration.inMinutes);\n                setAutoExit();\n              },\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void openNaviteAPP() async {\n    var naviteUrl = \"\";\n    var webUrl = \"\";\n    if (site.id == Constant.kBiliBili) {\n      naviteUrl = \"bilibili://live/${detail.value?.roomId}\";\n      webUrl = \"https://live.bilibili.com/${detail.value?.roomId}\";\n    } else if (site.id == Constant.kDouyin) {\n      var args = detail.value?.danmakuData as DouyinDanmakuArgs;\n      naviteUrl = \"snssdk1128://webcast_room?room_id=${args.roomId}\";\n      webUrl = \"https://live.douyin.com/${args.webRid}\";\n    } else if (site.id == Constant.kHuya) {\n      var args = detail.value?.danmakuData as HuyaDanmakuArgs;\n      naviteUrl =\n          \"yykiwi://homepage/index.html?banneraction=https%3A%2F%2Fdiy-front.cdn.huya.com%2Fzt%2Ffrontpage%2Fcc%2Fupdate.html%3Fhyaction%3Dlive%26channelid%3D${args.subSid}%26subid%3D${args.subSid}%26liveuid%3D${args.subSid}%26screentype%3D1%26sourcetype%3D0%26fromapp%3Dhuya_wap%252Fclick%252Fopen_app_guide%26&fromapp=huya_wap/click/open_app_guide\";\n      webUrl = \"https://www.huya.com/${detail.value?.roomId}\";\n    } else if (site.id == Constant.kDouyu) {\n      naviteUrl =\n          \"douyulink://?type=90001&schemeUrl=douyuapp%3A%2F%2Froom%3FliveType%3D0%26rid%3D${detail.value?.roomId}\";\n      webUrl = \"https://www.douyu.com/${detail.value?.roomId}\";\n    }\n    try {\n      await launchUrlString(naviteUrl, mode: LaunchMode.externalApplication);\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"无法打开APP，将使用浏览器打开\");\n      await launchUrlString(webUrl, mode: LaunchMode.externalApplication);\n    }\n  }\n\n  void resetRoom(Site site, String roomId) async {\n    if (this.site == site && this.roomId == roomId) {\n      return;\n    }\n\n    rxSite.value = site;\n    rxRoomId.value = roomId;\n\n    // 清除全部消息\n    liveDanmaku.stop();\n    messages.clear();\n    superChats.clear();\n    danmakuController?.clear();\n\n    // 重新设置LiveDanmaku\n    liveDanmaku = site.liveSite.getDanmaku();\n\n    // 停止播放\n    await player.stop();\n\n    // 刷新信息\n    loadData();\n  }\n\n  void copyErrorDetail() {\n    Utils.copyToClipboard('''直播平台：${rxSite.value.name}\n房间号：${rxRoomId.value}\n错误信息：\n${error?.toString()}\n----------------\n${error?.stackTrace}''');\n    SmartDialog.showToast(\"已复制错误信息\");\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    super.didChangeAppLifecycleState(state);\n\n    if (state == AppLifecycleState.paused) {\n      Log.d(\"进入后台\");\n      //进入后台，关闭弹幕\n      danmakuController?.clear();\n      isBackground = true;\n    } else\n    //返回前台\n    if (state == AppLifecycleState.resumed) {\n      Log.d(\"返回前台\");\n      isBackground = false;\n    }\n  }\n\n  // 用于启动开播时长计算和更新的函数\n  void startLiveDurationTimer() {\n    // 如果不是直播状态或者 showTime 为空，则不启动定时器\n    if (!(detail.value?.status ?? false) || detail.value?.showTime == null) {\n      liveDuration.value = \"00:00:00\"; // 未开播时显示 00:00:00\n      _liveDurationTimer?.cancel();\n      return;\n    }\n\n    try {\n      int startTimeStamp = int.parse(detail.value!.showTime!);\n      // 取消之前的定时器\n      _liveDurationTimer?.cancel();\n      // 创建新的定时器，每秒更新一次\n      _liveDurationTimer = Timer.periodic(const Duration(seconds: 1), (timer) {\n        int currentTimeStamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n        int durationInSeconds = currentTimeStamp - startTimeStamp;\n\n        int hours = durationInSeconds ~/ 3600;\n        int minutes = (durationInSeconds % 3600) ~/ 60;\n        int seconds = durationInSeconds % 60;\n\n        String formattedDuration =\n            '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}';\n        liveDuration.value = formattedDuration;\n      });\n    } catch (e) {\n      liveDuration.value = \"--:--:--\"; // 错误时显示 --:--:--\n    }\n  }\n\n  @override\n  void onClose() {\n    WidgetsBinding.instance.removeObserver(this);\n    scrollController.removeListener(scrollListener);\n    autoExitTimer?.cancel();\n\n    liveDanmaku.stop();\n    danmakuController = null;\n    _liveDurationTimer?.cancel(); // 页面关闭时取消定时器\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/live_room_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:floating/floating.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:lottie/lottie.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_app/modules/live_room/player/player_controls.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/widgets/desktop_refresh_button.dart';\nimport 'package:simple_live_app/widgets/follow_user_item.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_app/widgets/settings/settings_action.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_number.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\nimport 'package:simple_live_app/widgets/superchat_card.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass LiveRoomPage extends GetView<LiveRoomController> {\n  const LiveRoomPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    final page = Obx(\n      () {\n        if (controller.loadError.value) {\n          return Scaffold(\n            appBar: AppBar(\n              title: const Text(\"直播间加载失败\"),\n            ),\n            body: Padding(\n              padding: AppStyle.edgeInsetsA12,\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.stretch,\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  LottieBuilder.asset(\n                    'assets/lotties/error.json',\n                    height: 140,\n                    repeat: false,\n                  ),\n                  const Text(\n                    \"直播间加载失败\",\n                    textAlign: TextAlign.center,\n                  ),\n                  AppStyle.vGap4,\n                  Text(\n                    controller.error?.toString() ?? \"未知错误\",\n                    textAlign: TextAlign.center,\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                    style: const TextStyle(fontSize: 12, color: Colors.grey),\n                  ),\n                  AppStyle.vGap4,\n                  Text(\n                    \"${controller.rxSite.value.id} - ${controller.rxRoomId.value}\",\n                    textAlign: TextAlign.center,\n                    style: const TextStyle(fontSize: 12, color: Colors.grey),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    children: [\n                      TextButton.icon(\n                        onPressed: controller.copyErrorDetail,\n                        icon: const Icon(Remix.file_copy_line),\n                        label: const Text(\"复制信息\"),\n                      ),\n                      TextButton.icon(\n                        onPressed: controller.refreshRoom,\n                        icon: const Icon(Remix.refresh_line),\n                        label: const Text(\"刷新\"),\n                      ),\n                    ],\n                  )\n                ],\n              ),\n            ),\n          );\n        }\n        if (controller.fullScreenState.value) {\n          return PopScope(\n            canPop: false,\n            onPopInvokedWithResult: (e, r) {\n              controller.exitFull();\n            },\n            child: Scaffold(\n              body: buildMediaPlayer(),\n            ),\n          );\n        } else {\n          return buildPageUI();\n        }\n      },\n    );\n    if (!Platform.isAndroid) {\n      return page;\n    }\n    return PiPSwitcher(\n      floating: controller.pip,\n      childWhenDisabled: page,\n      childWhenEnabled: buildMediaPlayer(),\n    );\n  }\n\n  Widget buildPageUI() {\n    return OrientationBuilder(\n      builder: (context, orientation) {\n        return Scaffold(\n          appBar: AppBar(\n            title: Obx(\n              () => Text(controller.detail.value?.title ?? \"直播间\"),\n            ),\n            actions: buildAppbarActions(context),\n          ),\n          body: orientation == Orientation.portrait\n              ? buildPhoneUI(context)\n              : buildTabletUI(context),\n        );\n      },\n    );\n  }\n\n  Widget buildPhoneUI(BuildContext context) {\n    return Column(\n      children: [\n        AspectRatio(\n          aspectRatio: 16 / 9,\n          child: buildMediaPlayer(),\n        ),\n        buildUserProfile(context),\n        buildMessageArea(),\n        buildBottomActions(context),\n      ],\n    );\n  }\n\n  Widget buildTabletUI(BuildContext context) {\n    return Column(\n      children: [\n        Expanded(\n          child: Row(\n            children: [\n              Expanded(\n                child: buildMediaPlayer(),\n              ),\n              SizedBox(\n                width: 300,\n                child: Column(\n                  children: [\n                    buildUserProfile(context),\n                    buildMessageArea(),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n        Container(\n          decoration: BoxDecoration(\n            color: Theme.of(context).cardColor,\n            border: Border(\n              top: BorderSide(\n                color: Colors.grey.withAlpha(25),\n              ),\n            ),\n          ),\n          padding: AppStyle.edgeInsetsV4.copyWith(\n            bottom: AppStyle.bottomBarHeight + 4,\n          ),\n          child: Row(\n            children: [\n              TextButton.icon(\n                style: TextButton.styleFrom(\n                  textStyle: const TextStyle(fontSize: 14),\n                ),\n                onPressed: controller.refreshRoom,\n                icon: const Icon(Remix.refresh_line),\n                label: const Text(\"刷新\"),\n              ),\n              AppStyle.hGap4,\n              Obx(\n                () => controller.followed.value\n                    ? TextButton.icon(\n                        style: TextButton.styleFrom(\n                          textStyle: const TextStyle(fontSize: 14),\n                        ),\n                        onPressed: controller.removeFollowUser,\n                        icon: const Icon(Remix.heart_fill),\n                        label: const Text(\"取消关注\"),\n                      )\n                    : TextButton.icon(\n                        style: TextButton.styleFrom(\n                          textStyle: const TextStyle(fontSize: 14),\n                        ),\n                        onPressed: controller.followUser,\n                        icon: const Icon(Remix.heart_line),\n                        label: const Text(\"关注\"),\n                      ),\n              ),\n              const Expanded(child: Center()),\n              TextButton.icon(\n                style: TextButton.styleFrom(\n                  textStyle: const TextStyle(fontSize: 14),\n                ),\n                onPressed: controller.share,\n                icon: const Icon(Remix.share_line),\n                label: const Text(\"分享\"),\n              ),\n              TextButton.icon(\n                style: TextButton.styleFrom(\n                  textStyle: const TextStyle(fontSize: 14),\n                ),\n                onPressed: controller.copyUrl,\n                icon: const Icon(Remix.file_copy_line),\n                label: const Text(\"复制链接\"),\n              ),\n              TextButton.icon(\n                style: TextButton.styleFrom(\n                  textStyle: const TextStyle(fontSize: 14),\n                ),\n                onPressed: controller.copyPlayUrl,\n                icon: const Icon(Remix.file_copy_line),\n                label: const Text(\"复制播放直链\"),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildMediaPlayer() {\n    var boxFit = BoxFit.contain;\n    double? aspectRatio;\n    if (AppSettingsController.instance.scaleMode.value == 0) {\n      boxFit = BoxFit.contain;\n    } else if (AppSettingsController.instance.scaleMode.value == 1) {\n      boxFit = BoxFit.fill;\n    } else if (AppSettingsController.instance.scaleMode.value == 2) {\n      boxFit = BoxFit.cover;\n    } else if (AppSettingsController.instance.scaleMode.value == 3) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 16 / 9;\n    } else if (AppSettingsController.instance.scaleMode.value == 4) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 4 / 3;\n    }\n    return Stack(\n      children: [\n        Video(\n          key: controller.globalPlayerKey,\n          controller: controller.videoController,\n          pauseUponEnteringBackgroundMode:\n              AppSettingsController.instance.playerAutoPause.value,\n          resumeUponEnteringForegroundMode:\n              AppSettingsController.instance.playerAutoPause.value,\n          controls: (state) {\n            return playerControls(state, controller);\n          },\n          aspectRatio: aspectRatio,\n          fit: boxFit,\n          // 自己实现\n          wakelock: false,\n        ),\n        Obx(\n          () => Visibility(\n            visible: !controller.liveStatus.value,\n            child: const Center(\n              child: Text(\n                \"未开播\",\n                style: TextStyle(fontSize: 16, color: Colors.white),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildUserProfile(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        color: Theme.of(context).cardColor,\n        border: Border(\n          top: BorderSide(\n            color: Colors.grey.withAlpha(25),\n          ),\n          bottom: BorderSide(\n            color: Colors.grey.withAlpha(25),\n          ),\n        ),\n      ),\n      padding: AppStyle.edgeInsetsA8.copyWith(\n        left: 12,\n        right: 12,\n      ),\n      child: Obx(\n        () => Row(\n          mainAxisAlignment: MainAxisAlignment.start,\n          children: [\n            Container(\n              decoration: BoxDecoration(\n                border: Border.all(color: Colors.grey.withAlpha(50)),\n                borderRadius: AppStyle.radius24,\n              ),\n              child: NetImage(\n                controller.detail.value?.userAvatar ?? \"\",\n                width: 48,\n                height: 48,\n                borderRadius: 24,\n              ),\n            ),\n            AppStyle.hGap12,\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Text(\n                    controller.detail.value?.userName ?? \"\",\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                  AppStyle.vGap4,\n                  Row(\n                    children: [\n                      Image.asset(\n                        controller.site.logo,\n                        width: 20,\n                      ),\n                      AppStyle.hGap4,\n                      Text(\n                        controller.site.name,\n                        style: const TextStyle(\n                          fontSize: 12,\n                          color: Colors.grey,\n                        ),\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n            AppStyle.hGap12,\n            Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                const Icon(\n                  Remix.fire_fill,\n                  size: 20,\n                  color: Colors.orange,\n                ),\n                AppStyle.hGap4,\n                Text(\n                  Utils.onlineToString(\n                    controller.detail.value?.online ?? 0,\n                  ),\n                  style: const TextStyle(fontSize: 14),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildBottomActions(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        color: Theme.of(context).cardColor,\n        border: Border(\n          top: BorderSide(\n            color: Colors.grey.withAlpha(25),\n          ),\n        ),\n      ),\n      padding: EdgeInsets.only(bottom: AppStyle.bottomBarHeight),\n      child: Row(\n        children: [\n          Expanded(\n            child: Obx(\n              () => controller.followed.value\n                  ? TextButton.icon(\n                      style: TextButton.styleFrom(\n                        textStyle: const TextStyle(fontSize: 14),\n                      ),\n                      onPressed: controller.removeFollowUser,\n                      icon: const Icon(Remix.heart_fill),\n                      label: const Text(\"取消关注\"),\n                    )\n                  : TextButton.icon(\n                      style: TextButton.styleFrom(\n                        textStyle: const TextStyle(fontSize: 14),\n                      ),\n                      onPressed: controller.followUser,\n                      icon: const Icon(Remix.heart_line),\n                      label: const Text(\"关注\"),\n                    ),\n            ),\n          ),\n          Expanded(\n            child: TextButton.icon(\n              style: TextButton.styleFrom(\n                textStyle: const TextStyle(fontSize: 14),\n              ),\n              onPressed: controller.refreshRoom,\n              icon: const Icon(Remix.refresh_line),\n              label: const Text(\"刷新\"),\n            ),\n          ),\n          Expanded(\n            child: TextButton.icon(\n              style: TextButton.styleFrom(\n                textStyle: const TextStyle(fontSize: 14),\n              ),\n              onPressed: controller.share,\n              icon: const Icon(Remix.share_line),\n              label: const Text(\"分享\"),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildMessageArea() {\n    return Expanded(\n      child: DefaultTabController(\n        length: controller.site.id == Constant.kBiliBili ? 4 : 3,\n        child: Column(\n          children: [\n            TabBar(\n              indicatorSize: TabBarIndicatorSize.tab,\n              labelPadding: EdgeInsets.zero,\n              indicatorWeight: 1.0,\n              tabs: [\n                const Tab(\n                  text: \"聊天\",\n                ),\n                if (controller.site.id == Constant.kBiliBili)\n                  Tab(\n                    child: Obx(\n                      () => Text(\n                        controller.superChats.isNotEmpty\n                            ? \"SC(${controller.superChats.length})\"\n                            : \"SC\",\n                      ),\n                    ),\n                  ),\n                const Tab(\n                  text: \"关注\",\n                ),\n                const Tab(\n                  text: \"设置\",\n                ),\n              ],\n            ),\n            Expanded(\n              child: TabBarView(\n                children: [\n                  Obx(\n                    () => Stack(\n                      children: [\n                        ListView.separated(\n                          controller: controller.scrollController,\n                          separatorBuilder: (_, i) => Obx(\n                            () => SizedBox(\n                              // *2与原来的EdgeInsets.symmetric(vertical: )做兼容\n                              height: AppSettingsController\n                                      .instance.chatTextGap.value *\n                                  2,\n                            ),\n                          ),\n                          padding: AppStyle.edgeInsetsA12,\n                          itemCount: controller.messages.length,\n                          itemBuilder: (_, i) {\n                            var item = controller.messages[i];\n                            return buildMessageItem(item);\n                          },\n                        ),\n                        Visibility(\n                          visible: controller.disableAutoScroll.value,\n                          child: Positioned(\n                            right: 12,\n                            bottom: 12,\n                            child: ElevatedButton.icon(\n                              onPressed: () {\n                                controller.disableAutoScroll.value = false;\n                                controller.chatScrollToBottom();\n                              },\n                              icon: const Icon(Icons.expand_more),\n                              label: const Text(\"最新\"),\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  if (controller.site.id == Constant.kBiliBili)\n                    buildSuperChats(),\n                  buildFollowList(),\n                  buildSettings(),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildMessageItem(LiveMessage message) {\n    if (message.userName == \"LiveSysMessage\") {\n      return Obx(\n        () => Text(\n          message.message,\n          style: TextStyle(\n            color: Colors.grey,\n            fontSize: AppSettingsController.instance.chatTextSize.value,\n          ),\n        ),\n      );\n    }\n\n    return Obx(\n      () => AppSettingsController.instance.chatBubbleStyle.value\n          ? Row(\n              mainAxisAlignment: MainAxisAlignment.start,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Flexible(\n                  child: Container(\n                    decoration: BoxDecoration(\n                      color: Colors.blueGrey.withAlpha(25),\n                      //borderRadius: AppStyle.radius8,\n                      borderRadius: const BorderRadius.only(\n                        topRight: Radius.circular(12),\n                        bottomLeft: Radius.circular(12),\n                        bottomRight: Radius.circular(12),\n                      ),\n                    ),\n                    padding:\n                        AppStyle.edgeInsetsA4.copyWith(left: 12, right: 12),\n                    child: Text.rich(\n                      TextSpan(\n                        text: \"${message.userName}：\",\n                        style: TextStyle(\n                          color: Colors.grey,\n                          fontSize:\n                              AppSettingsController.instance.chatTextSize.value,\n                        ),\n                        children: [\n                          TextSpan(\n                            text: message.message,\n                            style: TextStyle(\n                              color: Get.isDarkMode\n                                  ? Colors.white\n                                  : AppColors.black333,\n                            ),\n                          )\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            )\n          : Text.rich(\n              TextSpan(\n                text: \"${message.userName}：\",\n                style: TextStyle(\n                  color: Colors.grey,\n                  fontSize: AppSettingsController.instance.chatTextSize.value,\n                ),\n                children: [\n                  TextSpan(\n                    text: message.message,\n                    style: TextStyle(\n                      color: Get.isDarkMode ? Colors.white : AppColors.black333,\n                    ),\n                  )\n                ],\n              ),\n            ),\n    );\n  }\n\n  Widget buildSuperChats() {\n    return KeepAliveWrapper(\n      child: Obx(\n        () => ListView.separated(\n          padding: AppStyle.edgeInsetsA12,\n          itemCount: controller.superChats.length,\n          separatorBuilder: (_, i) => AppStyle.vGap12,\n          itemBuilder: (_, i) {\n            var item = controller.superChats[i];\n            return SuperChatCard(\n              item,\n              onExpire: () {\n                controller.removeSuperChats();\n              },\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  Widget buildSettings() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA12,\n      children: [\n        Obx(\n          () => Visibility(\n            visible: controller.autoExitEnable.value,\n            child: ListTile(\n              leading: const Icon(Icons.timer_outlined),\n              visualDensity: VisualDensity.compact,\n              title: Text(\"${parseDuration(controller.countdown.value)}后自动关闭\"),\n            ),\n          ),\n        ),\n        Padding(\n          padding: AppStyle.edgeInsetsA12,\n          child: Text(\n            \"聊天区\",\n            style: Get.textTheme.titleSmall,\n          ),\n        ),\n        SettingsCard(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Obx(\n                () => SettingsNumber(\n                  title: \"文字大小\",\n                  value:\n                      AppSettingsController.instance.chatTextSize.value.toInt(),\n                  min: 8,\n                  max: 36,\n                  onChanged: (e) {\n                    AppSettingsController.instance\n                        .setChatTextSize(e.toDouble());\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"上下间隔\",\n                  value:\n                      AppSettingsController.instance.chatTextGap.value.toInt(),\n                  min: 0,\n                  max: 12,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setChatTextGap(e.toDouble());\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsSwitch(\n                  title: \"气泡样式\",\n                  value: AppSettingsController.instance.chatBubbleStyle.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setChatBubbleStyle(e);\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsSwitch(\n                  title: \"播放器中显示SC\",\n                  value:\n                      AppSettingsController.instance.playershowSuperChat.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setPlayerShowSuperChat(e);\n                  },\n                ),\n              ),\n            ],\n          ),\n        ),\n        Padding(\n          padding: AppStyle.edgeInsetsA12,\n          child: Text(\n            \"更多设置\",\n            style: Get.textTheme.titleSmall,\n          ),\n        ),\n        SettingsCard(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SettingsAction(\n                title: \"关键词屏蔽\",\n                onTap: controller.showDanmuShield,\n              ),\n              AppStyle.divider,\n              SettingsAction(\n                title: \"弹幕设置\",\n                onTap: controller.showDanmuSettingsSheet,\n              ),\n              AppStyle.divider,\n              SettingsAction(\n                title: \"定时关闭\",\n                onTap: controller.showAutoExitSheet,\n              ),\n              AppStyle.divider,\n              SettingsAction(\n                title: \"画面尺寸\",\n                onTap: controller.showPlayerSettingsSheet,\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildFollowList() {\n    return Obx(\n      () => Stack(\n        children: [\n          RefreshIndicator(\n            onRefresh: FollowService.instance.loadData,\n            child: ListView.builder(\n              itemCount: FollowService.instance.liveList.length,\n              itemBuilder: (_, i) {\n                var item = FollowService.instance.liveList[i];\n                return Obx(\n                  () => FollowUserItem(\n                    item: item,\n                    playing: controller.rxSite.value.id == item.siteId &&\n                        controller.rxRoomId.value == item.roomId,\n                    onTap: () {\n                      controller.resetRoom(\n                        Sites.allSites[item.siteId]!,\n                        item.roomId,\n                      );\n                    },\n                  ),\n                );\n              },\n            ),\n          ),\n          if (Platform.isLinux || Platform.isWindows || Platform.isMacOS)\n            Positioned(\n              right: 12,\n              bottom: 12,\n              child: Obx(\n                () => DesktopRefreshButton(\n                  refreshing: FollowService.instance.updating.value,\n                  onPressed: FollowService.instance.loadData,\n                ),\n              ),\n            ),\n        ],\n      ),\n    );\n  }\n\n  List<Widget> buildAppbarActions(BuildContext context) {\n    return [\n      IconButton(\n        onPressed: () {\n          showMore();\n        },\n        icon: const Icon(Icons.more_horiz),\n      ),\n    ];\n  }\n\n  void showMore() {\n    showModalBottomSheet(\n      context: Get.context!,\n      constraints: const BoxConstraints(\n        maxWidth: 600,\n      ),\n      isScrollControlled: true,\n      builder: (_) => Container(\n        padding: EdgeInsets.only(\n          bottom: AppStyle.bottomBarHeight,\n        ),\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              leading: const Icon(Icons.refresh),\n              title: const Text(\"刷新\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                controller.refreshRoom();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.play_circle_outline),\n              trailing: const Icon(Icons.chevron_right),\n              title: const Text(\"切换清晰度\"),\n              onTap: () {\n                Get.back();\n                controller.showQualitySheet();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.switch_video_outlined),\n              title: const Text(\"切换线路\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.showPlayUrlsSheet();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.aspect_ratio_outlined),\n              title: const Text(\"画面尺寸\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.showPlayerSettingsSheet();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.camera_alt_outlined),\n              title: const Text(\"截图\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                controller.saveScreenshot();\n              },\n            ),\n            Visibility(\n              visible: Platform.isAndroid,\n              child: ListTile(\n                leading: const Icon(Icons.picture_in_picture),\n                title: const Text(\"小窗播放\"),\n                trailing: const Icon(Icons.chevron_right),\n                onTap: () {\n                  Get.back();\n                  controller.enablePIP();\n                },\n              ),\n            ),\n            ListTile(\n              leading: const Icon(Icons.timer_outlined),\n              title: const Text(\"定时关闭\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.showAutoExitSheet();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.share_sharp),\n              title: const Text(\"分享直播间\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.share();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.copy),\n              title: const Text(\"复制链接\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.copyUrl();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.open_in_new),\n              title: const Text(\"APP中打开\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.openNaviteAPP();\n              },\n            ),\n            ListTile(\n              leading: const Icon(Icons.info_outline_rounded),\n              title: const Text(\"播放信息\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                controller.showDebugInfo();\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  String parseDuration(int sec) {\n    // 转为时分秒\n    var h = sec ~/ 3600;\n    var m = (sec % 3600) ~/ 60;\n    var s = sec % 60;\n    if (h > 0) {\n      return \"${h.toString().padLeft(2, '0')}小时${m.toString().padLeft(2, '0')}分钟${s.toString().padLeft(2, '0')}秒\";\n    }\n    if (m > 0) {\n      return \"${m.toString().padLeft(2, '0')}分钟${s.toString().padLeft(2, '0')}秒\";\n    }\n    return \"${s.toString().padLeft(2, '0')}秒\";\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/player/player_controller.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'package:auto_orientation_v2/auto_orientation_v2.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_gallery_saver_plus/image_gallery_saver_plus.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:volume_controller/volume_controller.dart';\nimport 'package:screen_brightness/screen_brightness.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/custom_throttle.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:wakelock_plus/wakelock_plus.dart';\nimport 'package:window_manager/window_manager.dart';\n\nmixin PlayerMixin {\n  GlobalKey<VideoState> globalPlayerKey = GlobalKey<VideoState>();\n  GlobalKey globalDanmuKey = GlobalKey();\n\n  /// 播放器实例\n  late final player = Player(\n    configuration: PlayerConfiguration(\n      title: \"Simple Live Player\",\n      logLevel: AppSettingsController.instance.logEnable.value\n          ? MPVLogLevel.info\n          : MPVLogLevel.error,\n    ),\n  );\n\n  /// 初始化播放器并设置 ao 参数\n  Future<void> initializePlayer() async {\n    var pp = player.platform as NativePlayer;\n    // 设置音频输出驱动\n    if (AppSettingsController.instance.customPlayerOutput.value) {\n      if (player.platform is NativePlayer) {\n        await (player.platform as dynamic).setProperty(\n          'ao',\n          AppSettingsController.instance.audioOutputDriver.value,\n        );\n      }\n    }\n    // media_kit 仓库更新导致的问题，临时解决办法\n    if(Platform.isAndroid){\n      await pp.setProperty('force-seekable', 'yes');\n    }\n  }\n\n  /// 视频控制器\n  late final videoController = VideoController(\n    player,\n    configuration: AppSettingsController.instance.customPlayerOutput.value\n        ? VideoControllerConfiguration(\n            vo: AppSettingsController.instance.videoOutputDriver.value,\n            hwdec: AppSettingsController.instance.videoHardwareDecoder.value,\n          )\n        : AppSettingsController.instance.playerCompatMode.value\n            ? const VideoControllerConfiguration(\n                vo: 'mediacodec_embed',\n                hwdec: 'mediacodec',\n              )\n            : VideoControllerConfiguration(\n                enableHardwareAcceleration:\n                    AppSettingsController.instance.hardwareDecode.value,\n                androidAttachSurfaceAfterVideoParameters: false,\n              ),\n  );\n}\n\nmixin PlayerStateMixin on PlayerMixin {\n  ///音量控制条计时器\n  Timer? hidevolumeTimer;\n\n  /// 是否进入桌面端小窗\n  RxBool smallWindowState = false.obs;\n\n  /// 是否显示弹幕\n  RxBool showDanmakuState = false.obs;\n\n  /// 是否显示控制器\n  RxBool showControlsState = false.obs;\n\n  /// 是否显示设置窗口\n  RxBool showSettingState = false.obs;\n\n  /// 是否显示弹幕设置窗口\n  RxBool showDanmakuSettingState = false.obs;\n\n  /// 是否处于锁定控制器状态\n  RxBool lockControlsState = false.obs;\n\n  /// 是否处于全屏状态\n  RxBool fullScreenState = false.obs;\n\n  /// 显示手势Tip\n  RxBool showGestureTip = false.obs;\n\n  /// 手势Tip文本\n  RxString gestureTipText = \"\".obs;\n\n  /// 显示提示底部Tip\n  RxBool showBottomTip = false.obs;\n\n  /// 提示底部Tip文本\n  RxString bottomTipText = \"\".obs;\n\n  /// 自动隐藏控制器计时器\n  Timer? hideControlsTimer;\n\n  /// 自动隐藏提示计时器\n  Timer? hideSeekTipTimer;\n\n  /// 是否为竖屏直播间\n  var isVertical = false.obs;\n\n  Widget? danmakuView;\n\n  var showQualites = false.obs;\n  var showLines = false.obs;\n\n  /// 隐藏控制器\n  void hideControls() {\n    showControlsState.value = false;\n    hideControlsTimer?.cancel();\n  }\n\n  void setLockState() {\n    lockControlsState.value = !lockControlsState.value;\n    if (lockControlsState.value) {\n      showControlsState.value = false;\n    } else {\n      showControlsState.value = true;\n    }\n  }\n\n  /// 显示控制器\n  void showControls() {\n    showControlsState.value = true;\n    resetHideControlsTimer();\n  }\n\n  /// 开始隐藏控制器计时\n  /// - 当点击控制器上时功能时需要重新计时\n  void resetHideControlsTimer() {\n    hideControlsTimer?.cancel();\n\n    hideControlsTimer = Timer(\n      const Duration(\n        seconds: 5,\n      ),\n      hideControls,\n    );\n  }\n\n  void updateScaleMode() {\n    var boxFit = BoxFit.contain;\n    double? aspectRatio;\n    if (player.state.width != null && player.state.height != null) {\n      aspectRatio = player.state.width! / player.state.height!;\n    }\n\n    if (AppSettingsController.instance.scaleMode.value == 0) {\n      boxFit = BoxFit.contain;\n    } else if (AppSettingsController.instance.scaleMode.value == 1) {\n      boxFit = BoxFit.fill;\n    } else if (AppSettingsController.instance.scaleMode.value == 2) {\n      boxFit = BoxFit.cover;\n    } else if (AppSettingsController.instance.scaleMode.value == 3) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 16 / 9;\n    } else if (AppSettingsController.instance.scaleMode.value == 4) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 4 / 3;\n    }\n    globalPlayerKey.currentState?.update(\n      aspectRatio: aspectRatio,\n      fit: boxFit,\n    );\n  }\n}\nmixin PlayerDanmakuMixin on PlayerStateMixin {\n  /// 弹幕控制器\n  DanmakuController? danmakuController;\n\n  void initDanmakuController(DanmakuController e) {\n    danmakuController = e;\n    // danmakuController?.updateOption(\n    //   DanmakuOption(\n    //     fontSize: AppSettingsController.instance.danmuSize.value,\n    //     area: AppSettingsController.instance.danmuArea.value,\n    //     duration: AppSettingsController.instance.danmuSpeed.value,\n    //     opacity: AppSettingsController.instance.danmuOpacity.value,\n    //     strokeWidth: AppSettingsController.instance.danmuStrokeWidth.value,\n    //     fontWeight: FontWeight\n    //         .values[AppSettingsController.instance.danmuFontWeight.value],\n    //   ),\n    // );\n  }\n\n  void updateDanmuOption(DanmakuOption? option) {\n    if (danmakuController == null || option == null) return;\n    danmakuController!.updateOption(option);\n  }\n\n  void disposeDanmakuController() {\n    danmakuController?.clear();\n  }\n\n  void addDanmaku(List<DanmakuContentItem> items) {\n    if (!showDanmakuState.value) {\n      return;\n    }\n    for (var item in items) {\n      danmakuController?.addDanmaku(item);\n    }\n  }\n}\nmixin PlayerSystemMixin on PlayerMixin, PlayerStateMixin, PlayerDanmakuMixin {\n  final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n\n  final pip = Floating();\n  StreamSubscription<PiPStatus>? _pipSubscription;\n\n  //final VolumeController volumeController = VolumeController();\n\n  /// 初始化一些系统状态\n  void initSystem() async {\n    if (Platform.isAndroid || Platform.isIOS) {\n      VolumeController.instance.showSystemUI = false;\n    }\n\n    // 屏幕常亮\n    //WakelockPlus.enable();\n\n    // 开始隐藏计时\n    resetHideControlsTimer();\n\n    // 进入全屏模式\n    if (AppSettingsController.instance.autoFullScreen.value) {\n      enterFullScreen();\n    }\n  }\n\n  /// 释放一些系统状态\n  Future resetSystem() async {\n    _pipSubscription?.cancel();\n    //pip.dispose();\n    await SystemChrome.setEnabledSystemUIMode(\n      SystemUiMode.edgeToEdge,\n      overlays: SystemUiOverlay.values,\n    );\n\n    await setPortraitOrientation();\n    if (Platform.isAndroid || Platform.isIOS || Platform.isMacOS) {\n      // 亮度重置,桌面平台可能会报错,暂时不处理桌面平台的亮度\n      try {\n        await ScreenBrightness.instance.resetApplicationScreenBrightness();\n      } catch (e) {\n        Log.logPrint(e);\n      }\n    }\n\n    await WakelockPlus.disable();\n  }\n\n  /// 进入全屏\n  void enterFullScreen() {\n    fullScreenState.value = true;\n    if (Platform.isAndroid || Platform.isIOS) {\n      //全屏\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);\n      if (!isVertical.value) {\n        //横屏\n        setLandscapeOrientation();\n      }\n    } else {\n      windowManager.setFullScreen(true);\n    }\n    //danmakuController?.clear();\n  }\n\n  /// 退出全屏\n  void exitFull() {\n    if (Platform.isAndroid || Platform.isIOS) {\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge,\n          overlays: SystemUiOverlay.values);\n      setPortraitOrientation();\n    } else {\n      windowManager.setFullScreen(false);\n    }\n    fullScreenState.value = false;\n\n    //danmakuController?.clear();\n  }\n\n  Size? _lastWindowSize;\n  Offset? _lastWindowPosition;\n\n  ///小窗模式()\n  void enterSmallWindow() async {\n    if (!(Platform.isAndroid || Platform.isIOS)) {\n      fullScreenState.value = true;\n      smallWindowState.value = true;\n\n      // 读取窗口大小\n      _lastWindowSize = await windowManager.getSize();\n      _lastWindowPosition = await windowManager.getPosition();\n\n      windowManager.setTitleBarStyle(TitleBarStyle.hidden);\n      // 获取视频窗口大小\n      var width = player.state.width ?? 16;\n      var height = player.state.height ?? 9;\n\n      // 横屏还是竖屏\n      if (height > width) {\n        var aspectRatio = width / height;\n        windowManager.setSize(Size(400, 400 / aspectRatio));\n      } else {\n        var aspectRatio = height / width;\n        windowManager.setSize(Size(280 / aspectRatio, 280));\n      }\n\n      windowManager.setAlwaysOnTop(true);\n    }\n  }\n\n  ///退出小窗模式()\n  void exitSmallWindow() {\n    if (!(Platform.isAndroid || Platform.isIOS)) {\n      fullScreenState.value = false;\n      smallWindowState.value = false;\n      windowManager.setTitleBarStyle(TitleBarStyle.normal);\n      windowManager.setSize(_lastWindowSize!);\n      windowManager.setPosition(_lastWindowPosition!);\n      windowManager.setAlwaysOnTop(false);\n      //windowManager.setAlignment(Alignment.center);\n    }\n  }\n\n  /// 设置横屏\n  Future setLandscapeOrientation() async {\n    if (await beforeIOS16()) {\n      AutoOrientation.landscapeAutoMode();\n    } else {\n      SystemChrome.setPreferredOrientations([\n        DeviceOrientation.landscapeLeft,\n        DeviceOrientation.landscapeRight,\n      ]);\n    }\n  }\n\n  /// 设置竖屏\n  Future setPortraitOrientation() async {\n    if (await beforeIOS16()) {\n      AutoOrientation.portraitAutoMode();\n    } else {\n      await SystemChrome.setPreferredOrientations(DeviceOrientation.values);\n    }\n  }\n\n  /// 是否是IOS16以下\n  Future<bool> beforeIOS16() async {\n    if (Platform.isIOS) {\n      var info = await deviceInfo.iosInfo;\n      var version = info.systemVersion;\n      var versionInt = int.tryParse(version.split('.').first) ?? 0;\n      return versionInt < 16;\n    } else {\n      return false;\n    }\n  }\n\n  Future saveScreenshot() async {\n    try {\n      SmartDialog.showLoading(msg: \"正在保存截图\");\n      //检查相册权限,仅iOS需要\n      var permission = await Utils.checkPhotoPermission();\n      if (!permission) {\n        SmartDialog.showToast(\"没有相册权限\");\n        SmartDialog.dismiss(status: SmartStatus.loading);\n        return;\n      }\n\n      var imageData = await player.screenshot();\n      if (imageData == null) {\n        SmartDialog.showToast(\"截图失败,数据为空\");\n        SmartDialog.dismiss(status: SmartStatus.loading);\n        return;\n      }\n\n      if (Platform.isIOS || Platform.isAndroid) {\n        await ImageGallerySaverPlus.saveImage(\n          imageData,\n        );\n        SmartDialog.showToast(\"已保存截图至相册\");\n      } else {\n        //选择保存文件夹\n        var path = await FilePicker.platform.saveFile(\n          allowedExtensions: [\"jpg\"],\n          type: FileType.image,\n          fileName: \"${DateTime.now().millisecondsSinceEpoch}.jpg\",\n        );\n        if (path == null) {\n          SmartDialog.showToast(\"取消保存\");\n          SmartDialog.dismiss(status: SmartStatus.loading);\n          return;\n        }\n        var file = File(path);\n        await file.writeAsBytes(imageData);\n        SmartDialog.showToast(\"已保存截图至${file.path}\");\n      }\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"截图失败\");\n    } finally {\n      SmartDialog.dismiss(status: SmartStatus.loading);\n    }\n  }\n\n  /// 开启小窗播放前弹幕状态\n  bool danmakuStateBeforePIP = false;\n\n  Future enablePIP() async {\n    if (!Platform.isAndroid) {\n      return;\n    }\n    if (await pip.isPipAvailable == false) {\n      SmartDialog.showToast(\"设备不支持小窗播放\");\n      return;\n    }\n    danmakuStateBeforePIP = showDanmakuState.value;\n    //关闭并清除弹幕\n    if (AppSettingsController.instance.pipHideDanmu.value &&\n        danmakuStateBeforePIP) {\n      showDanmakuState.value = false;\n    }\n    danmakuController?.clear();\n    //关闭控制器\n    showControlsState.value = false;\n\n    //监听事件\n    var width = player.state.width ?? 0;\n    var height = player.state.height ?? 0;\n    Rational ratio = const Rational.landscape();\n    if (height > width) {\n      ratio = const Rational.vertical();\n    } else {\n      ratio = const Rational.landscape();\n    }\n    await pip.enable(\n      ImmediatePiP(\n        aspectRatio: ratio,\n      ),\n    );\n\n    _pipSubscription ??= pip.pipStatusStream.listen((event) {\n      if (event == PiPStatus.disabled) {\n        danmakuController?.clear();\n        showDanmakuState.value = danmakuStateBeforePIP;\n      }\n      Log.w(event.toString());\n    });\n  }\n}\nmixin PlayerGestureControlMixin\n    on PlayerStateMixin, PlayerMixin, PlayerSystemMixin {\n  /// 单击显示/隐藏控制器\n  void onTap() {\n    if (showControlsState.value) {\n      hideControls();\n    } else {\n      showControls();\n    }\n  }\n\n  //桌面端操控\n  void onEnter(PointerEnterEvent event) {\n    if (!showControlsState.value) {\n      showControls();\n    }\n  }\n\n  void onExit(PointerExitEvent event) {\n    if (showControlsState.value) {\n      hideControls();\n    }\n  }\n\n  void onHover(PointerHoverEvent event, BuildContext context) {\n    final screenHeight = MediaQuery.of(context).size.height;\n    final targetPosition = screenHeight * 0.25; // 计算屏幕顶部25%的位置\n    if (event.position.dy <= targetPosition ||\n        event.position.dy >= targetPosition * 3) {\n      if (!showControlsState.value) {\n        showControls();\n      }\n    }\n  }\n\n  /// 双击全屏/退出全屏\n  void onDoubleTap(TapDownDetails details) {\n    if (lockControlsState.value) {\n      return;\n    }\n    if (fullScreenState.value) {\n      exitFull();\n    } else {\n      enterFullScreen();\n    }\n  }\n\n  bool verticalDragging = false;\n  bool leftVerticalDrag = false;\n  var _currentVolume = 0.0;\n  var _currentBrightness = 1.0;\n  var verStartPosition = 0.0;\n\n  DelayedThrottle? throttle;\n\n  /// 竖向手势开始\n  void onVerticalDragStart(DragStartDetails details) async {\n    if (lockControlsState.value && fullScreenState.value) {\n      return;\n    }\n\n    final dy = details.globalPosition.dy;\n    // 开始位置必须是中间2/4的位置\n    if (dy < Get.height * 0.25 || dy > Get.height * 0.75) {\n      return;\n    }\n\n    verStartPosition = dy;\n    leftVerticalDrag = details.globalPosition.dx < Get.width / 2;\n\n    throttle = DelayedThrottle(200);\n\n    verticalDragging = true;\n    if (Platform.isAndroid || Platform.isIOS || Platform.isMacOS) {\n      showGestureTip.value = true;\n    }\n    if (Platform.isAndroid || Platform.isIOS) {\n      _currentVolume = await VolumeController.instance.getVolume();\n    }\n    if (Platform.isAndroid || Platform.isIOS || Platform.isMacOS) {\n      _currentBrightness = await ScreenBrightness.instance.application;\n    }\n  }\n\n  /// 竖向手势更新\n  void onVerticalDragUpdate(DragUpdateDetails e) async {\n    if (lockControlsState.value && fullScreenState.value) {\n      return;\n    }\n    if (verticalDragging == false) return;\n    if (!Platform.isAndroid && !Platform.isIOS) {\n      return;\n    }\n    //String text = \"\";\n    //double value = 0.0;\n\n    Log.logPrint(\"$verStartPosition/${e.globalPosition.dy}\");\n\n    if (leftVerticalDrag) {\n      setGestureBrightness(e.globalPosition.dy);\n    } else {\n      setGestureVolume(e.globalPosition.dy);\n    }\n  }\n\n  int lastVolume = -1; // it's ok to be -1\n\n  void setGestureVolume(double dy) {\n    double value = 0.0;\n    double seek;\n    if (dy > verStartPosition) {\n      value = ((dy - verStartPosition) / (Get.height * 0.5));\n\n      seek = _currentVolume - value;\n      if (seek < 0) {\n        seek = 0;\n      }\n    } else {\n      value = ((dy - verStartPosition) / (Get.height * 0.5));\n      seek = value.abs() + _currentVolume;\n      if (seek > 1) {\n        seek = 1;\n      }\n    }\n    int volume = _convertVolume((seek * 100).round());\n    if (volume == lastVolume) {\n      return;\n    }\n    lastVolume = volume;\n    // update UI outside throttle to make it more fluent\n    gestureTipText.value = \"音量 $volume%\";\n    throttle?.invoke(() async => await _realSetVolume(volume));\n  }\n\n  // 0 to 100, 5 step each\n  int _convertVolume(int volume) {\n    return (volume / 5).round() * 5;\n  }\n\n  Future _realSetVolume(int volume) async {\n    Log.logPrint(volume);\n    VolumeController.instance.setVolume(volume / 100);\n  }\n\n  void setGestureBrightness(double dy) {\n    double value = 0.0;\n    if (dy > verStartPosition) {\n      value = ((dy - verStartPosition) / (Get.height * 0.5));\n\n      var seek = _currentBrightness - value;\n      if (seek < 0) {\n        seek = 0;\n      }\n      ScreenBrightness.instance.setApplicationScreenBrightness(seek);\n\n      gestureTipText.value = \"亮度 ${(seek * 100).toInt()}%\";\n      Log.logPrint(value);\n    } else {\n      value = ((dy - verStartPosition) / (Get.height * 0.5));\n      var seek = value.abs() + _currentBrightness;\n      if (seek > 1) {\n        seek = 1;\n      }\n\n      ScreenBrightness.instance.setApplicationScreenBrightness(seek);\n      gestureTipText.value = \"亮度 ${(seek * 100).toInt()}%\";\n      Log.logPrint(value);\n    }\n  }\n\n  /// 竖向手势完成\n  void onVerticalDragEnd(DragEndDetails details) async {\n    if (lockControlsState.value && fullScreenState.value) {\n      return;\n    }\n    throttle = null;\n    verticalDragging = false;\n    leftVerticalDrag = false;\n    showGestureTip.value = false;\n  }\n}\n\nclass PlayerController extends BaseController\n    with\n        PlayerMixin,\n        PlayerStateMixin,\n        PlayerDanmakuMixin,\n        PlayerSystemMixin,\n        PlayerGestureControlMixin {\n  @override\n  void onInit() {\n    initSystem();\n    initStream();\n    //设置音量\n    player.setVolume(AppSettingsController.instance.playerVolume.value);\n    super.onInit();\n  }\n\n  StreamSubscription<String>? _errorSubscription;\n  StreamSubscription? _completedSubscription;\n  StreamSubscription? _widthSubscription;\n  StreamSubscription? _heightSubscription;\n  StreamSubscription? _logSubscription;\n  StreamSubscription? _playingSubscription;\n\n  void initStream() {\n    _errorSubscription = player.stream.error.listen((event) {\n      Log.d(\"播放器错误：$event\");\n      // 跳过无音频输出的错误\n      // Could not open/initialize audio device -> no sound.\n      if (event.contains('no sound.')) {\n        return;\n      }\n      //SmartDialog.showToast(event);\n      mediaError(event);\n    });\n\n    _playingSubscription = player.stream.playing.listen((event) {\n      if (event) {\n        WakelockPlus.enable();\n        Log.d(\"Playing\");\n      }\n    });\n\n    _completedSubscription = player.stream.completed.listen((event) {\n      if (event) {\n        mediaEnd();\n      }\n    });\n    _logSubscription = player.stream.log.listen((event) {\n      Log.d(\"播放器日志：$event\");\n    });\n    _widthSubscription = player.stream.width.listen((event) {\n      Log.d(\n          'width:$event  W:${(player.state.width)}  H:${(player.state.height)}');\n      isVertical.value =\n          (player.state.height ?? 9) > (player.state.width ?? 16);\n    });\n    _heightSubscription = player.stream.height.listen((event) {\n      Log.d(\n          'height:$event  W:${(player.state.width)}  H:${(player.state.height)}');\n      isVertical.value =\n          (player.state.height ?? 9) > (player.state.width ?? 16);\n    });\n  }\n\n  void disposeStream() {\n    _errorSubscription?.cancel();\n    _completedSubscription?.cancel();\n    _widthSubscription?.cancel();\n    _heightSubscription?.cancel();\n    _logSubscription?.cancel();\n    _pipSubscription?.cancel();\n    _playingSubscription?.cancel();\n  }\n\n  void mediaEnd() {\n    WakelockPlus.disable();\n  }\n\n  void mediaError(String error) {\n    WakelockPlus.disable();\n  }\n\n  void showDebugInfo() {\n    Utils.showBottomSheet(\n      title: \"播放信息\",\n      child: ListView(\n        children: [\n          ListTile(\n            title: const Text(\"Resolution\"),\n            subtitle: Text('${player.state.width}x${player.state.height}'),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text:\n                      \"Resolution\\n${player.state.width}x${player.state.height}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"VideoParams\"),\n            subtitle: Text(player.state.videoParams.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"VideoParams\\n${player.state.videoParams}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"AudioParams\"),\n            subtitle: Text(player.state.audioParams.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"AudioParams\\n${player.state.audioParams}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"Media\"),\n            subtitle: Text(player.state.playlist.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"Media\\n${player.state.playlist}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"AudioTrack\"),\n            subtitle: Text(player.state.track.audio.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"AudioTrack\\n${player.state.track.audio}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"VideoTrack\"),\n            subtitle: Text(player.state.track.video.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"VideoTrack\\n${player.state.track.audio}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"AudioBitrate\"),\n            subtitle: Text(player.state.audioBitrate.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"AudioBitrate\\n${player.state.audioBitrate}\",\n                ),\n              );\n            },\n          ),\n          ListTile(\n            title: const Text(\"Volume\"),\n            subtitle: Text(player.state.volume.toString()),\n            onTap: () {\n              Clipboard.setData(\n                ClipboardData(\n                  text: \"Volume\\n${player.state.volume}\",\n                ),\n              );\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  void onClose() async {\n    Log.w(\"播放器关闭\");\n    if (smallWindowState.value) {\n      exitSmallWindow();\n    }\n    disposeStream();\n    disposeDanmakuController();\n    await resetSystem();\n    await player.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/live_room/player/player_controls.dart",
    "content": "import 'dart:io';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_app/modules/settings/danmu_settings_page.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/widgets/desktop_refresh_button.dart';\nimport 'package:simple_live_app/widgets/follow_user_item.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'package:simple_live_app/widgets/superchat_card.dart';\nimport 'dart:async';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nWidget playerControls(\n  VideoState videoState,\n  LiveRoomController controller,\n) {\n  return Obx(() {\n    if (controller.fullScreenState.value) {\n      return buildFullControls(\n        videoState,\n        controller,\n      );\n    }\n    return buildControls(\n      videoState.context.orientation == Orientation.portrait,\n      videoState,\n      controller,\n    );\n  });\n}\n\nWidget buildFullControls(\n  VideoState videoState,\n  LiveRoomController controller,\n) {\n  var padding = MediaQuery.of(videoState.context).padding;\n  GlobalKey volumeButtonkey = GlobalKey();\n  return DragToMoveArea(\n    child: Stack(\n      children: [\n        Container(),\n        buildDanmuView(videoState, controller),\n\n        // 左下角SC显示\n        Obx(\n          () => Visibility(\n            visible: AppSettingsController.instance.playershowSuperChat.value &&\n                ((!Platform.isAndroid && !Platform.isIOS) ||\n                    controller.fullScreenState.value),\n            child: Positioned(\n              left: 24,\n              bottom: 24,\n              child: PlayerSuperChatOverlay(controller: controller),\n            ),\n          ),\n        ),\n\n        Center(\n          child: // 中间\n              StreamBuilder(\n            stream: videoState.widget.controller.player.stream.buffering,\n            initialData: videoState.widget.controller.player.state.buffering,\n            builder: (_, s) => Visibility(\n              visible: s.data ?? false,\n              child: const Center(\n                child: CircularProgressIndicator(),\n              ),\n            ),\n          ),\n        ),\n        Positioned.fill(\n          child: GestureDetector(\n            onTap: controller.onTap,\n            onDoubleTapDown: controller.onDoubleTap,\n            onLongPress: () {\n              if (controller.lockControlsState.value) {\n                return;\n              }\n              showFollowUser(controller);\n            },\n            onVerticalDragStart: controller.onVerticalDragStart,\n            onVerticalDragUpdate: controller.onVerticalDragUpdate,\n            onVerticalDragEnd: controller.onVerticalDragEnd,\n            child: MouseRegion(\n              onHover: (PointerHoverEvent event) {\n                controller.onHover(event, videoState.context);\n              },\n              child: Container(\n                width: double.infinity,\n                height: double.infinity,\n                color: Colors.transparent,\n                // child: Visibility(\n                //   //拖拽区域\n                //   visible: controller.smallWindowState.value,\n                //   child: DragToMoveArea(\n                //       child: Container(\n                //     width: double.infinity,\n                //     height: double.infinity,\n                //     color: Colors.transparent,\n                //   )),\n                // ),\n              ),\n            ),\n          ),\n        ),\n\n        // 顶部\n        Obx(\n          () => AnimatedPositioned(\n            left: 0,\n            right: 0,\n            top: (controller.showControlsState.value &&\n                    !controller.lockControlsState.value)\n                ? 0\n                : -(48 + padding.top),\n            duration: const Duration(milliseconds: 200),\n            child: Container(\n              height: 48 + padding.top,\n              padding: EdgeInsets.only(\n                left: padding.left + 12,\n                right: padding.right + 12,\n                top: padding.top,\n              ),\n              decoration: const BoxDecoration(\n                gradient: LinearGradient(\n                  begin: Alignment.bottomCenter,\n                  end: Alignment.topCenter,\n                  colors: [\n                    Colors.transparent,\n                    Colors.black87,\n                  ],\n                ),\n              ),\n              child: Row(\n                children: [\n                  IconButton(\n                    onPressed: () {\n                      if (controller.smallWindowState.value) {\n                        controller.exitSmallWindow();\n                      } else {\n                        controller.exitFull();\n                      }\n                    },\n                    icon: const Icon(\n                      Icons.arrow_back,\n                      color: Colors.white,\n                      size: 24,\n                    ),\n                  ),\n                  AppStyle.hGap12,\n                  Expanded(\n                    child: Text(\n                      \"${controller.detail.value?.title} - ${controller.detail.value?.userName}\",\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                      style: const TextStyle(color: Colors.white, fontSize: 16),\n                    ),\n                  ),\n                  AppStyle.hGap12,\n                  IconButton(\n                    onPressed: () {\n                      controller.saveScreenshot();\n                    },\n                    icon: const Icon(\n                      Icons.camera_alt_outlined,\n                      color: Colors.white,\n                      size: 24,\n                    ),\n                  ),\n                  IconButton(\n                    onPressed: () {\n                      showFollowUser(controller);\n                    },\n                    icon: const Icon(\n                      Remix.play_list_2_line,\n                      color: Colors.white,\n                      size: 24,\n                    ),\n                  ),\n                  Visibility(\n                    visible: Platform.isAndroid,\n                    child: IconButton(\n                      onPressed: () {\n                        controller.enablePIP();\n                      },\n                      icon: const Icon(\n                        Icons.picture_in_picture,\n                        color: Colors.white,\n                        size: 24,\n                      ),\n                    ),\n                  ),\n                  IconButton(\n                    onPressed: () {\n                      showPlayerSettings(controller);\n                    },\n                    icon: const Icon(\n                      Icons.more_horiz,\n                      color: Colors.white,\n                      size: 24,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n        // 底部\n        Obx(\n          () => AnimatedPositioned(\n            left: 0,\n            right: 0,\n            bottom: (controller.showControlsState.value &&\n                    !controller.lockControlsState.value)\n                ? 0\n                : -(80 + padding.bottom),\n            duration: const Duration(milliseconds: 200),\n            child: Container(\n              decoration: const BoxDecoration(\n                gradient: LinearGradient(\n                  begin: Alignment.topCenter,\n                  end: Alignment.bottomCenter,\n                  colors: [\n                    Colors.transparent,\n                    Colors.black87,\n                  ],\n                ),\n              ),\n              padding: EdgeInsets.only(\n                left: padding.left + 12,\n                right: padding.right + 12,\n                bottom: padding.bottom,\n              ),\n              child: Row(\n                children: [\n                  IconButton(\n                    onPressed: () {\n                      controller.refreshRoom();\n                    },\n                    icon: const Icon(\n                      Remix.refresh_line,\n                      color: Colors.white,\n                    ),\n                  ),\n                  Offstage(\n                    offstage: controller.showDanmakuState.value,\n                    child: IconButton(\n                      onPressed: () => controller.showDanmakuState.value =\n                          !controller.showDanmakuState.value,\n                      icon: const ImageIcon(\n                        AssetImage('assets/icons/icon_danmaku_open.png'),\n                        size: 24,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                  Offstage(\n                    offstage: !controller.showDanmakuState.value,\n                    child: IconButton(\n                      onPressed: () => controller.showDanmakuState.value =\n                          !controller.showDanmakuState.value,\n                      icon: const ImageIcon(\n                        AssetImage('assets/icons/icon_danmaku_close.png'),\n                        size: 24,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                  IconButton(\n                    onPressed: () {\n                      showDanmakuSettings(controller);\n                    },\n                    icon: const ImageIcon(\n                      AssetImage('assets/icons/icon_danmaku_setting.png'),\n                      size: 24,\n                      color: Colors.white,\n                    ),\n                  ),\n                  Obx(\n                    () => Padding(\n                      padding: const EdgeInsets.only(left: 8.0),\n                      child: Text(\n                        controller.liveDuration.value,\n                        style:\n                            const TextStyle(fontSize: 14, color: Colors.white),\n                      ),\n                    ),\n                  ),\n                  const Expanded(child: Center()),\n                  Visibility(\n                    visible: !Platform.isAndroid && !Platform.isIOS,\n                    child: IconButton(\n                      key: volumeButtonkey,\n                      onPressed: () {\n                        controller\n                            .showVolumeSlider(volumeButtonkey.currentContext!);\n                      },\n                      icon: const Icon(\n                        Icons.volume_down,\n                        size: 24,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                  TextButton(\n                    onPressed: () {\n                      showQualitesInfo(controller);\n                    },\n                    child: Obx(\n                      () => Text(\n                        controller.currentQualityInfo.value,\n                        style:\n                            const TextStyle(color: Colors.white, fontSize: 15),\n                      ),\n                    ),\n                  ),\n                  TextButton(\n                    onPressed: () {\n                      showLinesInfo(controller);\n                    },\n                    child: Text(\n                      controller.currentLineInfo.value,\n                      style: const TextStyle(color: Colors.white, fontSize: 15),\n                    ),\n                  ),\n                  IconButton(\n                    onPressed: () {\n                      if (controller.smallWindowState.value) {\n                        controller.exitSmallWindow();\n                      } else {\n                        controller.exitFull();\n                      }\n                    },\n                    icon: const Icon(\n                      Remix.fullscreen_exit_fill,\n                      color: Colors.white,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n\n        // 右侧锁定\n        Obx(\n          () => AnimatedPositioned(\n            top: 0,\n            bottom: 0,\n            right: controller.showControlsState.value\n                ? padding.right + 12\n                : -(64 + padding.right),\n            duration: const Duration(milliseconds: 200),\n            child: buildLockButton(controller),\n          ),\n        ),\n        // 左侧锁定\n        Obx(\n          () => AnimatedPositioned(\n            top: 0,\n            bottom: 0,\n            left: controller.showControlsState.value\n                ? padding.left + 12\n                : -(64 + padding.right),\n            duration: const Duration(milliseconds: 200),\n            child: buildLockButton(controller),\n          ),\n        ),\n        Obx(\n          () => Offstage(\n            offstage: !controller.showGestureTip.value,\n            child: Center(\n              child: Container(\n                padding: const EdgeInsets.all(12),\n                decoration: BoxDecoration(\n                  color: Colors.grey.shade900,\n                  borderRadius: BorderRadius.circular(12),\n                ),\n                child: Text(\n                  controller.gestureTipText.value,\n                  style: const TextStyle(fontSize: 18, color: Colors.white),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    ),\n  );\n}\n\nWidget buildLockButton(LiveRoomController controller) {\n  return Center(\n    child: InkWell(\n      onTap: () {\n        controller.setLockState();\n      },\n      child: Container(\n        decoration: BoxDecoration(\n          color: Colors.black45,\n          borderRadius: AppStyle.radius8,\n        ),\n        width: 40,\n        height: 40,\n        child: Center(\n          child: Icon(\n            controller.lockControlsState.value\n                ? Icons.lock_outline_rounded\n                : Icons.lock_open_outlined,\n            color: Colors.white,\n            size: 20,\n          ),\n        ),\n      ),\n    ),\n  );\n}\n\nWidget buildControls(\n  bool isPortrait,\n  VideoState videoState,\n  LiveRoomController controller,\n) {\n  GlobalKey volumeButtonkey = GlobalKey();\n  return Stack(\n    children: [\n      Container(),\n      buildDanmuView(videoState, controller),\n\n      // 左下角SC显示\n      Obx(\n        () => Visibility(\n          visible: AppSettingsController.instance.playershowSuperChat.value &&\n              ((!Platform.isAndroid && !Platform.isIOS) ||\n                  controller.fullScreenState.value),\n          child: Positioned(\n            left: 24,\n            bottom: 24,\n            child: PlayerSuperChatOverlay(controller: controller),\n          ),\n        ),\n      ),\n\n      // 中间\n      Center(\n        child: StreamBuilder(\n          stream: videoState.widget.controller.player.stream.buffering,\n          initialData: videoState.widget.controller.player.state.buffering,\n          builder: (_, s) => Visibility(\n            visible: s.data ?? false,\n            child: const Center(\n              child: CircularProgressIndicator(),\n            ),\n          ),\n        ),\n      ),\n      Positioned.fill(\n        child: GestureDetector(\n          onTap: controller.onTap,\n          onDoubleTapDown: controller.onDoubleTap,\n          onVerticalDragStart: controller.onVerticalDragStart,\n          onVerticalDragUpdate: controller.onVerticalDragUpdate,\n          onVerticalDragEnd: controller.onVerticalDragEnd,\n          //onLongPress: controller.showDebugInfo,\n          child: MouseRegion(\n            onEnter: controller.onEnter,\n            child: Container(\n              width: double.infinity,\n              height: double.infinity,\n              color: Colors.transparent,\n            ),\n          ),\n        ),\n      ),\n      Obx(\n        () => AnimatedPositioned(\n          left: 0,\n          right: 0,\n          bottom: controller.showControlsState.value ? 0 : -48,\n          duration: const Duration(milliseconds: 200),\n          child: Container(\n            decoration: const BoxDecoration(\n              gradient: LinearGradient(\n                begin: Alignment.topCenter,\n                end: Alignment.bottomCenter,\n                colors: [\n                  Colors.transparent,\n                  Colors.black87,\n                ],\n              ),\n            ),\n            child: Row(\n              children: [\n                IconButton(\n                  onPressed: () {\n                    controller.refreshRoom();\n                  },\n                  icon: const Icon(\n                    Remix.refresh_line,\n                    color: Colors.white,\n                  ),\n                ),\n                Offstage(\n                  offstage: controller.showDanmakuState.value,\n                  child: IconButton(\n                    onPressed: () => controller.showDanmakuState.value =\n                        !controller.showDanmakuState.value,\n                    icon: const ImageIcon(\n                      AssetImage('assets/icons/icon_danmaku_open.png'),\n                      size: 24,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n                Offstage(\n                  offstage: !controller.showDanmakuState.value,\n                  child: IconButton(\n                    onPressed: () => controller.showDanmakuState.value =\n                        !controller.showDanmakuState.value,\n                    icon: const ImageIcon(\n                      AssetImage('assets/icons/icon_danmaku_close.png'),\n                      size: 24,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n                IconButton(\n                  onPressed: () {\n                    controller.showDanmuSettingsSheet();\n                  },\n                  icon: const ImageIcon(\n                    AssetImage('assets/icons/icon_danmaku_setting.png'),\n                    size: 24,\n                    color: Colors.white,\n                  ),\n                ),\n                Obx(\n                  () => Padding(\n                    padding: const EdgeInsets.only(left: 8.0),\n                    child: Text(\n                      controller.liveDuration.value,\n                      style: const TextStyle(fontSize: 14, color: Colors.white),\n                    ),\n                  ),\n                ),\n                const Expanded(child: Center()),\n                Visibility(\n                  visible: !Platform.isAndroid && !Platform.isIOS,\n                  child: IconButton(\n                    key: volumeButtonkey,\n                    onPressed: () {\n                      controller.showVolumeSlider(\n                        volumeButtonkey.currentContext!,\n                      );\n                    },\n                    icon: const Icon(\n                      Icons.volume_down,\n                      size: 24,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n                Offstage(\n                  offstage: isPortrait,\n                  child: TextButton(\n                    onPressed: () {\n                      controller.showQualitySheet();\n                    },\n                    child: Obx(\n                      () => Text(\n                        controller.currentQualityInfo.value,\n                        style:\n                            const TextStyle(color: Colors.white, fontSize: 15),\n                      ),\n                    ),\n                  ),\n                ),\n                Offstage(\n                  offstage: isPortrait,\n                  child: TextButton(\n                    onPressed: () {\n                      controller.showPlayUrlsSheet();\n                    },\n                    child: Text(\n                      controller.currentLineInfo.value,\n                      style: const TextStyle(color: Colors.white, fontSize: 15),\n                    ),\n                  ),\n                ),\n                Visibility(\n                  visible: !Platform.isAndroid && !Platform.isIOS,\n                  child: IconButton(\n                    onPressed: () {\n                      controller.enterSmallWindow();\n                    },\n                    icon: const Icon(\n                      Icons.picture_in_picture,\n                      color: Colors.white,\n                      size: 24,\n                    ),\n                  ),\n                ),\n                IconButton(\n                  onPressed: () {\n                    controller.enterFullScreen();\n                  },\n                  icon: const Icon(\n                    Remix.fullscreen_line,\n                    color: Colors.white,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n      Obx(\n        () => Offstage(\n          offstage: !controller.showGestureTip.value,\n          child: Center(\n            child: Container(\n              padding: const EdgeInsets.all(12),\n              decoration: BoxDecoration(\n                color: Colors.grey.shade900,\n                borderRadius: BorderRadius.circular(12),\n              ),\n              child: Text(\n                controller.gestureTipText.value,\n                style: const TextStyle(fontSize: 18, color: Colors.white),\n              ),\n            ),\n          ),\n        ),\n      ),\n    ],\n  );\n}\n\nWidget buildDanmuView(VideoState videoState, LiveRoomController controller) {\n  var padding = MediaQuery.of(videoState.context).padding;\n  controller.danmakuView ??= DanmakuScreen(\n    key: controller.globalDanmuKey,\n    createdController: controller.initDanmakuController,\n    option: DanmakuOption(\n      fontSize: AppSettingsController.instance.danmuSize.value,\n      area: AppSettingsController.instance.danmuArea.value,\n      duration: AppSettingsController.instance.danmuSpeed.value.toInt(),\n      opacity: AppSettingsController.instance.danmuOpacity.value,\n      //strokeWidth: AppSettingsController.instance.danmuStrokeWidth.value,\n      fontWeight: AppSettingsController.instance.danmuFontWeight.value,\n    ),\n  );\n  return Positioned.fill(\n    top: padding.top,\n    bottom: padding.bottom,\n    child: Obx(\n      () => Offstage(\n        offstage: !controller.showDanmakuState.value,\n        child: Padding(\n          padding: controller.fullScreenState.value\n              ? EdgeInsets.only(\n                  top: AppSettingsController.instance.danmuTopMargin.value,\n                  bottom:\n                      AppSettingsController.instance.danmuBottomMargin.value,\n                )\n              : EdgeInsets.zero,\n          child: controller.danmakuView!,\n        ),\n      ),\n    ),\n  );\n}\n\nvoid showLinesInfo(LiveRoomController controller) {\n  if (controller.isVertical.value) {\n    controller.showPlayUrlsSheet();\n    return;\n  }\n  Utils.showRightDialog(\n    title: \"线路\",\n    useSystem: true,\n    child: ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: controller.playUrls.length,\n      itemBuilder: (_, i) {\n        return ListTile(\n          selected: controller.currentLineIndex == i,\n          title: Text.rich(\n            TextSpan(\n              text: \"线路${i + 1}\",\n              children: [\n                WidgetSpan(\n                    child: Container(\n                  decoration: BoxDecoration(\n                    borderRadius: AppStyle.radius4,\n                    border: Border.all(\n                      color: Colors.grey,\n                    ),\n                  ),\n                  padding: AppStyle.edgeInsetsH4,\n                  margin: AppStyle.edgeInsetsL8,\n                  child: Text(\n                    controller.playUrls[i].contains(\".flv\") ? \"FLV\" : \"HLS\",\n                    style: const TextStyle(\n                      fontSize: 12,\n                    ),\n                  ),\n                )),\n              ],\n            ),\n            style: const TextStyle(fontSize: 14),\n          ),\n          minLeadingWidth: 16,\n          onTap: () {\n            Utils.hideRightDialog();\n            //controller.currentLineIndex = i;\n            //controller.setPlayer();\n            controller.changePlayLine(i);\n          },\n        );\n      },\n    ),\n  );\n}\n\nvoid showQualitesInfo(LiveRoomController controller) {\n  if (controller.isVertical.value) {\n    controller.showQualitySheet();\n    return;\n  }\n  Utils.showRightDialog(\n    title: \"清晰度\",\n    useSystem: true,\n    child: ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: controller.qualites.length,\n      itemBuilder: (_, i) {\n        var item = controller.qualites[i];\n        return ListTile(\n          selected: controller.currentQuality == i,\n          title: Text(\n            item.quality,\n            style: const TextStyle(fontSize: 14),\n          ),\n          minLeadingWidth: 16,\n          onTap: () {\n            Utils.hideRightDialog();\n            controller.currentQuality = i;\n            controller.getPlayUrl();\n          },\n        );\n      },\n    ),\n  );\n}\n\nvoid showDanmakuSettings(LiveRoomController controller) {\n  if (controller.isVertical.value) {\n    controller.showDanmuSettingsSheet();\n    return;\n  }\n  Utils.showRightDialog(\n    title: \"弹幕设置\",\n    width: 400,\n    useSystem: true,\n    child: ListView(\n      padding: AppStyle.edgeInsetsA12,\n      children: [\n        DanmuSettingsView(\n          danmakuController: controller.danmakuController,\n        ),\n      ],\n    ),\n  );\n}\n\nvoid showPlayerSettings(LiveRoomController controller) {\n  if (controller.isVertical.value) {\n    controller.showPlayerSettingsSheet();\n    return;\n  }\n  Utils.showRightDialog(\n    title: \"设置\",\n    width: 320,\n    useSystem: true,\n    child: Obx(\n      () => RadioGroup(\n        groupValue: AppSettingsController.instance.scaleMode.value,\n        onChanged: (e) {\n          AppSettingsController.instance.setScaleMode(e ?? 0);\n          controller.updateScaleMode();\n        },\n        child: ListView(\n          padding: AppStyle.edgeInsetsV12,\n          children: [\n            Padding(\n              padding: AppStyle.edgeInsetsH16,\n              child: Text(\n                \"画面尺寸\",\n                style: Get.textTheme.titleMedium,\n              ),\n            ),\n            const RadioListTile(\n              value: 0,\n              contentPadding: AppStyle.edgeInsetsH4,\n              title: Text(\"适应\"),\n              visualDensity: VisualDensity.compact,\n            ),\n            const RadioListTile(\n              value: 1,\n              contentPadding: AppStyle.edgeInsetsH4,\n              title: Text(\"拉伸\"),\n              visualDensity: VisualDensity.compact,\n            ),\n            const RadioListTile(\n              value: 2,\n              contentPadding: AppStyle.edgeInsetsH4,\n              title: Text(\"铺满\"),\n              visualDensity: VisualDensity.compact,\n            ),\n            const RadioListTile(\n              value: 3,\n              contentPadding: AppStyle.edgeInsetsH4,\n              title: Text(\"16:9\"),\n              visualDensity: VisualDensity.compact,\n            ),\n            const RadioListTile(\n              value: 4,\n              contentPadding: AppStyle.edgeInsetsH4,\n              title: Text(\"4:3\"),\n              visualDensity: VisualDensity.compact,\n            ),\n          ],\n        ),\n      ),\n    ),\n  );\n}\n\nvoid showFollowUser(LiveRoomController controller) {\n  if (controller.isVertical.value) {\n    controller.showFollowUserSheet();\n    return;\n  }\n\n  Utils.showRightDialog(\n    title: \"关注列表\",\n    width: 400,\n    useSystem: true,\n    child: Obx(\n      () => Stack(\n        children: [\n          RefreshIndicator(\n            onRefresh: FollowService.instance.loadData,\n            child: ListView.builder(\n              itemCount: FollowService.instance.liveList.length,\n              itemBuilder: (_, i) {\n                var item = FollowService.instance.liveList[i];\n                return Obx(\n                  () => FollowUserItem(\n                    item: item,\n                    playing: controller.rxSite.value.id == item.siteId &&\n                        controller.rxRoomId.value == item.roomId,\n                    onTap: () {\n                      Utils.hideRightDialog();\n                      controller.resetRoom(\n                        Sites.allSites[item.siteId]!,\n                        item.roomId,\n                      );\n                    },\n                  ),\n                );\n              },\n            ),\n          ),\n          if (Platform.isLinux || Platform.isWindows || Platform.isMacOS)\n            Positioned(\n              right: 12,\n              bottom: 12,\n              child: Obx(\n                () => DesktopRefreshButton(\n                  refreshing: FollowService.instance.updating.value,\n                  onPressed: FollowService.instance.loadData,\n                ),\n              ),\n            ),\n        ],\n      ),\n    ),\n  );\n}\n\nclass PlayerSuperChatCard extends StatefulWidget {\n  final LiveSuperChatMessage message;\n  final VoidCallback onExpire;\n  final int duration;\n  const PlayerSuperChatCard(\n      {required this.message,\n      required this.onExpire,\n      required this.duration,\n      Key? key})\n      : super(key: key);\n  @override\n  State<PlayerSuperChatCard> createState() => _PlayerSuperChatCardState();\n}\n\nclass _PlayerSuperChatCardState extends State<PlayerSuperChatCard> {\n  late Timer timer;\n  late int countdown;\n  @override\n  void initState() {\n    super.initState();\n    countdown = widget.duration;\n    timer = Timer.periodic(const Duration(seconds: 1), (t) {\n      if (countdown <= 1) {\n        widget.onExpire();\n        timer.cancel();\n        return;\n      }\n      setState(() {\n        countdown -= 1;\n      });\n    });\n  }\n\n  @override\n  void dispose() {\n    timer.cancel();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Opacity(\n      opacity: 0.65,\n      child: SuperChatCard(\n        widget.message,\n        onExpire: () {},\n        customCountdown: countdown,\n      ),\n    );\n  }\n}\n\nclass LocalDisplaySC {\n  final LiveSuperChatMessage sc;\n  final DateTime expireAt;\n  final int duration;\n  LocalDisplaySC(this.sc, this.expireAt, this.duration);\n}\n\nclass PlayerSuperChatOverlay extends StatefulWidget {\n  final LiveRoomController controller;\n  const PlayerSuperChatOverlay({required this.controller, Key? key})\n      : super(key: key);\n  @override\n  State<PlayerSuperChatOverlay> createState() => _PlayerSuperChatOverlayState();\n}\n\nclass _PlayerSuperChatOverlayState extends State<PlayerSuperChatOverlay> {\n  final List<LocalDisplaySC> _displayed = [];\n  final Map<LocalDisplaySC, Timer> _timers = {};\n  late Worker _worker;\n\n  void _addSC(LiveSuperChatMessage sc, {int? customSeconds}) {\n    if (_displayed.any((e) => e.sc == sc)) return;\n    int showSeconds = customSeconds ?? 15;\n    final expireAt = DateTime.now().add(Duration(seconds: showSeconds));\n    final localSC = LocalDisplaySC(sc, expireAt, showSeconds);\n    _displayed.add(localSC);\n    _timers[localSC] = Timer(Duration(seconds: showSeconds), () {\n      setState(() {\n        _displayed.remove(localSC);\n        _timers.remove(localSC)?.cancel();\n      });\n    });\n    setState(() {});\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    // 首次进房时同步已有SC\n    final now = DateTime.now().millisecondsSinceEpoch;\n    for (var sc in widget.controller.superChats) {\n      int remain = (sc.endTime.millisecondsSinceEpoch - now) ~/ 1000;\n      if (remain > 0) {\n        _addSC(sc, customSeconds: remain < 15 ? remain : 15);\n      }\n    }\n    // 监听SC列表变化\n    _worker =\n        ever<List<LiveSuperChatMessage>>(widget.controller.superChats, (list) {\n      // 新增\n      for (var sc in list) {\n        if (!_displayed.any((e) => e.sc == sc)) {\n          _addSC(sc);\n        }\n      }\n      // 移除\n      _displayed.removeWhere((e) => !list.contains(e.sc));\n      setState(() {});\n    });\n  }\n\n  @override\n  void dispose() {\n    _worker.dispose();\n    for (var t in _timers.values) {\n      t.cancel();\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final sorted = _displayed.toList()\n      ..sort((a, b) => a.sc.endTime.compareTo(b.sc.endTime));\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        for (var localSC in sorted)\n          Padding(\n            padding: const EdgeInsets.only(bottom: 12),\n            child: SizedBox(\n              width: 240,\n              child: PlayerSuperChatCard(\n                message: localSC.sc,\n                onExpire: () {},\n                duration: localSC.duration,\n              ),\n            ),\n          ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/account_controller.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/douyin_account_service.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass AccountController extends GetxController {\n  void bilibiliTap() async {\n    if (BiliBiliAccountService.instance.logined.value) {\n      var result = await Utils.showAlertDialog(\"确定要退出哔哩哔哩账号吗？\", title: \"退出登录\");\n      if (result) {\n        BiliBiliAccountService.instance.logout();\n      }\n    } else {\n      //AppNavigator.toBiliBiliLogin();\n      bilibiliLogin();\n    }\n  }\n\n  void bilibiliLogin() {\n    Utils.showBottomSheet(\n      title: \"登录哔哩哔哩\",\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Visibility(\n            visible: Platform.isAndroid || Platform.isIOS,\n            child: ListTile(\n              leading: const Icon(Icons.account_circle_outlined),\n              title: const Text(\"Web登录\"),\n              subtitle: const Text(\"填写用户名密码登录\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.back();\n                Get.toNamed(RoutePath.kBiliBiliWebLogin);\n              },\n            ),\n          ),\n          ListTile(\n            leading: const Icon(Icons.qr_code),\n            title: const Text(\"扫码登录\"),\n            subtitle: const Text(\"使用哔哩哔哩APP扫描二维码登录\"),\n            trailing: const Icon(Icons.chevron_right),\n            onTap: () {\n              Get.back();\n              Get.toNamed(RoutePath.kBiliBiliQRLogin);\n            },\n          ),\n          ListTile(\n            leading: const Icon(Icons.edit_outlined),\n            title: const Text(\"Cookie登录\"),\n            subtitle: const Text(\"手动输入Cookie登录\"),\n            trailing: const Icon(Icons.chevron_right),\n            onTap: () {\n              Get.back();\n              doBiliBiliCookieLogin();\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  void doBiliBiliCookieLogin() async {\n    var cookie = await Utils.showEditTextDialog(\n      \"\",\n      title: \"请输入Cookie\",\n      hintText: \"请输入Cookie\",\n    );\n    if (cookie == null || cookie.isEmpty) {\n      return;\n    }\n    BiliBiliAccountService.instance.setCookie(cookie);\n    await BiliBiliAccountService.instance.loadUserInfo();\n  }\n\n  void douyinTap() async {\n    if (DouyinAccountService.instance.hasCookie.value) {\n      var result = await Utils.showAlertDialog(\"确定要清除自定义 ttwid 吗？\", title: \"清除配置\");\n      if (result) {\n        DouyinAccountService.instance.clearCookie();\n        SmartDialog.showToast(\"已清除自定义 ttwid，将使用默认 ttwid\");\n      }\n    } else {\n      doDouyinCookieConfig();\n    }\n  }\n\n  void doDouyinCookieConfig() {\n    // 初始化文本框时，只显示 ttwid 的值部分\n    var savedCookie = DouyinAccountService.instance.cookie;\n    var displayText = savedCookie;\n    if (savedCookie.startsWith('ttwid=')) {\n      displayText = savedCookie.substring(6); // 去掉 \"ttwid=\"\n    }\n    var controller = TextEditingController(text: displayText);\n\n    Get.dialog(\n      AlertDialog(\n        title: const Text(\"配置抖音 ttwid\"),\n        content: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              const Text(\n                \"默认已内置有效的 ttwid，可观看所有画质（包括蓝光）。\\n如有需要可自定义配置。\",\n                style: TextStyle(fontSize: 12, color: Colors.grey),\n              ),\n              const SizedBox(height: 12),\n              TextField(\n                controller: controller,\n                maxLines: 3,\n                decoration: const InputDecoration(\n                  hintText: \"请粘贴 ttwid 值（留空则使用默认值）\",\n                  border: OutlineInputBorder(),\n                ),\n              ),\n              const SizedBox(height: 8),\n              TextButton.icon(\n                onPressed: () {\n                  // 提取 ttwid 的值部分（去掉 \"ttwid=\" 前缀）\n                  var defaultValue = DouyinSite.kDefaultCookie;\n                  if (defaultValue.startsWith('ttwid=')) {\n                    defaultValue = defaultValue.substring(6); // 去掉 \"ttwid=\"\n                  }\n                  controller.text = defaultValue;\n                },\n                icon: const Icon(Icons.restore),\n                label: const Text(\"恢复默认 ttwid\"),\n              ),\n            ],\n          ),\n        ),\n        actions: [\n          TextButton(\n            onPressed: () => Get.back(),\n            child: const Text(\"取消\"),\n          ),\n          TextButton(\n            onPressed: () {\n              var input = controller.text.trim();\n              Get.back();\n              if (input.isEmpty) {\n                DouyinAccountService.instance.clearCookie();\n                SmartDialog.showToast(\"已清除自定义 Cookie，将使用默认 ttwid\");\n              } else {\n                // 如果用户只输入了 ttwid 值，自动添加 \"ttwid=\" 前缀\n                var cookie = input;\n                if (!input.startsWith('ttwid=')) {\n                  cookie = 'ttwid=$input';\n                }\n                DouyinAccountService.instance.setCookie(cookie);\n                SmartDialog.showToast(\"ttwid 已保存\");\n              }\n            },\n            child: const Text(\"确定\"),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/account_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/mine/account/account_controller.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/douyin_account_service.dart';\n\nclass AccountPage extends GetView<AccountController> {\n  const AccountPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"账号管理\"),\n      ),\n      body: ListView(\n        children: [\n          const Padding(\n            padding: AppStyle.edgeInsetsA12,\n            child: Text(\n              \"哔哩哔哩账号需要登录才能看高清晰度的直播。\",\n              textAlign: TextAlign.center,\n            ),\n          ),\n          Obx(\n            () => ListTile(\n              leading: Image.asset(\n                'assets/images/bilibili_2.png',\n                width: 36,\n                height: 36,\n              ),\n              title: const Text(\"哔哩哔哩\"),\n              subtitle: Text(BiliBiliAccountService.instance.name.value),\n              trailing: BiliBiliAccountService.instance.logined.value\n                  ? const Icon(Icons.logout)\n                  : const Icon(Icons.chevron_right),\n              onTap: controller.bilibiliTap,\n            ),\n          ),\n          ListTile(\n            leading: Image.asset(\n              'assets/images/douyu.png',\n              width: 36,\n              height: 36,\n            ),\n            title: const Text(\"斗鱼直播\"),\n            subtitle: const Text(\"无需登录\"),\n            enabled: false,\n            trailing: const Icon(Icons.chevron_right),\n          ),\n          ListTile(\n            leading: Image.asset(\n              'assets/images/huya.png',\n              width: 36,\n              height: 36,\n            ),\n            title: const Text(\"虎牙直播\"),\n            subtitle: const Text(\"无需登录\"),\n            enabled: false,\n            trailing: const Icon(Icons.chevron_right),\n          ),\n          Obx(\n            () => ListTile(\n              leading: Image.asset(\n                'assets/images/douyin.png',\n                width: 36,\n                height: 36,\n              ),\n              title: const Text(\"抖音直播\"),\n              subtitle: Text(DouyinAccountService.instance.hasCookie.value\n                  ? \"已自定义（${DouyinAccountService.instance.cookie.length} 字符）\"\n                  : \"使用默认 ttwid\"),\n              trailing: DouyinAccountService.instance.hasCookie.value\n                  ? const Icon(Icons.delete_outline)\n                  : const Icon(Icons.chevron_right),\n              onTap: controller.douyinTap,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/qr_login_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/requests/http_client.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\n\nenum QRStatus {\n  loading,\n  unscanned,\n  scanned,\n  expired,\n  failed,\n}\n\nclass BiliBiliQRLoginController extends GetxController {\n  @override\n  void onInit() {\n    loadQRCode();\n    super.onInit();\n  }\n\n  Timer? timer;\n\n  var qrcodeUrl = \"\".obs;\n  var qrcodeKey = \"\";\n\n  /// 二维码状态\n  /// - [0] 加载中\n  /// - [1] 未扫描\n  /// - [2] 已扫描，待确认\n  /// - [3] 二维码已经失效\n  /// - [4] 登录失败\n  Rx<QRStatus> qrStatus = QRStatus.loading.obs;\n\n  void loadQRCode() async {\n    try {\n      qrStatus.value = QRStatus.loading;\n\n      var result = await HttpClient.instance.getJson(\n        \"https://passport.bilibili.com/x/passport-login/web/qrcode/generate\",\n      );\n      if (result[\"code\"] != 0) {\n        throw result[\"message\"];\n      }\n      qrcodeKey = result[\"data\"][\"qrcode_key\"];\n      qrcodeUrl.value = result[\"data\"][\"url\"];\n      qrStatus.value = QRStatus.unscanned;\n      startPoll();\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(e.toString());\n      qrStatus.value = QRStatus.failed;\n    }\n  }\n\n  void startPoll() {\n    timer = Timer.periodic(\n      const Duration(seconds: 3),\n      (timer) {\n        pollQRStatus();\n      },\n    );\n  }\n\n  void pollQRStatus() async {\n    try {\n      var response = await HttpClient.instance.get(\n        \"https://passport.bilibili.com/x/passport-login/web/qrcode/poll\",\n        queryParameters: {\n          \"qrcode_key\": qrcodeKey,\n        },\n      );\n      if (response.data[\"code\"] != 0) {\n        throw response.data[\"message\"];\n      }\n      var data = response.data[\"data\"];\n      var code = data[\"code\"];\n      if (code == 0) {\n        var cookies = <String>[];\n        response.headers[\"set-cookie\"]?.forEach((element) {\n          var cookie = element.split(\";\")[0];\n          cookies.add(cookie);\n        });\n        if (cookies.isNotEmpty) {\n          var cookieStr = cookies.join(\";\");\n          Log.i(cookieStr);\n          BiliBiliAccountService.instance.setCookie(cookieStr);\n          await BiliBiliAccountService.instance.loadUserInfo();\n          Get.back();\n        }\n      } else if (code == 86038) {\n        qrStatus.value = QRStatus.expired;\n        qrcodeKey = \"\";\n        timer?.cancel();\n      } else if (code == 86090) {\n        qrStatus.value = QRStatus.scanned;\n      }\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  @override\n  void onClose() {\n    timer?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/qr_login_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/qr_login_controller.dart';\n\nclass BiliBiliQRLoginPage extends GetView<BiliBiliQRLoginController> {\n  const BiliBiliQRLoginPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text(\"哔哩哔哩账号登录\")),\n      body: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: [\n          Center(\n            child: Obx(\n              () {\n                if (controller.qrStatus.value == QRStatus.loading) {\n                  return const CircularProgressIndicator();\n                }\n                if (controller.qrStatus.value == QRStatus.failed) {\n                  return Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      const Text(\"二维码加载失败\"),\n                      TextButton(\n                        onPressed: controller.loadQRCode,\n                        child: const Text(\"重试\"),\n                      ),\n                    ],\n                  );\n                }\n                if (controller.qrStatus.value == QRStatus.failed) {\n                  return Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      const Text(\"二维码已失效\"),\n                      TextButton(\n                        onPressed: controller.loadQRCode,\n                        child: const Text(\"刷新二维码\"),\n                      ),\n                    ],\n                  );\n                }\n                return Column(\n                  children: [\n                    ClipRRect(\n                      borderRadius: AppStyle.radius12,\n                      child: QrImageView(\n                        data: controller.qrcodeUrl.value,\n                        version: QrVersions.auto,\n                        backgroundColor: Colors.white,\n                        size: 200.0,\n                        padding: AppStyle.edgeInsetsA12,\n                      ),\n                    ),\n                    AppStyle.vGap8,\n                    Visibility(\n                      visible: controller.qrStatus.value == QRStatus.scanned,\n                      child: const Text(\"已扫描，请在手机上确认登录\"),\n                    ),\n                  ],\n                );\n              },\n            ),\n          ),\n          const Padding(\n            padding: AppStyle.edgeInsetsA24,\n            child: Text(\n              \"请使用哔哩哔哩手机客户端扫描二维码登录\",\n              textAlign: TextAlign.center,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/web_login_controller.dart",
    "content": "import 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\n\nclass BiliBiliWebLoginController extends BaseController {\n  InAppWebViewController? webViewController;\n  final CookieManager cookieManager = CookieManager.instance();\n  void onWebViewCreated(InAppWebViewController controller) {\n    webViewController = controller;\n    webViewController!.loadUrl(\n      urlRequest: URLRequest(\n        url: WebUri(\"https://passport.bilibili.com/login\"),\n      ),\n    );\n  }\n\n  void toQRLogin() async {\n    await Get.toNamed(RoutePath.kBiliBiliQRLogin);\n    Get.back();\n  }\n\n  void onLoadStop(InAppWebViewController controller, Uri? uri) async {\n    if (uri == null) {\n      return;\n    }\n    if (uri.host == \"m.bilibili.com\") {\n      logined();\n    }\n  }\n\n  Future<bool> logined() async {\n    try {\n      var cookies =\n          await cookieManager.getCookies(url: WebUri(\"https://bilibili.com\"));\n      if (cookies.isEmpty) {\n        return false;\n      }\n      var cookieStr = cookies.map((e) => \"${e.name}=${e.value}\").join(\";\");\n      Log.i(cookieStr);\n      BiliBiliAccountService.instance.setCookie(cookieStr);\n      await BiliBiliAccountService.instance.loadUserInfo();\n      Get.back();\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/account/bilibili/web_login_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/web_login_controller.dart';\n\nclass BiliBiliWebLoginPage extends GetView<BiliBiliWebLoginController> {\n  const BiliBiliWebLoginPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"哔哩哔哩账号登录\"),\n        actions: [\n          TextButton.icon(\n            onPressed: controller.toQRLogin,\n            icon: const Icon(Icons.qr_code),\n            label: const Text(\"二维码登录\"),\n          ),\n        ],\n      ),\n      body: InAppWebView(\n        onWebViewCreated: controller.onWebViewCreated,\n        onLoadStop: controller.onLoadStop,\n        initialSettings: InAppWebViewSettings(\n          userAgent:\n              \"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/118.0.0.0\",\n          useShouldOverrideUrlLoading: true,\n        ),\n        shouldOverrideUrlLoading: (webController, navigationAction) async {\n          var uri = navigationAction.request.url;\n          if (uri == null) {\n            return NavigationActionPolicy.ALLOW;\n          }\n          if (uri.host == \"m.bilibili.com\" || uri.host == \"www.bilibili.com\") {\n            await controller.logined();\n            return NavigationActionPolicy.CANCEL;\n          }\n          return NavigationActionPolicy.ALLOW;\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/history/history_controller.dart",
    "content": "import 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/services/db_service.dart';\n\nclass HistoryController extends BasePageController<History> {\n  @override\n  Future<List<History>> getData(int page, int pageSize) {\n    if (page > 1) {\n      return Future.value([]);\n    }\n    return Future.value(DBService.instance.getHistores());\n  }\n\n  void clean() async {\n    var result = await Utils.showAlertDialog(\"确定要清空观看记录吗?\", title: \"清空观看记录\");\n    if (!result) {\n      return;\n    }\n    await DBService.instance.historyBox.clear();\n    refreshData();\n  }\n\n  void removeItem(History item) async {\n    await DBService.instance.historyBox.delete(item.id);\n    refreshData();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/history/history_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/mine/history/history_controller.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_app/widgets/page_grid_view.dart';\n\nclass HistoryPage extends GetView<HistoryController> {\n  const HistoryPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var rowCount = MediaQuery.of(context).size.width ~/ 500;\n    if (rowCount < 1) rowCount = 1;\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"观看记录\"),\n        actions: [\n          TextButton.icon(\n            onPressed: controller.clean,\n            icon: const Icon(Icons.delete_outline),\n            label: const Text(\"清空\"),\n          ),\n        ],\n      ),\n      body: PageGridView(\n        crossAxisSpacing: 12,\n        crossAxisCount: rowCount,\n        pageController: controller,\n        firstRefresh: true,\n        itemBuilder: (_, i) {\n          var item = controller.list[i];\n          var site = Sites.allSites[item.siteId]!;\n          return Dismissible(\n            key: ValueKey(item.id),\n            direction: DismissDirection.endToStart,\n            background: Container(\n              color: Colors.red,\n              padding: AppStyle.edgeInsetsA12,\n              alignment: Alignment.centerRight,\n              child: const Icon(\n                Icons.delete,\n                color: Colors.white,\n              ),\n            ),\n            confirmDismiss: (direction) async {\n              return await Utils.showAlertDialog(\"确定要删除此记录吗?\", title: \"删除记录\");\n            },\n            onDismissed: (_) {\n              controller.removeItem(item);\n            },\n            child: ListTile(\n              leading: NetImage(\n                item.face,\n                width: 48,\n                height: 48,\n                borderRadius: 24,\n              ),\n              title: Text(item.userName),\n              subtitle: Row(\n                children: [\n                  Expanded(\n                    child: Row(\n                      children: [\n                        Image.asset(\n                          site.logo,\n                          width: 20,\n                        ),\n                        AppStyle.hGap4,\n                        Text(\n                          site.name,\n                          style: const TextStyle(\n                            fontSize: 12,\n                            color: Colors.grey,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  Text(\n                    Utils.parseTime(item.updateTime),\n                    style: const TextStyle(fontSize: 12, color: Colors.grey),\n                  ),\n                ],\n              ),\n              onTap: () {\n                AppNavigator.toLiveRoomDetail(site: site, roomId: item.roomId);\n              },\n              onLongPress: () async {\n                var result =\n                    await Utils.showAlertDialog(\"确定要删除此记录吗?\", title: \"删除记录\");\n                if (!result) {\n                  return;\n                }\n                controller.removeItem(item);\n              },\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/mine_page.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/services/signalr_service.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass MinePage extends StatelessWidget {\n  const MinePage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return AnnotatedRegion<SystemUiOverlayStyle>(\n      value: Get.isDarkMode\n          ? SystemUiOverlayStyle.light.copyWith(\n              systemNavigationBarColor: Colors.transparent,\n            )\n          : SystemUiOverlayStyle.dark.copyWith(\n              systemNavigationBarColor: Colors.transparent,\n            ),\n      child: SafeArea(\n        child: ListView(\n          padding: AppStyle.edgeInsetsA4,\n          children: [\n            AppStyle.vGap12,\n            ListTile(\n              leading: Image.asset(\n                'assets/images/logo.png',\n                width: 56,\n                height: 56,\n              ),\n              title: const Text(\n                \"Simple Live\",\n                style: TextStyle(height: 1.0),\n              ),\n              subtitle: const Text(\"简简单单看直播\"),\n              trailing: const Icon(Icons.chevron_right),\n              onTap: () {\n                Get.dialog(AboutDialog(\n                  applicationIcon: Image.asset(\n                    'assets/images/logo.png',\n                    width: 48,\n                    height: 48,\n                  ),\n                  applicationName: \"Simple Live\",\n                  applicationVersion: \"简简单单看直播\",\n                  applicationLegalese: \"Ver ${Utils.packageInfo.version}\",\n                ));\n              },\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            _buildCard(\n              context,\n              children: [\n                ListTile(\n                  leading: const Icon(Remix.history_line),\n                  title: const Text(\"观看记录\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kHistory);\n                  },\n                ),\n              ],\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            ListTile(\n              leading: const Icon(Remix.account_circle_line),\n              title: const Text(\"账号管理\"),\n              trailing: const Icon(\n                Icons.chevron_right,\n                color: Colors.grey,\n              ),\n              onTap: () {\n                Get.toNamed(RoutePath.kSettingsAccount);\n              },\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            ListTile(\n              leading: const Icon(Icons.devices),\n              title: const Text(\"数据同步\"),\n              trailing: const Icon(\n                Icons.chevron_right,\n                color: Colors.grey,\n              ),\n              onTap: () {\n                Get.toNamed(RoutePath.kSync);\n              },\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            ListTile(\n              leading: const Icon(Remix.link),\n              title: const Text(\"链接解析\"),\n              trailing: const Icon(\n                Icons.chevron_right,\n                color: Colors.grey,\n              ),\n              onTap: () {\n                Get.toNamed(RoutePath.kTools);\n              },\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            _buildCard(\n              context,\n              children: [\n                ListTile(\n                  leading: const Icon(Remix.moon_line),\n                  title: const Text(\"外观设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kAppstyleSetting);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.home_2_line),\n                  title: const Text(\"主页设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsIndexed);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.play_circle_line),\n                  title: const Text(\"直播设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsPlay);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.text),\n                  title: const Text(\"弹幕设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsDanmu);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.heart_line),\n                  title: const Text(\"关注设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsFollow);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.timer_2_line),\n                  title: const Text(\"定时关闭\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsAutoExit);\n                  },\n                ),\n                ListTile(\n                  leading: const Icon(Remix.apps_line),\n                  title: const Text(\"其他设置\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kSettingsOther);\n                  },\n                ),\n                if (kDebugMode)\n                  ListTile(\n                    leading: const Icon(Remix.apps_line),\n                    title: const Text(\"测试\"),\n                    trailing: const Icon(\n                      Icons.chevron_right,\n                      color: Colors.grey,\n                    ),\n                    onTap: () async {\n                      SignalRService signalRService = SignalRService();\n                      await signalRService.connect();\n                      //Get.toNamed(RoutePath.kTest);\n                      var room = await signalRService.createRoom();\n                      Log.logPrint(room);\n                    },\n                  ),\n              ],\n            ),\n            Divider(\n              indent: 12,\n              endIndent: 12,\n              color: Colors.grey.withAlpha(25),\n            ),\n            _buildCard(\n              context,\n              children: [\n                const ListTile(\n                  leading: Icon(Remix.error_warning_line),\n                  title: Text(\"免责声明\"),\n                  trailing: Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: Utils.showStatement,\n                ),\n                ListTile(\n                  leading: const Icon(Remix.github_line),\n                  title: const Text(\"开源主页\"),\n                  trailing: const Icon(\n                    Icons.chevron_right,\n                    color: Colors.grey,\n                  ),\n                  onTap: () {\n                    launchUrlString(\n                      \"https://github.com/xiaoyaocz/dart_simple_live\",\n                      mode: LaunchMode.externalApplication,\n                    );\n                  },\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildCard(BuildContext context, {required List<Widget> children}) {\n    return Theme(\n      data: Theme.of(context).copyWith(\n        listTileTheme: ListTileThemeData(\n          shape: RoundedRectangleBorder(borderRadius: AppStyle.radius8),\n        ),\n      ),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: children,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/parse/parse_controller.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\n\nclass ParseController extends GetxController {\n  final TextEditingController roomJumpToController = TextEditingController();\n  final TextEditingController getUrlController = TextEditingController();\n\n  void jumpToRoom(String e) async {\n    if (e.isEmpty) {\n      SmartDialog.showToast(\"链接不能为空\");\n      return;\n    }\n    // 隐藏键盘\n    FocusManager.instance.primaryFocus?.unfocus();\n\n    var parseResult = await parse(e);\n    if (parseResult.isEmpty && parseResult.first == \"\") {\n      SmartDialog.showToast(\"无法解析此链接\");\n      return;\n    }\n\n    // 延迟200ms跳转，等待键盘隐藏\n    Future.delayed(const Duration(milliseconds: 200), () {\n      Site site = parseResult[1];\n      AppNavigator.toLiveRoomDetail(site: site, roomId: parseResult.first);\n    });\n  }\n\n  void getPlayUrl(String e) async {\n    if (e.isEmpty) {\n      SmartDialog.showToast(\"链接不能为空\");\n      return;\n    }\n    var parseResult = await parse(e);\n    if (parseResult.isEmpty && parseResult.first == \"\") {\n      SmartDialog.showToast(\"无法解析此链接\");\n      return;\n    }\n    Site site = parseResult[1];\n    try {\n      SmartDialog.showLoading(msg: \"\");\n      var detail = await site.liveSite.getRoomDetail(roomId: parseResult.first);\n      var qualites = await site.liveSite.getPlayQualites(detail: detail);\n      SmartDialog.dismiss(status: SmartStatus.loading);\n      if (qualites.isEmpty) {\n        SmartDialog.showToast(\"读取直链失败,无法读取清晰度\");\n\n        return;\n      }\n      var result = await Get.dialog(SimpleDialog(\n        title: const Text(\"选择清晰度\"),\n        children: qualites\n            .map(\n              (e) => ListTile(\n                title: Text(\n                  e.quality,\n                  textAlign: TextAlign.center,\n                ),\n                onTap: () {\n                  Get.back(result: e);\n                },\n              ),\n            )\n            .toList(),\n      ));\n      if (result == null) {\n        return;\n      }\n      SmartDialog.showLoading(msg: \"\");\n      var playUrl =\n          await site.liveSite.getPlayUrls(detail: detail, quality: result);\n      SmartDialog.dismiss(status: SmartStatus.loading);\n      await Get.dialog(SimpleDialog(\n        title: const Text(\"选择线路\"),\n        children: playUrl.urls\n            .map(\n              (e) => ListTile(\n                title: Text(\n                  \"线路${playUrl.urls.indexOf(e) + 1}\",\n                ),\n                subtitle: Text(\n                  e,\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                ),\n                onTap: () {\n                  Clipboard.setData(ClipboardData(text: e));\n                  Get.back();\n                  SmartDialog.showToast(\"已复制直链\");\n                },\n              ),\n            )\n            .toList(),\n      ));\n    } catch (e) {\n      SmartDialog.showToast(\"读取直链失败\");\n    } finally {\n      SmartDialog.dismiss(status: SmartStatus.loading);\n    }\n  }\n\n  Future<List> parse(String url) async {\n    var id = \"\";\n    if (url.contains(\"bilibili.com\")) {\n      var regExp = RegExp(r\"bilibili\\.com/([\\d|\\w]+)\");\n      id = regExp.firstMatch(url)?.group(1) ?? \"\";\n      return [id, Sites.allSites[Constant.kBiliBili]!];\n    }\n\n    if (url.contains(\"b23.tv\")) {\n      var btvReg = RegExp(r\"https?:\\/\\/b23.tv\\/[0-9a-z-A-Z]+\");\n      var u = btvReg.firstMatch(url)?.group(0) ?? \"\";\n      var location = await getLocation(u);\n\n      return await parse(location);\n    }\n\n    if (url.contains(\"douyu.com\")) {\n      var regExp = RegExp(r\"douyu\\.com/([\\d|\\w]+)\");\n      // 适配 topic_url\n      if(url.contains(\"topic\")){\n        regExp = RegExp(r\"[?&]rid=([\\d]+)\");\n      }\n      id = regExp.firstMatch(url)?.group(1) ?? \"\";\n\n      return [id, Sites.allSites[Constant.kDouyu]!];\n    }\n    if (url.contains(\"huya.com\")) {\n      var regExp = RegExp(r\"huya\\.com/([\\d|\\w]+)\");\n      id = regExp.firstMatch(url)?.group(1) ?? \"\";\n\n      return [id, Sites.allSites[Constant.kHuya]!];\n    }\n    if (url.contains(\"live.douyin.com\")) {\n      var regExp = RegExp(r\"live\\.douyin\\.com/([\\d|\\w]+)\");\n      id = regExp.firstMatch(url)?.group(1) ?? \"\";\n\n      return [id, Sites.allSites[Constant.kDouyin]!];\n    }\n    if (url.contains(\"webcast.amemv.com\")) {\n      var regExp = RegExp(r\"reflow/(\\d+)\");\n      id = regExp.firstMatch(url)?.group(1) ?? \"\";\n      return [id, Sites.allSites[Constant.kDouyin]!];\n    }\n    if (url.contains(\"v.douyin.com\")) {\n      var regExp = RegExp(r\"http.?://v.douyin.com/[\\d\\w]+/\");\n      var u = regExp.firstMatch(url)?.group(0) ?? \"\";\n      var location = await getLocation(u);\n      return await parse(location);\n    }\n\n    return [];\n  }\n\n  Future<String> getLocation(String url) async {\n    try {\n      if (url.isEmpty) return \"\";\n      await Dio().get(\n        url,\n        options: Options(\n          followRedirects: false,\n        ),\n      );\n    } on DioException catch (e) {\n      if (e.response!.statusCode == 302) {\n        var redirectUrl = e.response!.headers.value(\"Location\");\n        if (redirectUrl != null) {\n          return redirectUrl;\n        }\n      }\n    } catch (e) {\n      Log.logPrint(e);\n    }\n    return \"\";\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/mine/parse/parse_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/mine/parse/parse_controller.dart';\n\nclass ParsePage extends GetView<ParseController> {\n  const ParsePage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"链接解析\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          buildCard(\n            context: context,\n            child: ExpansionTile(\n              title: const Text(\"直播间跳转\"),\n              childrenPadding: AppStyle.edgeInsetsH12,\n              initiallyExpanded: true,\n              children: [\n                TextField(\n                  minLines: 3,\n                  maxLines: 3,\n                  controller: controller.roomJumpToController,\n                  textInputAction: TextInputAction.go,\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    hintText: \"输入或粘贴哔哩哔哩直播/虎牙直播/斗鱼直播/抖音直播的链接\",\n                    contentPadding: AppStyle.edgeInsetsA12,\n                    enabledBorder: OutlineInputBorder(\n                      borderSide: BorderSide(\n                        color: Colors.grey.withAlpha(50),\n                      ),\n                    ),\n                  ),\n                  onSubmitted: controller.jumpToRoom,\n                ),\n                Container(\n                  margin: AppStyle.edgeInsetsB4,\n                  width: double.infinity,\n                  child: TextButton.icon(\n                    onPressed: () {\n                      controller\n                          .jumpToRoom(controller.roomJumpToController.text);\n                    },\n                    icon: const Icon(Remix.play_circle_line),\n                    label: const Text(\"链接跳转\"),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          buildCard(\n            context: context,\n            child: ExpansionTile(\n              title: const Text(\"获取直链\"),\n              childrenPadding: AppStyle.edgeInsetsH12,\n              initiallyExpanded: true,\n              children: [\n                TextField(\n                  minLines: 3,\n                  maxLines: 3,\n                  controller: controller.getUrlController,\n                  textInputAction: TextInputAction.go,\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    hintText: \"输入或粘贴哔哩哔哩直播/虎牙直播/斗鱼直播/抖音直播的链接\",\n                    contentPadding: AppStyle.edgeInsetsA12,\n                    enabledBorder: OutlineInputBorder(\n                      borderSide: BorderSide(\n                        color: Colors.grey.withAlpha(50),\n                      ),\n                    ),\n                  ),\n                  onSubmitted: controller.getPlayUrl,\n                ),\n                Container(\n                  margin: AppStyle.edgeInsetsB4,\n                  width: double.infinity,\n                  child: TextButton.icon(\n                    onPressed: () {\n                      controller.getPlayUrl(controller.getUrlController.text);\n                    },\n                    icon: const Icon(Remix.link),\n                    label: const Text(\"获取直链\"),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          const Padding(\n            padding: AppStyle.edgeInsetsV12,\n            child: SelectableText('''支持以下类型的链接解析：\n哔哩哔哩：\nhttps://live.bilibili.com/xxxxx\nhttps://b23.tv/xxxxx\n虎牙直播：\nhttps://www.huya.com/xxxxx\n斗鱼直播：\nhttps://www.douyu.com/xxxxx\nhttps://www.douyu.com/topic/xxx?rid=xxx\n抖音直播：\nhttps://v.douyin.com/xxxxx\nhttps://live.douyin.com/xxxxx\nhttps://webcast.amemv.com/webcast/reflow/xxxxx\n''', style: TextStyle(color: Colors.grey)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildCard({required BuildContext context, required Widget child}) {\n    return Container(\n      decoration: BoxDecoration(\n        color: Theme.of(context).cardColor,\n        borderRadius: AppStyle.radius8,\n        boxShadow: Get.isDarkMode\n            ? []\n            : [\n                BoxShadow(\n                  blurRadius: 8,\n                  color: Colors.grey.withAlpha(50),\n                )\n              ],\n      ),\n      margin: AppStyle.edgeInsetsB12,\n      child: Theme(\n        data: Theme.of(context).copyWith(\n          dividerColor: Colors.transparent,\n        ),\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/other/debug_log_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:share_plus/share_plus.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/log.dart';\n\nclass DebugLogPage extends StatelessWidget {\n  const DebugLogPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"Log\"),\n        actions: [\n          IconButton(\n            onPressed: () async {\n              var msg = Log.debugLogs\n                  .map((x) => \"${x.datetime}\\r\\n${x.content}\")\n                  .join('\\r\\n\\r\\n');\n              var dir = await getApplicationDocumentsDirectory();\n              var logFile = File(\n                  '${dir.path}/${DateTime.now().millisecondsSinceEpoch}.log');\n              await logFile.writeAsString(msg);\n\n              SharePlus.instance.share(ShareParams(\n                files: [XFile(logFile.path)],\n              ));\n            },\n            icon: const Icon(Icons.save),\n          ),\n          IconButton(\n            onPressed: () {\n              Log.debugLogs.clear();\n            },\n            icon: const Icon(Icons.clear_all),\n          ),\n        ],\n      ),\n      body: Obx(\n        () => ListView.separated(\n          itemCount: Log.debugLogs.length,\n          separatorBuilder: (_, i) => const Divider(),\n          padding: AppStyle.edgeInsetsA12,\n          itemBuilder: (_, i) {\n            var item = Log.debugLogs[i];\n            return SelectableText(\n              \"${item.datetime.toString()}\\r\\n${item.content}\",\n              style: TextStyle(\n                color: item.color,\n                fontSize: 12,\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/douyin/douyin_search_controller.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass DouyinSearchController extends BaseController {\n  InAppWebViewController? webViewController;\n\n  void onWebViewCreated(InAppWebViewController controller) {\n    webViewController = controller;\n  }\n\n  RxList<LiveRoomItem> list = <LiveRoomItem>[].obs;\n\n  String keyword = \"\";\n\n  /// 搜索模式，0=直播间，1=主播\n  var searchMode = 0.obs;\n  final Site site;\n  DouyinSearchController(\n    this.site,\n  );\n\n  var searchUrl = \"https://www.douyin.com/search/dnf?type=live\";\n\n  void reloadWebView() {\n    if (keyword.isEmpty) {\n      return;\n    }\n    searchUrl =\n        \"https://www.douyin.com/search/${Uri.encodeComponent(keyword)}?type=live\";\n    if (Platform.isAndroid || Platform.isIOS) {\n      webViewController!.loadUrl(\n        urlRequest: URLRequest(\n          url: WebUri(searchUrl),\n        ),\n      );\n    }\n  }\n\n  void onLoadStop(InAppWebViewController controller, Uri? uri) async {\n    pageLoadding.value = false;\n  }\n\n  void onLoadStart(InAppWebViewController controller, Uri? uri) async {\n    pageLoadding.value = true;\n  }\n\n  Future<bool?> onCreateWindow(InAppWebViewController controller,\n      CreateWindowAction createWindowAction) async {\n    if (createWindowAction.request.url?.host == \"live.douyin.com\") {\n      {\n        var regExp = RegExp(r\"live\\.douyin\\.com/([\\d|\\w]+)\");\n        var id = regExp\n                .firstMatch(createWindowAction.request.url.toString())\n                ?.group(1) ??\n            \"\";\n\n        AppNavigator.toLiveRoomDetail(site: site, roomId: id);\n        return false;\n      }\n    }\n\n    return false;\n  }\n\n  void openBrowser() {\n    launchUrlString(searchUrl);\n    Get.offAndToNamed(RoutePath.kTools);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/douyin/douyin_search_view.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/search/douyin/douyin_search_controller.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/status/app_loadding_widget.dart';\n\nclass DouyinSearchView extends StatelessWidget {\n  const DouyinSearchView({Key? key}) : super(key: key);\n  DouyinSearchController get controller => Get.find<DouyinSearchController>();\n\n  @override\n  Widget build(BuildContext context) {\n    var roomRowCount = MediaQuery.of(context).size.width ~/ 200;\n    if (roomRowCount < 2) roomRowCount = 2;\n\n    var userRowCount = MediaQuery.of(context).size.width ~/ 500;\n    if (userRowCount < 1) userRowCount = 1;\n    return KeepAliveWrapper(\n      child: Stack(\n        children: [\n          SizedBox(\n            width: double.infinity,\n            height: double.infinity,\n            child: Center(\n              child: Padding(\n                padding: AppStyle.edgeInsetsA12,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  children: [\n                    const Text(\n                      \"暂不支持抖音搜索，请打开浏览器搜索，然后复制直播间链接进行解析\",\n                      textAlign: TextAlign.center,\n                    ),\n                    TextButton.icon(\n                      onPressed: controller.openBrowser,\n                      icon: const Icon(Icons.open_in_browser),\n                      label: const Text(\"打开浏览器\"),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          if (Platform.isAndroid || Platform.isIOS)\n            InAppWebView(\n              onWebViewCreated: controller.onWebViewCreated,\n              onLoadStop: controller.onLoadStop,\n              onLoadStart: controller.onLoadStart,\n              initialSettings: InAppWebViewSettings(\n                useOnLoadResource: true,\n                userAgent:\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/118.0.0.0\",\n                useShouldOverrideUrlLoading: true,\n              ),\n              onCreateWindow: controller.onCreateWindow,\n              shouldOverrideUrlLoading:\n                  (webController, navigationAction) async {\n                var uri = navigationAction.request.url;\n                if (uri == null) {\n                  return NavigationActionPolicy.ALLOW;\n                }\n                if (uri.host == \"live.douyin.com\") {\n                  var regExp = RegExp(r\"live\\.douyin\\.com/([\\d|\\w]+)\");\n                  var id = regExp.firstMatch(uri.toString())?.group(1) ?? \"\";\n\n                  AppNavigator.toLiveRoomDetail(\n                      site: controller.site, roomId: id);\n                  return NavigationActionPolicy.CANCEL;\n                }\n                return NavigationActionPolicy.ALLOW;\n              },\n            ),\n          Obx(\n            () => Visibility(\n              visible: controller.pageLoadding.value,\n              child: const AppLoaddingWidget(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/search/search_list_controller.dart';\n\nclass AppSearchController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late TabController tabController;\n  int index = 0;\n\n  var searchMode = 0.obs;\n\n  AppSearchController() {\n    tabController =\n        TabController(length: Sites.supportSites.length, vsync: this);\n    tabController.animation?.addListener(() {\n      var currentIndex = (tabController.animation?.value ?? 0).round();\n      if (index == currentIndex) {\n        return;\n      }\n\n      index = currentIndex;\n      // if (Sites.supportSites[index].id == Constant.kDouyin) {\n      //   return;\n      // }\n\n      var controller =\n          Get.find<SearchListController>(tag: Sites.supportSites[index].id);\n\n      if (controller.list.isEmpty &&\n          !controller.pageEmpty.value &&\n          controller.keyword.isNotEmpty) {\n        controller.refreshData();\n      }\n    });\n  }\n\n  StreamSubscription<dynamic>? streamSubscription;\n\n  TextEditingController searchController = TextEditingController();\n\n  @override\n  void onInit() {\n    for (var site in Sites.supportSites) {\n      // if (site.id == Constant.kDouyin) {\n      //   Get.put(DouyinSearchController(site));\n      // } else {\n      Get.put(\n        SearchListController(site),\n        tag: site.id,\n      );\n      //}\n    }\n\n    super.onInit();\n  }\n\n  void doSearch() {\n    if (searchController.text.isEmpty) {\n      return;\n    }\n    for (var site in Sites.supportSites) {\n      // if (site.id == Constant.kDouyin) {\n      //   var controller = Get.find<DouyinSearchController>();\n      //   controller.keyword = searchController.text;\n      //   controller.searchMode.value = searchMode.value;\n      //   controller.reloadWebView();\n      // } else {\n      var controller = Get.find<SearchListController>(tag: site.id);\n      controller.clear();\n      controller.keyword = searchController.text;\n      controller.searchMode.value = searchMode.value;\n      //}\n    }\n    // if (Sites.supportSites[index].id != Constant.kDouyin) {\n    var controller =\n        Get.find<SearchListController>(tag: Sites.supportSites[index].id);\n    controller.refreshData();\n    //}\n  }\n\n  @override\n  void onClose() {\n    streamSubscription?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_list_controller.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\n\nclass SearchListController extends BasePageController {\n  String keyword = \"\";\n\n  /// 搜索模式，0=直播间，1=主播\n  var searchMode = 0.obs;\n  final Site site;\n  SearchListController(\n    this.site,\n  );\n\n  @override\n  Future refreshData() async {\n    if (keyword.isEmpty) {\n      return;\n    }\n    return await super.refreshData();\n  }\n\n  @override\n  Future<List> getData(int page, int pageSize) async {\n    if (keyword.isEmpty) {\n      return [];\n    }\n    if (searchMode.value == 1) {\n      // 搜索主播\n      var result = await site.liveSite.searchAnchors(keyword, page: page);\n      return result.items;\n    }\n    var result = await site.liveSite.searchRooms(keyword, page: page);\n\n    return result.items;\n  }\n\n  void clear() {\n    pageEmpty.value = false;\n    list.clear();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_list_view.dart",
    "content": "import 'package:flutter/material.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/search/search_list_controller.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/widgets/keep_alive_wrapper.dart';\nimport 'package:simple_live_app/widgets/live_room_card.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_app/widgets/page_grid_view.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass SearchListView extends StatelessWidget {\n  final String tag;\n  const SearchListView(this.tag, {Key? key}) : super(key: key);\n  SearchListController get controller =>\n      Get.find<SearchListController>(tag: tag);\n  @override\n  Widget build(BuildContext context) {\n    var roomRowCount = MediaQuery.of(context).size.width ~/ 200;\n    if (roomRowCount < 2) roomRowCount = 2;\n\n    var userRowCount = MediaQuery.of(context).size.width ~/ 500;\n    if (userRowCount < 1) userRowCount = 1;\n    return KeepAliveWrapper(\n      child: Obx(\n        () => controller.searchMode.value == 0\n            ? PageGridView(\n                pageController: controller,\n                padding: AppStyle.edgeInsetsA12,\n                firstRefresh: false,\n                mainAxisSpacing: 12,\n                crossAxisSpacing: 12,\n                crossAxisCount: roomRowCount,\n                showPageLoadding: true,\n                itemBuilder: (_, i) {\n                  var item = controller.list[i] as LiveRoomItem;\n                  return LiveRoomCard(controller.site, item);\n                },\n              )\n            : PageGridView(\n                crossAxisSpacing: 12,\n                crossAxisCount: userRowCount,\n                pageController: controller,\n                firstRefresh: true,\n                itemBuilder: (_, i) {\n                  var item = controller.list[i] as LiveAnchorItem;\n\n                  return ListTile(\n                    leading: NetImage(\n                      item.avatar,\n                      width: 48,\n                      height: 48,\n                      borderRadius: 24,\n                    ),\n                    title: Text(item.userName),\n                    subtitle: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Container(\n                          width: 8,\n                          height: 8,\n                          decoration: BoxDecoration(\n                            color: item.liveStatus ? Colors.green : Colors.grey,\n                            borderRadius: AppStyle.radius12,\n                          ),\n                        ),\n                        AppStyle.hGap4,\n                        Text(\n                          item.liveStatus ? \"直播中\" : \"未开播\",\n                          style: TextStyle(\n                            fontSize: 12,\n                            fontWeight: FontWeight.normal,\n                            color: item.liveStatus ? null : Colors.grey,\n                          ),\n                        ),\n                      ],\n                    ),\n                    onTap: () {\n                      AppNavigator.toLiveRoomDetail(\n                          site: controller.site, roomId: item.roomId);\n                    },\n                  );\n                },\n              ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/search/search_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/search/search_controller.dart';\nimport 'package:simple_live_app/modules/search/search_list_view.dart';\n\nclass SearchPage extends GetView<AppSearchController> {\n  const SearchPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        automaticallyImplyLeading: false,\n        title: TextField(\n          controller: controller.searchController,\n          autofocus: true,\n          decoration: InputDecoration(\n            hintText: \"搜点什么吧\",\n            border: OutlineInputBorder(\n              borderRadius: AppStyle.radius24,\n            ),\n            contentPadding: AppStyle.edgeInsetsH12,\n            prefixIcon: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                IconButton(\n                  onPressed: Get.back,\n                  icon: const Icon(Icons.arrow_back),\n                ),\n                Obx(\n                  () => DropdownButton<int>(\n                    underline: const SizedBox(),\n                    items: const [\n                      DropdownMenuItem(\n                        value: 0,\n                        child: Text(\"房间\"),\n                      ),\n                      DropdownMenuItem(\n                        value: 1,\n                        child: Text(\"主播\"),\n                      ),\n                    ],\n                    value: controller.searchMode.value,\n                    onChanged: (e) {\n                      controller.searchMode.value = e ?? 0;\n                      controller.doSearch();\n                    },\n                  ),\n                ),\n                AppStyle.hGap8,\n              ],\n            ),\n            suffixIcon: IconButton(\n              onPressed: controller.doSearch,\n              icon: const Icon(Icons.search),\n            ),\n          ),\n          onSubmitted: (e) {\n            controller.doSearch();\n          },\n        ),\n        bottom: TabBar(\n          controller: controller.tabController,\n          padding: EdgeInsets.zero,\n          tabAlignment: TabAlignment.center,\n          tabs: Sites.supportSites\n              .map(\n                (e) => Tab(\n                  //text: e.name,\n                  child: Row(\n                    children: [\n                      Image.asset(\n                        e.logo,\n                        width: 24,\n                      ),\n                      AppStyle.hGap8,\n                      Text(e.name),\n                    ],\n                  ),\n                ),\n              )\n              .toList(),\n          labelPadding: AppStyle.edgeInsetsH20,\n          isScrollable: true,\n          indicatorSize: TabBarIndicatorSize.label,\n        ),\n      ),\n      body: TabBarView(\n        physics: const NeverScrollableScrollPhysics(),\n        controller: controller.tabController,\n        children: Sites.supportSites\n            .map((e) => SearchListView(\n                      e.id,\n                    )\n                // (e) => e.id == Constant.kDouyin\n                //     ? const DouyinSearchView()\n                //     : SearchListView(\n                //         e.id,\n                //       ),\n                )\n            .toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/appstyle_setting_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\n\nclass AppstyleSettingPage extends GetView<AppSettingsController> {\n  const AppstyleSettingPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"外观设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n            child: Text(\n              \"显示主题\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => RadioGroup(\n                groupValue: controller.themeMode.value,\n                onChanged: (e) {\n                  controller.setTheme(e ?? 0);\n                },\n                child: const Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    RadioListTile<int>(\n                      title: Text(\n                        \"跟随系统\",\n                      ),\n                      visualDensity: VisualDensity.compact,\n                      value: 0,\n                      contentPadding: AppStyle.edgeInsetsH12,\n                    ),\n                    RadioListTile<int>(\n                      title: Text(\n                        \"浅色模式\",\n                      ),\n                      visualDensity: VisualDensity.compact,\n                      value: 1,\n                      contentPadding: AppStyle.edgeInsetsH12,\n                    ),\n                    RadioListTile<int>(\n                      title: Text(\n                        \"深色模式\",\n                      ),\n                      visualDensity: VisualDensity.compact,\n                      value: 2,\n                      contentPadding: AppStyle.edgeInsetsH12,\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          AppStyle.vGap12,\n          Padding(\n            padding: AppStyle.edgeInsetsA12,\n            child: Text(\n              \"主题颜色\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  SettingsSwitch(\n                    value: controller.isDynamic.value,\n                    title: \"动态取色\",\n                    onChanged: (e) {\n                      controller.setIsDynamic(e);\n                      Get.forceAppUpdate();\n                    },\n                  ),\n                  if (!controller.isDynamic.value) AppStyle.divider,\n                  if (!controller.isDynamic.value)\n                    Padding(\n                      padding: AppStyle.edgeInsetsA12,\n                      child: Wrap(\n                        spacing: 8,\n                        runSpacing: 8,\n                        children: <Color>[\n                          const Color(0xffEF5350),\n                          const Color(0xff3498db),\n                          const Color(0xffF06292),\n                          const Color(0xff9575CD),\n                          const Color(0xff26C6DA),\n                          const Color(0xff26A69A),\n                          const Color(0xffFFF176),\n                          const Color(0xffFF9800),\n                        ]\n                            .map(\n                              (e) => GestureDetector(\n                                onTap: () {\n                                  controller.setStyleColor(e.toARGB32());\n                                  Get.forceAppUpdate();\n                                },\n                                child: Container(\n                                  width: 36,\n                                  height: 36,\n                                  decoration: BoxDecoration(\n                                    color: e,\n                                    borderRadius: AppStyle.radius4,\n                                    border: Border.all(\n                                      color: Colors.grey.withAlpha(50),\n                                      width: 1,\n                                    ),\n                                  ),\n                                  child: Obx(\n                                    () => Center(\n                                      child: Icon(\n                                        Icons.check,\n                                        color: controller.styleColor.value ==\n                                                e.toARGB32()\n                                            ? Colors.white\n                                            : Colors.transparent,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                              ),\n                            )\n                            .toList(),\n                      ),\n                    ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\n// extension ColorExt on Color {\n//   static int _floatToInt8(double x) {\n//     return (x * 255.0).round() & 0xff;\n//   }\n\n//   int get v =>\n//       _floatToInt8(a) << 24 |\n//       _floatToInt8(r) << 16 |\n//       _floatToInt8(g) << 8 |\n//       _floatToInt8(b) << 0;\n// }\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/auto_exit_settings_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_action.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\n\nclass AutoExitSettingsPage extends GetView<AppSettingsController> {\n  const AutoExitSettingsPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"定时关闭设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          SettingsCard(\n            child: Column(\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    value: controller.autoExitEnable.value,\n                    title: \"启用定时关闭\",\n                    onChanged: (e) {\n                      controller.setAutoExitEnable(e);\n                    },\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: controller.autoExitEnable.value,\n                    child: AppStyle.divider,\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: controller.autoExitEnable.value,\n                    child: SettingsAction(\n                      title: \"自动关闭时间\",\n                      value:\n                          \"${controller.autoExitDuration.value ~/ 60}小时${controller.autoExitDuration.value % 60}分钟\",\n                      subtitle: \"从进入直播间开始倒计时\",\n                      onTap: () {\n                        setTimer(context);\n                      },\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void setTimer(BuildContext context) async {\n    var value = await showTimePicker(\n      context: context,\n      initialTime: TimeOfDay(\n        hour: controller.autoExitDuration.value ~/ 60,\n        minute: controller.autoExitDuration.value % 60,\n      ),\n      initialEntryMode: TimePickerEntryMode.inputOnly,\n      builder: (_, child) {\n        return MediaQuery(\n          data: MediaQuery.of(context).copyWith(\n            alwaysUse24HourFormat: true,\n          ),\n          child: child!,\n        );\n      },\n    );\n    if (value == null || (value.hour == 0 && value.minute == 0)) {\n      return;\n    }\n    var duration = Duration(hours: value.hour, minutes: value.minute);\n    controller.setAutoExitDuration(duration.inMinutes);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_settings_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/widgets/settings/settings_action.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_number.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\n\nclass DanmuSettingsPage extends StatelessWidget {\n  const DanmuSettingsPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"弹幕设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: const [\n          DanmuSettingsView(),\n        ],\n      ),\n    );\n  }\n}\n\nclass DanmuSettingsView extends GetView<AppSettingsController> {\n  final Function()? onTapDanmuShield;\n  final DanmakuController? danmakuController;\n  const DanmuSettingsView({\n    this.onTapDanmuShield,\n    this.danmakuController,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.stretch,\n      children: [\n        Padding(\n          padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n          child: Text(\n            \"弹幕屏蔽\",\n            style: Get.textTheme.titleSmall,\n          ),\n        ),\n        SettingsCard(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SettingsAction(\n                title: \"关键词屏蔽\",\n                onTap: onTapDanmuShield ??\n                    () => Get.toNamed(RoutePath.kSettingsDanmuShield),\n              ),\n            ],\n          ),\n        ),\n        Padding(\n          padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n          child: Text(\n            \"弹幕设置\",\n            style: Get.textTheme.titleSmall,\n          ),\n        ),\n        SettingsCard(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Obx(\n                () => SettingsSwitch(\n                  title: \"默认开关\",\n                  value: controller.danmuEnable.value,\n                  onChanged: (e) {\n                    controller.setDanmuEnable(e);\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"显示区域\",\n                  value: (controller.danmuArea.value * 100).toInt(),\n                  min: 10,\n                  max: 100,\n                  step: 10,\n                  unit: \"%\",\n                  onChanged: (e) {\n                    controller.setDanmuArea(e / 100.0);\n                    updateDanmuOption(\n                      danmakuController?.option.copyWith(area: e / 100.0),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"不透明度\",\n                  value: (controller.danmuOpacity.value * 100).toInt(),\n                  min: 10,\n                  max: 100,\n                  step: 10,\n                  unit: \"%\",\n                  onChanged: (e) {\n                    controller.setDanmuOpacity(e / 100.0);\n                    updateDanmuOption(\n                      danmakuController?.option.copyWith(opacity: e / 100.0),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"字体大小\",\n                  value: controller.danmuSize.toInt(),\n                  min: 8,\n                  max: 48,\n                  onChanged: (e) {\n                    controller.setDanmuSize(e.toDouble());\n                    updateDanmuOption(\n                      danmakuController?.option\n                          .copyWith(fontSize: e.toDouble()),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"字体粗细\",\n                  value: controller.danmuFontWeight.value,\n                  min: 1,\n                  max: 9,\n                  step: 1,\n                  displayValue: [\n                    \"极细\",\n                    \"很细\",\n                    \"细\",\n                    \"正常\",\n                    \"小粗\",\n                    \"偏粗\",\n                    \"粗\",\n                    \"很粗\",\n                    \"极粗\"\n                  ][controller.danmuFontWeight.value - 1]\n                      .toString(),\n                  onChanged: (e) {\n                    controller.setDanmuFontWeight(e);\n                    updateDanmuOption(\n                      danmakuController?.option.copyWith(\n                        fontWeight: e,\n                      ),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"滚动速度\",\n                  subtitle: \"弹幕持续时间(秒)，越小速度越快\",\n                  value: controller.danmuSpeed.toInt(),\n                  min: 4,\n                  max: 20,\n                  onChanged: (e) {\n                    controller.setDanmuSpeed(e.toDouble());\n                    updateDanmuOption(\n                      danmakuController?.option.copyWith(duration: e.toInt()),\n                    );\n                  },\n                ),\n              ),\n              // AppStyle.divider,\n              // Obx(\n              //   () => SettingsNumber(\n              //     title: \"字体描边\",\n              //     value: controller.danmuStrokeWidth.toInt(),\n              //     min: 0,\n              //     max: 10,\n              //     onChanged: (e) {\n              //       controller.setDanmuStrokeWidth(e.toDouble());\n              //       updateDanmuOption(\n              //         danmakuController?.option\n              //             .copyWith(strokeWidth: e.toDouble()),\n              //       );\n              //     },\n              //   ),\n              // ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"顶部边距\",\n                  subtitle: \"曲面屏显示不全可设置此选项\",\n                  value: controller.danmuTopMargin.toInt(),\n                  min: 0,\n                  max: 48,\n                  step: 4,\n                  onChanged: (e) {\n                    controller.setDanmuTopMargin(e.toDouble());\n                  },\n                ),\n              ),\n              AppStyle.divider,\n              Obx(\n                () => SettingsNumber(\n                  title: \"底部边距\",\n                  subtitle: \"曲面屏显示不全可设置此选项\",\n                  value: controller.danmuBottomMargin.toInt(),\n                  min: 0,\n                  max: 48,\n                  step: 4,\n                  onChanged: (e) {\n                    controller.setDanmuBottomMargin(e.toDouble());\n                  },\n                ),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n\n  void updateDanmuOption(DanmakuOption? option) {\n    if (danmakuController == null || option == null) return;\n    danmakuController!.updateOption(option);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_controller.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\n\nclass DanmuShieldController extends BaseController {\n  final TextEditingController textEditingController = TextEditingController();\n  final AppSettingsController settingsController =\n      Get.find<AppSettingsController>();\n  void add() {\n    if (textEditingController.text.isEmpty) {\n      SmartDialog.showToast(\"请输入关键词\");\n      return;\n    }\n\n    settingsController.addShieldList(textEditingController.text.trim());\n    textEditingController.text = \"\";\n  }\n\n  void remove(String item) {\n    settingsController.removeShieldList(item);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/danmu_shield/danmu_shield_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/settings/danmu_shield/danmu_shield_controller.dart';\n\nclass DanmuShieldPage extends GetView<DanmuShieldController> {\n  const DanmuShieldPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"弹幕屏蔽\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          TextField(\n            controller: controller.textEditingController,\n            decoration: InputDecoration(\n              contentPadding: AppStyle.edgeInsetsH12,\n              border: const OutlineInputBorder(),\n              hintText: \"请输入关键词或正则表达式\",\n              suffixIcon: TextButton.icon(\n                onPressed: controller.add,\n                icon: const Icon(Icons.add),\n                label: const Text(\"添加\"),\n              ),\n            ),\n            onSubmitted: (e) {\n              controller.add();\n            },\n          ),\n          AppStyle.vGap4,\n          Text(\n            '以\"/\"开头和结尾将视作正则表达式, 如\"/\\\\d+/\"表示屏蔽所有数字',\n            style: Get.textTheme.bodySmall,\n          ),\n          AppStyle.vGap12,\n          Obx(\n            () => Text(\n              \"已添加${controller.settingsController.shieldList.length}个关键词（点击移除）\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          AppStyle.vGap12,\n          Obx(\n            () => Wrap(\n              runSpacing: 12,\n              spacing: 12,\n              children: controller.settingsController.shieldList\n                  .map(\n                    (item) => InkWell(\n                      borderRadius: AppStyle.radius24,\n                      onTap: () {\n                        controller.remove(item);\n                      },\n                      child: Container(\n                        decoration: BoxDecoration(\n                          border: Border.all(color: Colors.grey),\n                          borderRadius: AppStyle.radius24,\n                        ),\n                        padding: AppStyle.edgeInsetsH12.copyWith(\n                          top: 4,\n                          bottom: 4,\n                        ),\n                        child: Text(\n                          item,\n                          style: Get.textTheme.bodyMedium,\n                        ),\n                      ),\n                    ),\n                  )\n                  .toList(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/follow_settings_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/services/follow_service.dart';\nimport 'package:simple_live_app/widgets/settings/settings_action.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\nimport 'dart:io';\n\nclass FollowSettingsPage extends GetView<AppSettingsController> {\n  const FollowSettingsPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"关注设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          SettingsCard(\n            child: Column(\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    value: controller.autoUpdateFollowEnable.value,\n                    title: \"自动更新关注直播状态\",\n                    onChanged: (e) {\n                      controller.setAutoUpdateFollowEnable(e);\n                      FollowService.instance.initTimer();\n                    },\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: controller.autoUpdateFollowEnable.value,\n                    child: AppStyle.divider,\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: controller.autoUpdateFollowEnable.value,\n                    child: SettingsAction(\n                      title: \"自动更新间隔\",\n                      value:\n                          \"${controller.autoUpdateFollowDuration.value ~/ 60}小时${controller.autoUpdateFollowDuration.value % 60}分钟\",\n                      onTap: () {\n                        setTimer(context);\n                      },\n                    ),\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () {\n                    var threadCount = controller.updateFollowThreadCount.value;\n                    var displayValue = threadCount == 0\n                        ? \"自动 (根据 CPU 核心数)\"\n                        : \"$threadCount\";\n\n                    return SettingsAction(\n                      title: \"更新并发数\",\n                      subtitle: \"0 = 自动根据 CPU 核心数优化（推荐），或手动设置 1-20\",\n                      value: displayValue,\n                      onTap: () {\n                        showConcurrencyDialog();\n                      },\n                    );\n                  },\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void setTimer(BuildContext context) async {\n    var value = await showTimePicker(\n      context: context,\n      initialTime: TimeOfDay(\n        hour: controller.autoUpdateFollowDuration.value ~/ 60,\n        minute: controller.autoUpdateFollowDuration.value % 60,\n      ),\n      initialEntryMode: TimePickerEntryMode.inputOnly,\n      builder: (_, child) {\n        return MediaQuery(\n          data: MediaQuery.of(context).copyWith(\n            alwaysUse24HourFormat: true,\n          ),\n          child: child!,\n        );\n      },\n    );\n    if (value == null || (value.hour == 0 && value.minute == 0)) {\n      return;\n    }\n    var duration = Duration(hours: value.hour, minutes: value.minute);\n    controller.setAutoUpdateFollowDuration(duration.inMinutes);\n    FollowService.instance.initTimer();\n  }\n\n  void showConcurrencyDialog() {\n    var currentValue = controller.updateFollowThreadCount.value;\n    var cpuCount = Platform.numberOfProcessors;\n    var autoValue = (cpuCount * 2.5).round().clamp(4, 20);\n\n    Get.dialog(\n      AlertDialog(\n        title: const Text(\"设置更新并发数\"),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(\n              \"CPU 核心数: $cpuCount\",\n              style: const TextStyle(fontSize: 12, color: Colors.grey),\n            ),\n            Text(\n              \"自动推荐值: $autoValue\",\n              style: const TextStyle(fontSize: 12, color: Colors.grey),\n            ),\n            const SizedBox(height: 16),\n            const Text(\n              \"选择并发数：\",\n              style: TextStyle(fontSize: 14),\n            ),\n            const SizedBox(height: 8),\n            // 快捷选项\n            Wrap(\n              spacing: 8,\n              runSpacing: 8,\n              children: [\n                _buildQuickOption(0, \"自动 ($autoValue)\", currentValue),\n                _buildQuickOption(4, \"4\", currentValue),\n                _buildQuickOption(8, \"8\", currentValue),\n                _buildQuickOption(12, \"12\", currentValue),\n                _buildQuickOption(16, \"16\", currentValue),\n                _buildQuickOption(20, \"20\", currentValue),\n              ],\n            ),\n            const SizedBox(height: 16),\n            // 自定义输入\n            TextField(\n              keyboardType: TextInputType.number,\n              decoration: const InputDecoration(\n                labelText: \"自定义 (1-20)\",\n                border: OutlineInputBorder(),\n                hintText: \"输入 1-20 之间的数字\",\n              ),\n              onSubmitted: (value) {\n                var num = int.tryParse(value);\n                if (num != null && num >= 0 && num <= 20) {\n                  controller.setUpdateFollowThreadCount(num);\n                  Get.back();\n                }\n              },\n            ),\n          ],\n        ),\n        actions: [\n          TextButton(\n            onPressed: () => Get.back(),\n            child: const Text(\"取消\"),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildQuickOption(int value, String label, int currentValue) {\n    var isSelected = currentValue == value;\n    return ChoiceChip(\n      label: Text(label),\n      selected: isSelected,\n      onSelected: (selected) {\n        if (selected) {\n          controller.setUpdateFollowThreadCount(value);\n          Get.back();\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_controller.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\n\nclass IndexedSettingsController extends GetxController {\n  RxList<String> siteSort = RxList<String>();\n  RxList<String> homeSort = RxList<String>();\n  @override\n  void onInit() {\n    siteSort = AppSettingsController.instance.siteSort;\n    homeSort = AppSettingsController.instance.homeSort;\n    super.onInit();\n  }\n\n  void updateSiteSort(int oldIndex, int newIndex) {\n    if (oldIndex < newIndex) {\n      newIndex -= 1;\n    }\n    final String item = siteSort.removeAt(oldIndex);\n    siteSort.insert(newIndex, item);\n    // ignore: invalid_use_of_protected_member\n    AppSettingsController.instance.setSiteSort(siteSort.value);\n  }\n\n  void updateHomeSort(int oldIndex, int newIndex) {\n    if (oldIndex < newIndex) {\n      newIndex -= 1;\n    }\n    final String item = homeSort.removeAt(oldIndex);\n    homeSort.insert(newIndex, item);\n    // ignore: invalid_use_of_protected_member\n    AppSettingsController.instance.setHomeSort(homeSort.value);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/indexed_settings/indexed_settings_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/modules/settings/indexed_settings/indexed_settings_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass IndexedSettingsPage extends GetView<IndexedSettingsController> {\n  const IndexedSettingsPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"主页设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n            child: Text(\n              \"主页排序 (长按拖动排序，重启后生效)\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => ReorderableListView(\n                shrinkWrap: true,\n                physics: const NeverScrollableScrollPhysics(),\n                onReorder: controller.updateHomeSort,\n                children: controller.homeSort.map(\n                  (key) {\n                    var e = Constant.allHomePages[key]!;\n                    return ListTile(\n                      key: ValueKey(e.title),\n                      title: Text(e.title),\n                      visualDensity: VisualDensity.compact,\n                      leading: Icon(e.iconData),\n                      trailing: const Icon(Icons.drag_handle),\n                    );\n                  },\n                ).toList(),\n              ),\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"平台排序 (长按拖动排序，重启后生效)\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => ReorderableListView(\n                shrinkWrap: true,\n                physics: const NeverScrollableScrollPhysics(),\n                onReorder: controller.updateSiteSort,\n                children: controller.siteSort.map(\n                  (key) {\n                    var e = Sites.allSites[key]!;\n                    return ListTile(\n                      key: ValueKey(e.id),\n                      visualDensity: VisualDensity.compact,\n                      title: Text(e.name),\n                      leading: Image.asset(\n                        e.logo,\n                        width: 24,\n                        height: 24,\n                      ),\n                      trailing: const Icon(Icons.drag_handle),\n                    );\n                  },\n                ).toList(),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/other/other_settings_controller.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:flutter/foundation.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:share_plus/share_plus.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\n\nclass OtherSettingsController extends BaseController {\n  RxList<LogFileModel> logFiles = <LogFileModel>[].obs;\n\n  var videoOutputDrivers = {\n    \"gpu\": \"gpu\",\n    \"gpu-next\": \"gpu-next\",\n    \"xv\": \"xv (X11 only)\",\n    \"x11\": \"x11 (X11 only)\",\n    \"vdpau\": \"vdpau (X11 only)\",\n    \"direct3d\": \"direct3d (Windows only)\",\n    \"sdl\": \"sdl\",\n    \"dmabuf-wayland\": \"dmabuf-wayland\",\n    \"vaapi\": \"vaapi\",\n    \"null\": \"null\",\n    \"libmpv\": \"libmpv\",\n    \"mediacodec_embed\": \"mediacodec_embed (Android only)\",\n  };\n\n  var audioOutputDrivers = {\n    \"null\": \"null (No audio output)\",\n    \"pulse\": \"pulse (Linux, uses PulseAudio)\",\n    \"pipewire\": \"pipewire (Linux, via Pulse compatibility or native)\",\n    \"alsa\": \"alsa (Linux only)\",\n    \"oss\": \"oss (Linux only)\",\n    \"jack\": \"jack (Linux/macOS, low-latency audio)\",\n    \"directsound\": \"directsound (Windows only)\",\n    \"wasapi\": \"wasapi (Windows only)\",\n    \"winmm\": \"winmm (Windows only, legacy API)\",\n    \"audiounit\": \"audiounit (iOS only)\",\n    \"coreaudio\": \"coreaudio (macOS only)\",\n    \"opensles\": \"opensles (Android only)\",\n    \"audiotrack\": \"audiotrack (Android only)\",\n    \"aaudio\": \"aaudio (Android only)\",\n    \"pcm\": \"pcm (Cross-platform)\",\n    \"sdl\": \"sdl (Cross-platform, via SDL library)\",\n    \"openal\": \"openal (Cross-platform, OpenAL backend)\",\n    \"libao\": \"libao (Cross-platform, uses libao library)\",\n    \"auto\": \"auto (Not available)\"\n  };\n\n  var hardwareDecoder = {\n    \"no\": \"no\",\n    \"auto\": \"auto\",\n    \"auto-safe\": \"auto-safe\",\n    \"yes\": \"yes\",\n    \"auto-copy\": \"auto-copy\",\n    \"d3d11va\": \"d3d11va\",\n    \"d3d11va-copy\": \"d3d11va-copy\",\n    \"videotoolbox\": \"videotoolbox\",\n    \"videotoolbox-copy\": \"videotoolbox-copy\",\n    \"vaapi\": \"vaapi\",\n    \"vaapi-copy\": \"vaapi-copy\",\n    \"nvdec\": \"nvdec\",\n    \"nvdec-copy\": \"nvdec-copy\",\n    \"drm\": \"drm\",\n    \"drm-copy\": \"drm-copy\",\n    \"vulkan\": \"vulkan\",\n    \"vulkan-copy\": \"vulkan-copy\",\n    \"dxva2\": \"dxva2\",\n    \"dxva2-copy\": \"dxva2-copy\",\n    \"vdpau\": \"vdpau\",\n    \"vdpau-copy\": \"vdpau-copy\",\n    \"mediacodec\": \"mediacodec\",\n    \"mediacodec-copy\": \"mediacodec-copy\",\n    \"cuda\": \"cuda\",\n    \"cuda-copy\": \"cuda-copy\",\n    \"crystalhd\": \"crystalhd\",\n    \"rkmpp\": \"rkmpp\"\n  };\n\n  @override\n  void onInit() {\n    loadLogFiles();\n    super.onInit();\n  }\n\n  void setLogEnable(e) {\n    AppSettingsController.instance.setLogEnable(e);\n    if (e) {\n      Log.initWriter();\n      Future.delayed(const Duration(milliseconds: 100), () {\n        loadLogFiles();\n      });\n    } else {\n      Log.disposeWriter();\n    }\n  }\n\n  void loadLogFiles() async {\n    var supportDir = await getApplicationSupportDirectory();\n    var logDir = Directory(\"${supportDir.path}/log\");\n    if (!await logDir.exists()) {\n      await logDir.create();\n    }\n    logFiles.clear();\n    await logDir.list().forEach((element) {\n      var file = element as File;\n      var name = p.basename(file.path);\n      var time = file.lastModifiedSync();\n      var size = file.lengthSync();\n      logFiles.add(LogFileModel(name, file.path, time, size));\n    });\n    //logFiles 名称倒序\n    logFiles.sort((a, b) => b.time.compareTo(a.time));\n  }\n\n  void cleanLog() async {\n    if (AppSettingsController.instance.logEnable.value) {\n      SmartDialog.showToast(\"请先关闭日志记录\");\n      return;\n    }\n\n    var supportDir = await getApplicationSupportDirectory();\n    var logDir = Directory(\"${supportDir.path}/log\");\n    if (await logDir.exists()) {\n      await logDir.delete(recursive: true);\n    }\n    loadLogFiles();\n  }\n\n  void shareLogFile(LogFileModel item) {\n    SharePlus.instance.share(ShareParams(\n      files: [XFile(item.path)],\n    ));\n  }\n\n  void saveLogFile(LogFileModel item) async {\n    var filePath = await FilePicker.platform.saveFile(\n      allowedExtensions: ['log'],\n      type: FileType.custom,\n      fileName: item.name,\n      bytes: Uint8List(0),\n    );\n    if (filePath != null) {\n      var file = File(item.path);\n      await file.copy(filePath);\n      SmartDialog.showToast(\"保存成功\");\n    }\n  }\n\n  void exportConfig() async {\n    try {\n      // 组装数据\n      var data = {\n        \"type\": \"simple_live\",\n        \"platform\": Platform.operatingSystem,\n        \"version\": 1,\n        \"time\": DateTime.now().millisecondsSinceEpoch,\n        \"config\": LocalStorageService.instance.settingsBox.toMap(),\n        \"shield\": LocalStorageService.instance.shieldBox.toMap(),\n      };\n\n      var bytes = Uint8List.fromList(utf8.encode(jsonEncode(data)));\n\n      // FilePicker 直接写入\n      var inlineSave = Platform.isAndroid || Platform.isIOS || kIsWeb;\n\n      var path = await FilePicker.platform.saveFile(\n        allowedExtensions: ['json'],\n        type: FileType.custom,\n        fileName: \"simple_live_config.json\",\n        bytes: inlineSave ? bytes : null,\n      );\n\n      if (path == null && !kIsWeb) {\n        SmartDialog.showToast(\"保存取消\");\n        return;\n      }\n\n      // 桌面平台需要手动写入\n      if (!inlineSave && path != null) {\n        await File(path).writeAsBytes(bytes);\n      }\n\n      SmartDialog.showToast(\"保存成功\");\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"导出失败:$e\");\n    }\n  }\n\n  void importConfig() async {\n    try {\n      var file = await FilePicker.platform.pickFiles(\n        allowedExtensions: ['json'],\n        type: FileType.custom,\n      );\n      if (file == null) {\n        return;\n      }\n      var filePath = file.files.single.path!;\n      var data = jsonDecode(await File(filePath).readAsString());\n      if (data[\"type\"] != \"simple_live\") {\n        SmartDialog.showToast(\"不支持的配置文件\");\n        return;\n      }\n      // 检查platform\n      if (data[\"platform\"] != Platform.operatingSystem &&\n          !await Utils.showAlertDialog(\"导入配置文件平台不匹配,是否继续导入?\", title: \"平台不匹配\")) {\n        return;\n      }\n      LocalStorageService.instance.settingsBox.clear();\n      LocalStorageService.instance.shieldBox.clear();\n      LocalStorageService.instance.settingsBox.putAll(data[\"config\"]);\n      LocalStorageService.instance.shieldBox\n          .putAll(data[\"shield\"].cast<String, String>());\n      SmartDialog.showToast(\"导入成功,重启生效\");\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"导入失败:$e\");\n    }\n  }\n\n  void resetDefaultConfig() {\n    Utils.showAlertDialog(\"是否重置所有配置为默认值?\").then((value) {\n      if (value) {\n        LocalStorageService.instance.settingsBox.clear();\n        LocalStorageService.instance.shieldBox.clear();\n        SmartDialog.showToast(\"重置成功,重启生效\");\n      }\n    });\n  }\n}\n\nclass LogFileModel {\n  late String name;\n  late String path;\n  late DateTime time;\n  late int size;\n  LogFileModel(this.name, this.path, this.time, this.size);\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/other/other_settings_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/settings/other/other_settings_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_menu.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass OtherSettingsPage extends GetView<OtherSettingsController> {\n  const OtherSettingsPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"其他设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          SettingsCard(\n            child: Padding(\n              padding: AppStyle.edgeInsetsA4,\n              child: Row(\n                children: [\n                  Expanded(\n                    child: TextButton.icon(\n                      onPressed: controller.exportConfig,\n                      label: const Text(\"导出配置\"),\n                      icon: const Icon(Remix.export_line),\n                    ),\n                  ),\n                  Expanded(\n                    child: TextButton.icon(\n                      onPressed: controller.importConfig,\n                      label: const Text(\"导入配置\"),\n                      icon: const Icon(Remix.import_line),\n                    ),\n                  ),\n                  Expanded(\n                    child: TextButton.icon(\n                      onPressed: controller.resetDefaultConfig,\n                      label: const Text(\"重置配置\"),\n                      icon: const Icon(Remix.restart_line),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"播放器高级设置\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n            child: Text.rich(\n              TextSpan(\n                text: \"请勿随意修改以下设置，除非你知道自己在做什么。\\n在修改以下设置前，你应该先查阅\",\n                children: [\n                  WidgetSpan(\n                    child: GestureDetector(\n                      onTap: () {\n                        launchUrlString(\n                            \"https://mpv.io/manual/stable/#video-output-drivers\");\n                      },\n                      child: const Text(\n                        \"MPV的文档\",\n                        style: TextStyle(\n                          color: Colors.blue,\n                          fontSize: 12,\n                          decoration: TextDecoration.underline,\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n              style: const TextStyle(fontSize: 12, color: Colors.grey),\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    value:\n                        AppSettingsController.instance.customPlayerOutput.value,\n                    title: \"自定义输出驱动与硬件加速\",\n                    onChanged: (e) {\n                      AppSettingsController.instance.setCustomPlayerOutput(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsMenu(\n                    title: \"视频输出驱动(--vo)\",\n                    value:\n                        AppSettingsController.instance.videoOutputDriver.value,\n                    valueMap: controller.videoOutputDrivers,\n                    onChanged: (e) {\n                      AppSettingsController.instance.setVideoOutputDriver(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsMenu(\n                    title: \"音频输出驱动(--ao)\",\n                    value:\n                        AppSettingsController.instance.audioOutputDriver.value,\n                    valueMap: controller.audioOutputDrivers,\n                    onChanged: (e) {\n                      AppSettingsController.instance.setAudioOutputDriver(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsMenu(\n                    title: \"硬件解码器(--hwdec)\",\n                    value: AppSettingsController\n                        .instance.videoHardwareDecoder.value,\n                    valueMap: controller.hardwareDecoder,\n                    onChanged: (e) {\n                      AppSettingsController.instance.setVideoHardwareDecoder(e);\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"日志记录\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    value: AppSettingsController.instance.logEnable.value,\n                    title: \"开启日志记录\",\n                    subtitle: \"开启后将记录调试日志，可以将日志文件提供给开发者用于排查问题\",\n                    onChanged: controller.setLogEnable,\n                  ),\n                ),\n              ],\n            ),\n          ),\n          ListTile(\n            contentPadding: AppStyle.edgeInsetsL12,\n            visualDensity: VisualDensity.compact,\n            title: Text(\n              \"日志列表\",\n              style: Get.textTheme.titleSmall,\n            ),\n            trailing: TextButton.icon(\n              onPressed: () {\n                controller.cleanLog();\n              },\n              label: const Text(\"清空日志\"),\n              icon: const Icon(Icons.clear_all),\n            ),\n          ),\n          SettingsCard(\n            child: SizedBox(\n              height: 300,\n              child: Obx(\n                () => ListView.separated(\n                  itemCount: controller.logFiles.length,\n                  separatorBuilder: (context, index) => AppStyle.divider,\n                  itemBuilder: (context, index) {\n                    var item = controller.logFiles[index];\n                    return ListTile(\n                      visualDensity: VisualDensity.compact,\n                      contentPadding: AppStyle.edgeInsetsL12.copyWith(right: 4),\n                      title: Text(item.name),\n                      subtitle: Text(Utils.parseFileSize(item.size)),\n                      trailing: Row(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          if (!Platform.isLinux)\n                            IconButton(\n                              onPressed: () {\n                                controller.shareLogFile(item);\n                              },\n                              icon: const Icon(Icons.share),\n                            ),\n                          IconButton(\n                            onPressed: () {\n                              controller.saveLogFile(item);\n                            },\n                            icon: const Icon(Icons.save),\n                          ),\n                        ],\n                      ),\n                    );\n                  },\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/settings/play_settings_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\nimport 'package:simple_live_app/widgets/settings/settings_menu.dart';\nimport 'package:simple_live_app/widgets/settings/settings_number.dart';\nimport 'package:simple_live_app/widgets/settings/settings_switch.dart';\n\nclass PlaySettingsPage extends GetView<AppSettingsController> {\n  const PlaySettingsPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"直播间设置\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n            child: Text(\n              \"播放器\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"硬件解码\",\n                    value: controller.hardwareDecode.value,\n                    subtitle: \"播放失败可尝试关闭此选项\",\n                    onChanged: (e) {\n                      controller.setHardwareDecode(e);\n                    },\n                  ),\n                ),\n                if (Platform.isAndroid) AppStyle.divider,\n                Obx(\n                  () => Visibility(\n                    visible: Platform.isAndroid,\n                    child: SettingsSwitch(\n                      title: \"兼容模式\",\n                      subtitle: \"若播放卡顿可尝试打开此选项\",\n                      value: controller.playerCompatMode.value,\n                      onChanged: (e) {\n                        controller.setPlayerCompatMode(e);\n                      },\n                    ),\n                  ),\n                ),\n                // AppStyle.divider,\n                // Obx(\n                //   () => SettingsNumber(\n                //     title: \"缓冲区大小\",\n                //     subtitle: \"若播放卡顿可尝试调高此选项\",\n                //     value: controller.playerBufferSize.value,\n                //     min: 32,\n                //     max: 1024,\n                //     step: 4,\n                //     unit: \"MB\",\n                //     onChanged: (e) {\n                //       controller.setPlayerBufferSize(e);\n                //     },\n                //   ),\n                // ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"进入后台自动暂停\",\n                    value: controller.playerAutoPause.value,\n                    onChanged: (e) {\n                      controller.setPlayerAutoPause(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsMenu<int>(\n                    title: \"画面尺寸\",\n                    value: controller.scaleMode.value,\n                    valueMap: const {\n                      0: \"适应\",\n                      1: \"拉伸\",\n                      2: \"铺满\",\n                      3: \"16:9\",\n                      4: \"4:3\",\n                    },\n                    onChanged: (e) {\n                      controller.setScaleMode(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"使用HTTPS链接\",\n                    subtitle: \"将http链接替换为https\",\n                    value: controller.playerForceHttps.value,\n                    onChanged: (e) {\n                      controller.setPlayerForceHttps(e);\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"直播间\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"进入直播间自动全屏\",\n                    value: controller.autoFullScreen.value,\n                    onChanged: (e) {\n                      controller.setAutoFullScreen(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => Visibility(\n                    visible: Platform.isAndroid,\n                    child: SettingsSwitch(\n                      title: \"进入小窗隐藏弹幕\",\n                      value: controller.pipHideDanmu.value,\n                      onChanged: (e) {\n                        controller.setPIPHideDanmu(e);\n                      },\n                    ),\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"播放器中显示SC\",\n                    value: controller.playershowSuperChat.value,\n                    onChanged: (e) {\n                      controller.setPlayerShowSuperChat(e);\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"清晰度\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              children: [\n                Obx(\n                  () => SettingsMenu<int>(\n                    title: \"默认清晰度\",\n                    value: controller.qualityLevel.value,\n                    valueMap: const {\n                      0: \"最低\",\n                      1: \"中等\",\n                      2: \"最高\",\n                    },\n                    onChanged: (e) {\n                      controller.setQualityLevel(e);\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsMenu<int>(\n                    title: \"数据网络清晰度\",\n                    value: controller.qualityLevelCellular.value,\n                    valueMap: const {\n                      0: \"最低\",\n                      1: \"中等\",\n                      2: \"最高\",\n                    },\n                    onChanged: (e) {\n                      controller.setQualityLevelCellular(e);\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"聊天区\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Obx(\n                  () => SettingsNumber(\n                    title: \"文字大小\",\n                    value: controller.chatTextSize.value.toInt(),\n                    min: 8,\n                    max: 36,\n                    onChanged: (e) {\n                      controller.setChatTextSize(e.toDouble());\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsNumber(\n                    title: \"上下间隔\",\n                    value: controller.chatTextGap.value.toInt(),\n                    min: 0,\n                    max: 12,\n                    onChanged: (e) {\n                      controller.setChatTextGap(e.toDouble());\n                    },\n                  ),\n                ),\n                AppStyle.divider,\n                Obx(\n                  () => SettingsSwitch(\n                    title: \"气泡样式\",\n                    value: controller.chatBubbleStyle.value,\n                    onChanged: (e) {\n                      controller.setChatBubbleStyle(e);\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/device/sync_device_controller.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/sync_client_info_model.dart';\nimport 'package:simple_live_app/requests/sync_client_request.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/sync_service.dart';\n\nclass SyncDeviceController extends BaseController {\n  final SyncClinet client;\n  final SyncClientInfoModel info;\n  SyncDeviceController({required this.client, required this.info});\n  SyncClientRequest request = SyncClientRequest();\n\n  Future<bool> showOverlayDialog() async {\n    var overlay = await Utils.showAlertDialog(\n      \"是否覆盖远端数据？\",\n      title: \"数据覆盖\",\n      confirm: \"覆盖\",\n      cancel: \"不覆盖\",\n    );\n    return overlay;\n  }\n\n  void syncFollowAndTag() async {\n    try {\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"同步中...\");\n      var users = DBService.instance.getFollowList();\n      var tags = DBService.instance.getFollowTagList();\n      var data = json.encode(users.map((e) => e.toJson()).toList());\n      var dataT = json.encode(tags.map((e) => e.toJson()).toList());\n      await request.syncFollow(client, data, overlay: overlay);\n      // 标签和关注必须同时同步\n      await request.syncTag(client, dataT, overlay: overlay);\n      SmartDialog.showToast(\"已同步关注列表和标签\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncHistory() async {\n    try {\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"同步中...\");\n      var histores = DBService.instance.getHistores();\n      var data = json.encode(histores.map((e) => e.toJson()).toList());\n      await request.syncHistory(client, data, overlay: overlay);\n      SmartDialog.showToast(\"已同步历史记录\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncBlockedWord() async {\n    try {\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"同步中...\");\n      var shieldList = AppSettingsController.instance.shieldList;\n      var data = json.encode(shieldList.toList());\n      await request.syncBlockedWord(client, data, overlay: overlay);\n      SmartDialog.showToast(\"已同步屏蔽词\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncBiliAccount() async {\n    try {\n      if (!BiliBiliAccountService.instance.logined.value) {\n        SmartDialog.showToast(\"未登录哔哩哔哩\");\n        return;\n      }\n      SmartDialog.showLoading(msg: \"同步中...\");\n\n      await request.syncBiliAccount(\n          client, BiliBiliAccountService.instance.cookie);\n      SmartDialog.showToast(\"已同步哔哩哔哩账号\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/device/sync_device_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/device/sync_device_controller.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass SyncDevicePage extends GetView<SyncDeviceController> {\n  const SyncDevicePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"同步\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n        children: [\n          SettingsCard(\n            child: ListTile(\n              leading: buildIcon(),\n              title: Text(controller.info.name),\n              subtitle: Text(\n                  \"${controller.info.type.toUpperCase()}   ${controller.info.address}\"),\n            ),\n          ),\n          AppStyle.vGap12,\n          SettingsCard(\n            child: Column(\n              children: [\n                ListTile(\n                  leading: const Icon(Remix.heart_line),\n                  title: const Text(\"同步关注列表\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncFollowAndTag();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Icons.history),\n                  title: const Text(\"同步观看记录\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncHistory();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Remix.shield_keyhole_line),\n                  title: const Text(\"同步弹幕屏蔽词\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncBlockedWord();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Remix.account_circle_line),\n                  title: const Text(\"同步哔哩哔哩账号\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncBiliAccount();\n                  },\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildIcon() {\n    var icon = controller.info.type.toLowerCase();\n\n    if (icon == \"android\") {\n      return const Icon(Remix.android_line);\n    } else if (icon == \"ios\") {\n      return const Icon(Remix.apple_line);\n    } else if (icon == \"tv\") {\n      return const Icon(Remix.tv_2_line);\n    } else if (icon == \"windows\") {\n      return const Icon(Remix.microsoft_fill);\n    } else if (icon == \"macos\") {\n      return const Icon(Remix.mac_line);\n    } else if (icon == \"linux\") {\n      return const Icon(Remix.ubuntu_line);\n    } else {\n      return const Icon(Remix.device_line);\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/local_sync_controller.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/requests/sync_client_request.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\n\nimport 'package:simple_live_app/services/sync_service.dart';\n\nclass LocalSyncController extends BaseController {\n  final String? address;\n  LocalSyncController(this.address);\n\n  @override\n  void onInit() {\n    SyncService.instance.refreshClients();\n    Future.delayed(Duration.zero, initConnect);\n    super.onInit();\n  }\n\n  void initConnect() {\n    if (address != null && address!.isNotEmpty) {\n      addressController.text = address!;\n      connect();\n    }\n  }\n\n  TextEditingController addressController = TextEditingController();\n  SyncClientRequest request = SyncClientRequest();\n\n  void connect() async {\n    var address = addressController.text;\n    if (address.isEmpty) {\n      SmartDialog.showToast(\"请输入地址\");\n      return;\n    }\n    if (address.startsWith('http')) {\n      var uri = Uri.tryParse(address);\n      if (uri != null) {\n        address = uri.host;\n      }\n    } else if (address.contains(':')) {\n      var parts = address.split(\":\");\n      address = parts.first;\n    }\n\n    var client = SyncClinet(\n      id: 'manual',\n      address: address,\n      port: SyncService.httpPort,\n      name: \"手动输入\",\n      type: Platform.operatingSystem,\n    );\n    connectClient(client);\n  }\n\n  void connectClient(SyncClinet client) async {\n    try {\n      SmartDialog.showLoading(msg: \"连接中...\");\n      var info = await request.getClientInfo(client);\n      AppNavigator.toSyncDevice(client, info);\n    } catch (e) {\n      SmartDialog.showToast(\"连接失败:$e\");\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void toScanQr() async {\n    var result = await Get.toNamed(RoutePath.kSyncScan);\n    if (result == null || result.isEmpty) {\n      return;\n    }\n    var addressList = (result as String).split(\";\");\n    if (addressList.length >= 2) {\n      //弹窗选择\n      showPickerAddress(addressList);\n    } else {\n      addressController.text = result;\n      //connect();\n    }\n  }\n\n  void showPickerAddress(List<String> addressList) {\n    SmartDialog.showToast(\"扫描到多个地址，请选择一个连接\");\n    Utils.showBottomSheet(\n      title: '请选择地址',\n      child: ListView.builder(\n        itemBuilder: (_, i) {\n          return ListTile(\n            title: Text(addressList[i]),\n            onTap: () {\n              Get.back();\n              addressController.text = addressList[i];\n              // connect();\n            },\n          );\n        },\n        itemCount: addressList.length,\n      ),\n    );\n  }\n\n  void showInfo() {\n    Utils.showBottomSheet(\n      title: \"本机信息\",\n      child: Column(\n        children: [\n          Visibility(\n            visible: SyncService.instance.httpRunning.value,\n            child: GestureDetector(\n              onTap: () {\n                Get.back();\n              },\n              child: QrImageView(\n                data: SyncService.instance.ipAddress.value,\n                version: QrVersions.auto,\n                backgroundColor: Colors.white,\n                padding: AppStyle.edgeInsetsA12,\n                size: 200,\n              ),\n            ),\n          ),\n          AppStyle.vGap24,\n          Visibility(\n            visible: SyncService.instance.httpRunning.value,\n            child: Text(\n              '服务已启动：${SyncService.instance.ipAddress.value.split(';').map((e) => '$e:${SyncService.httpPort}').join('；')}',\n              textAlign: TextAlign.center,\n            ),\n          ),\n          Visibility(\n            visible: !SyncService.instance.httpRunning.value,\n            child: Text(\n              'HTTP服务未启动：${SyncService.instance.httpErrorMsg}，请尝试重启应用',\n              textAlign: TextAlign.center,\n            ),\n          ),\n          AppStyle.vGap12,\n          Visibility(\n            visible: SyncService.instance.httpRunning.value,\n            child: const Text(\n              \"请使用其他Simple Live客户端扫描上方二维码\\n建立连接后可选择需要同步的数据\",\n              textAlign: TextAlign.center,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/local_sync_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/local_sync_controller.dart';\nimport 'package:simple_live_app/services/sync_service.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass LocalSyncPage extends GetView<LocalSyncController> {\n  const LocalSyncPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('局域网数据同步'),\n        actions: [\n          TextButton.icon(\n            onPressed: controller.showInfo,\n            icon: const Icon(Icons.qr_code),\n            label: const Text(\"信息\"),\n          ),\n        ],\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          SettingsCard(\n            child: Padding(\n              padding: AppStyle.edgeInsetsA12,\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.stretch,\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  TextField(\n                    controller: controller.addressController,\n                    onSubmitted: (e) {\n                      controller.connect();\n                    },\n                    decoration: InputDecoration(\n                      labelText: '客户端地址',\n                      hintText: '请输入地址或扫码自动填写',\n                      contentPadding: AppStyle.edgeInsetsH12,\n                      border: const OutlineInputBorder(),\n                      suffixIcon: Visibility(\n                        visible: Platform.isAndroid || Platform.isIOS,\n                        child: TextButton.icon(\n                          onPressed: controller.toScanQr,\n                          icon: const Icon(Remix.qr_scan_line),\n                          label: const Text(\"扫一扫\"),\n                        ),\n                      ),\n                    ),\n                  ),\n                  AppStyle.vGap12,\n                  ElevatedButton(\n                    onPressed: () {\n                      controller.connect();\n                    },\n                    child: const Text(\"连接\"),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          AppStyle.vGap12,\n          ListTile(\n            title: Obx(\n              () => Text(\n                \"已发现设备(${SyncService.instance.scanClients.length})\",\n                style: Get.textTheme.titleSmall,\n              ),\n            ),\n            visualDensity: VisualDensity.compact,\n            contentPadding: AppStyle.edgeInsetsH12,\n            trailing: IconButton(\n              visualDensity: VisualDensity.compact,\n              onPressed: () {\n                SyncService.instance.refreshClients();\n              },\n              icon: const Icon(Icons.refresh),\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => ListView.separated(\n                shrinkWrap: true,\n                padding: EdgeInsets.zero,\n                physics: const NeverScrollableScrollPhysics(),\n                separatorBuilder: (BuildContext context, int index) =>\n                    AppStyle.divider,\n                itemCount: SyncService.instance.scanClients.length,\n                itemBuilder: (BuildContext context, int index) {\n                  var client = SyncService.instance.scanClients[index];\n                  return ListTile(\n                    title: Text(client.name),\n                    subtitle: Text(client.address),\n                    trailing: const Icon(Icons.chevron_right),\n                    onTap: () {\n                      controller.connectClient(client);\n                    },\n                  );\n                },\n              ),\n            ),\n          ),\n          AppStyle.vGap12,\n          const Text(\n            \"如果无法扫描到设备，请手动输入地址\",\n            textAlign: TextAlign.center,\n            style: TextStyle(\n              color: Colors.grey,\n              fontSize: 14,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\n\nclass SyncScanQRControlelr extends BaseController {\n  final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');\n  QRViewController? qrController;\n  StreamSubscription<Barcode>? barcodeStreamSubscription;\n  bool pause = false;\n  void onQRViewCreated(QRViewController controller) {\n    qrController = controller;\n    barcodeStreamSubscription =\n        qrController!.scannedDataStream.listen((scanData) async {\n      Log.d(scanData.toString());\n      if (pause) {\n        return;\n      }\n      pause = true;\n      // 扫码成功后暂停摄像头\n      await controller.pauseCamera();\n      var code = scanData.code ?? \"\";\n      // 处理扫码结果\n      if (code.isEmpty) {\n        pause = false;\n        await controller.resumeCamera();\n        return;\n      }\n\n      // 如果是5位字符串，为房间号\n      if (code.length == 5) {\n        Get.offAndToNamed(RoutePath.kRemoteSyncRoom, arguments: code);\n        return;\n      } else {\n        var addressList = code.split(\";\");\n        if (addressList.length >= 2) {\n          //弹窗选择\n          showPickerAddress(addressList);\n        } else {\n          Get.back(result: code);\n        }\n      }\n    });\n  }\n\n  void showPickerAddress(List<String> addressList) async {\n    SmartDialog.showToast(\"扫描到多个地址，请选择一个连接\");\n    var address = await Utils.showBottomSheet(\n      title: '请选择地址',\n      child: ListView.builder(\n        itemBuilder: (_, i) {\n          return ListTile(\n            title: Text(addressList[i]),\n            onTap: () {\n              Get.back(result: addressList[i]);\n            },\n          );\n        },\n        itemCount: addressList.length,\n      ),\n    );\n    if (address != null && address.isNotEmpty) {\n      Get.back(result: address);\n    }\n  }\n\n  @override\n  void onClose() {\n    barcodeStreamSubscription?.cancel();\n\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/local_sync/scan_qr/sync_scan_qr_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/scan_qr/sync_scan_qr_controller.dart';\n\nclass SyncScanQRPage extends GetView<SyncScanQRControlelr> {\n  const SyncScanQRPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('扫描二维码'),\n        actions: [\n          IconButton(\n            onPressed: () {\n              controller.qrController?.toggleFlash();\n            },\n            icon: const Icon(Icons.flash_on),\n          ),\n          // 反转摄像头\n          IconButton(\n            onPressed: () {\n              controller.qrController?.flipCamera();\n            },\n            icon: const Icon(Icons.flip_camera_android),\n          ),\n        ],\n      ),\n      body: Stack(\n        children: [\n          QRView(\n            key: controller.qrKey,\n            onQRViewCreated: controller.onQRViewCreated,\n          ),\n          const ScanRectangle(),\n        ],\n      ),\n    );\n  }\n}\n\nclass ScanRectangle extends StatefulWidget {\n  const ScanRectangle({super.key});\n\n  @override\n  State<ScanRectangle> createState() => _ScanRectangleState();\n}\n\nclass _ScanRectangleState extends State<ScanRectangle>\n    with SingleTickerProviderStateMixin {\n  late AnimationController animeController;\n  late Animation<Offset> animation;\n\n  @override\n  void initState() {\n    animeController =\n        AnimationController(duration: const Duration(seconds: 2), vsync: this);\n    animeController.addStatusListener((status) {\n      if (status == AnimationStatus.completed) {\n        animeController.reverse();\n      } else if (status == AnimationStatus.dismissed) {\n        animeController.forward();\n      }\n    });\n    animation = Tween(\n      begin: const Offset(0, 0),\n      end: const Offset(0, 1),\n    ).animate(animeController);\n    animeController.forward();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: Container(\n        height: 240,\n        width: 240,\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Colors.grey.withAlpha(50),\n            width: 2,\n          ),\n        ),\n        child: SlideTransition(\n          position: animation,\n          child: Container(\n            height: 240,\n            width: 240,\n            decoration: const BoxDecoration(\n              border: Border(\n                top: BorderSide(\n                  width: 2,\n                  color: Colors.green,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  void dispose() {\n    animeController.dispose();\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_controller.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/signalr_service.dart';\n\nclass RemoteSyncRoomController extends BaseController {\n  final String roomId;\n  final SignalRService signalR = SignalRService();\n  RemoteSyncRoomController(this.roomId) {\n    if (roomId.isNotEmpty) {\n      currentRoomId.value = roomId;\n    }\n  }\n  StreamSubscription? _roomDestroyedSubscription;\n  StreamSubscription? _roomUserUpdatedSubscription;\n  StreamSubscription? _onFavoriteSubscription;\n  StreamSubscription? _onHistorySubscription;\n  StreamSubscription? _onShieldWordSubscription;\n  StreamSubscription? _onBiliAccountSubscription;\n  var currentRoomId = \"--\".obs;\n  RxList<RoomUser> roomUsers = <RoomUser>[].obs;\n\n  Timer? _timer;\n  var countDown = 600.obs;\n\n  @override\n  void onInit() {\n    connect();\n    super.onInit();\n  }\n\n  void connect() async {\n    listenSignalR();\n    await signalR.connect();\n    if (signalR.state == SignalRConnectionState.connected) {\n      if (roomId.isEmpty) {\n        createRoom();\n      } else {\n        joinRoom(roomId);\n      }\n    }\n  }\n\n  void createRoom() async {\n    try {\n      var resp = await signalR.createRoom();\n      if (resp.isSuccess) {\n        currentRoomId.value = resp.data!;\n        _startTimer();\n      } else {\n        SmartDialog.showToast(resp.message);\n        Get.back();\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"创建房间失败\");\n      Get.back();\n    }\n  }\n\n  void _startTimer() {\n    // 倒计时5分钟，自动关闭页面\n    countDown.value = 600;\n    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {\n      countDown--;\n      if (countDown <= 0) {\n        timer.cancel();\n        Get.back();\n      }\n    });\n  }\n\n  void joinRoom(String roomId) async {\n    try {\n      var resp = await signalR.joinRoom(roomId);\n      if (!resp.isSuccess) {\n        SmartDialog.showToast(resp.message);\n        Get.back();\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"加入房间失败\");\n      Get.back();\n    }\n  }\n\n  void listenSignalR() {\n    _roomDestroyedSubscription = signalR.onRoomDestroyedStream.listen((roomId) {\n      SmartDialog.showToast(\"房间已被销毁\");\n      Get.back();\n    });\n    _roomUserUpdatedSubscription = signalR.onRoomUserUpdatedStream.listen(\n      (roomUsers) {\n        this.roomUsers.assignAll(roomUsers);\n      },\n    );\n    _onFavoriteSubscription = signalR.onFavoriteStream.listen((data) {\n      onReceiveFavorite(data.$1, data.$2);\n    });\n    _onHistorySubscription = signalR.onHistoryStream.listen((data) {\n      onReceiveHistory(data.$1, data.$2);\n    });\n    _onShieldWordSubscription = signalR.onShieldWordStream.listen((data) {\n      onReceiveShieldWord(data.$1, data.$2);\n    });\n    _onBiliAccountSubscription = signalR.onBiliAccountStream.listen((data) {\n      onReceiveBiliAccount(data.$1, data.$2);\n    });\n  }\n\n  void onReceiveFavorite(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        await DBService.instance.followBox.clear();\n      }\n      for (var item in jsonBody) {\n        var user = FollowUser.fromJson(item);\n        await DBService.instance.followBox.put(user.id, user);\n      }\n      SmartDialog.showToast('已同步关注用户列表');\n      EventBus.instance.emit(Constant.kUpdateFollow, 0);\n      SmartDialog.showToast(\"已同步关注列表\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveHistory(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        await DBService.instance.historyBox.clear();\n      }\n      for (var item in jsonBody) {\n        var history = History.fromJson(item);\n        if (DBService.instance.historyBox.containsKey(history.id)) {\n          var old = DBService.instance.historyBox.get(history.id);\n          //如果本地的更新时间比较新，就不更新\n          if (old!.updateTime.isAfter(history.updateTime)) {\n            continue;\n          }\n        }\n        await DBService.instance.addOrUpdateHistory(history);\n      }\n      SmartDialog.showToast('已同步历史记录');\n      EventBus.instance.emit(Constant.kUpdateHistory, 0);\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveShieldWord(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        AppSettingsController.instance.clearShieldList();\n      }\n      for (var item in jsonBody) {\n        // add to Hive\n        AppSettingsController.instance.addShieldList(item);\n      }\n      SmartDialog.showToast('已同步屏蔽词');\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveBiliAccount(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      var cookie = jsonBody['cookie'];\n      BiliBiliAccountService.instance.setCookie(cookie);\n      BiliBiliAccountService.instance.loadUserInfo();\n      SmartDialog.showToast('已同步哔哩哔哩账号');\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  Future<bool> showOverlayDialog() async {\n    var overlay = await Utils.showAlertDialog(\n      \"是否覆盖远端数据？\",\n      title: \"数据覆盖\",\n      confirm: \"覆盖\",\n      cancel: \"不覆盖\",\n    );\n    return overlay;\n  }\n\n  void syncFollow() async {\n    try {\n      if (roomUsers.length <= 1) {\n        SmartDialog.showToast(\"无设备连接\");\n        return;\n      }\n\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"发送中...\");\n      var users = DBService.instance.getFollowList();\n      var data = json.encode(users.map((e) => e.toJson()).toList());\n\n      var resp = await signalR.sendContent(\n        roomName: currentRoomId.value,\n        action: \"SendFavorite\",\n        overlay: overlay,\n        content: data,\n      );\n      if (resp.isSuccess) {\n        SmartDialog.showToast(\"已发送关注列表\");\n      } else {\n        SmartDialog.showToast(\"发送失败:${resp.message}\");\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"发送失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncHistory() async {\n    try {\n      if (roomUsers.length <= 1) {\n        SmartDialog.showToast(\"无设备连接\");\n        return;\n      }\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"发送中...\");\n      var histores = DBService.instance.getHistores();\n      var data = json.encode(histores.map((e) => e.toJson()).toList());\n      var resp = await signalR.sendContent(\n        roomName: currentRoomId.value,\n        action: \"SendHistory\",\n        overlay: overlay,\n        content: data,\n      );\n      if (resp.isSuccess) {\n        SmartDialog.showToast(\"已发送历史记录\");\n      } else {\n        SmartDialog.showToast(\"发送失败:${resp.message}\");\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"发送失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncBlockedWord() async {\n    try {\n      if (roomUsers.length <= 1) {\n        SmartDialog.showToast(\"无设备连接\");\n        return;\n      }\n      var overlay = await showOverlayDialog();\n      SmartDialog.showLoading(msg: \"发送中...\");\n      var shieldList = AppSettingsController.instance.shieldList;\n      var data = json.encode(shieldList.toList());\n\n      var resp = await signalR.sendContent(\n        roomName: currentRoomId.value,\n        action: \"SendShieldWord\",\n        overlay: overlay,\n        content: data,\n      );\n      if (resp.isSuccess) {\n        SmartDialog.showToast(\"已发送屏蔽词\");\n      } else {\n        SmartDialog.showToast(\"发送失败:${resp.message}\");\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"发送失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void syncBiliAccount() async {\n    try {\n      if (roomUsers.length <= 1) {\n        SmartDialog.showToast(\"无设备连接\");\n        return;\n      }\n      if (!BiliBiliAccountService.instance.logined.value) {\n        SmartDialog.showToast(\"未登录哔哩哔哩\");\n        return;\n      }\n      SmartDialog.showLoading(msg: \"发送中...\");\n\n      var resp = await signalR.sendContent(\n        roomName: currentRoomId.value,\n        action: \"SendBiliAccount\",\n        overlay: true,\n        content: json.encode({\n          \"cookie\": BiliBiliAccountService.instance.cookie,\n        }),\n      );\n      if (resp.isSuccess) {\n        SmartDialog.showToast(\"已发送哔哩哔哩账号\");\n      } else {\n        SmartDialog.showToast(\"发送失败:${resp.message}\");\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    } finally {\n      SmartDialog.dismiss();\n    }\n  }\n\n  void showQRInfo() {\n    Utils.showBottomSheet(\n      title: \"房间信息\",\n      child: Column(\n        children: [\n          QrImageView(\n            data: currentRoomId.value,\n            version: QrVersions.auto,\n            backgroundColor: Colors.white,\n            padding: AppStyle.edgeInsetsA12,\n            size: 200,\n          ),\n          AppStyle.vGap24,\n          Text(\n            currentRoomId.value,\n            textAlign: TextAlign.center,\n            style: Get.textTheme.titleLarge,\n          ),\n          const Text(\n            \"请使用其他Simple Live客户端扫描上方二维码\\n建立连接后可选择需要同步的数据\",\n            textAlign: TextAlign.center,\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  void onClose() {\n    _timer?.cancel();\n    _roomDestroyedSubscription?.cancel();\n    _roomUserUpdatedSubscription?.cancel();\n    _onFavoriteSubscription?.cancel();\n    _onHistorySubscription?.cancel();\n    _onShieldWordSubscription?.cancel();\n    _onBiliAccountSubscription?.cancel();\n    signalR.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/room/remote_sync_room_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/room/remote_sync_room_controller.dart';\nimport 'package:simple_live_app/services/signalr_service.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass RemoteSyncRoomPage extends GetView<RemoteSyncRoomController> {\n  const RemoteSyncRoomPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"数据同步\"),\n        actions: [\n          Padding(\n            padding: AppStyle.edgeInsetsH12,\n            child: StreamBuilder<SignalRConnectionState>(\n              stream: controller.signalR.stateStream,\n              builder: (context, snapshot) {\n                if (snapshot.hasData) {\n                  switch (snapshot.data) {\n                    case SignalRConnectionState.connected:\n                      return Row(\n                        children: [\n                          Container(\n                            width: 8,\n                            height: 8,\n                            decoration: const BoxDecoration(\n                              color: Colors.green,\n                              shape: BoxShape.circle,\n                            ),\n                          ),\n                          AppStyle.hGap8,\n                          const Text(\n                            '已连接',\n                            style: TextStyle(\n                              fontSize: 14,\n                            ),\n                          ),\n                        ],\n                      );\n                    case SignalRConnectionState.disconnected:\n                      return Row(\n                        children: [\n                          Container(\n                            width: 8,\n                            height: 8,\n                            decoration: const BoxDecoration(\n                              color: Colors.red,\n                              shape: BoxShape.circle,\n                            ),\n                          ),\n                          AppStyle.hGap8,\n                          const Text(\n                            '断开连接',\n                            style: TextStyle(\n                              fontSize: 14,\n                            ),\n                          ),\n                        ],\n                      );\n                    default:\n                      return const Row(\n                        children: [\n                          SizedBox(\n                            width: 16,\n                            height: 16,\n                            child: CircularProgressIndicator(\n                              strokeWidth: 2,\n                            ),\n                          ),\n                          Text(\n                            '连接中',\n                            style: TextStyle(\n                              fontSize: 14,\n                            ),\n                          ),\n                        ],\n                      );\n                  }\n                }\n                return const SizedBox();\n              },\n            ),\n          ),\n        ],\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n        children: [\n          Visibility(\n            visible: controller.roomId.isEmpty,\n            child: SettingsCard(\n              child: ListTile(\n                visualDensity: VisualDensity.compact,\n                leading: const Icon(Remix.timer_line),\n                title: Obx(\n                  () => Text(\n                    \"${controller.countDown.value}秒后房间将会自动关闭\",\n                    style: const TextStyle(fontSize: 14),\n                  ),\n                ),\n              ),\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12,\n            child: Text(\n              \"房间号\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => ListTile(\n                contentPadding: AppStyle.edgeInsetsL12,\n                title: SelectableText(\n                  controller.currentRoomId.value,\n                  style: Theme.of(context).textTheme.titleLarge,\n                ),\n                trailing: Row(\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    IconButton(\n                      icon: const Icon(\n                        Icons.copy,\n                        size: 20,\n                      ),\n                      onPressed: () {\n                        Utils.copyToClipboard(controller.currentRoomId.value);\n                      },\n                    ),\n                    IconButton(\n                      icon: const Icon(\n                        Icons.qr_code,\n                        size: 20,\n                      ),\n                      onPressed: () {\n                        controller.showQRInfo();\n                      },\n                    ),\n                    AppStyle.hGap4,\n                  ],\n                ),\n              ),\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 12),\n            child: Text(\n              \"同步数据至其他设备\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                ListTile(\n                  leading: const Icon(Remix.heart_line),\n                  title: const Text(\"发送关注列表\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncFollow();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Icons.history),\n                  title: const Text(\"发送观看记录\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncHistory();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Remix.shield_keyhole_line),\n                  title: const Text(\"发送弹幕屏蔽词\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncBlockedWord();\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  leading: const Icon(Remix.account_circle_line),\n                  title: const Text(\"发送哔哩哔哩账号\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    controller.syncBiliAccount();\n                  },\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 12),\n            child: Text(\n              \"已连接设备\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Obx(\n              () => ListView.separated(\n                padding: EdgeInsets.zero,\n                itemCount: controller.roomUsers.length,\n                shrinkWrap: true,\n                separatorBuilder: (context, index) => AppStyle.divider,\n                physics: const NeverScrollableScrollPhysics(),\n                itemBuilder: (BuildContext context, int index) {\n                  var user = controller.roomUsers[index];\n                  return ListTile(\n                    visualDensity: VisualDensity.compact,\n                    leading: SizedBox(\n                      width: 48,\n                      height: 48,\n                      child: Center(\n                        child: buildIcon(user.platform),\n                      ),\n                    ),\n                    title: Text.rich(\n                      TextSpan(\n                        text: user.shortId,\n                        style: const TextStyle(fontSize: 16),\n                        children: user.isCreator!\n                            ? [\n                                WidgetSpan(\n                                  child: Container(\n                                    margin: AppStyle.edgeInsetsL4,\n                                    padding: AppStyle.edgeInsetsH4,\n                                    decoration: BoxDecoration(\n                                      border: Border.all(color: Colors.blue),\n                                      borderRadius: BorderRadius.circular(4),\n                                    ),\n                                    child: const Text(\n                                      \"创建者\",\n                                      style: TextStyle(\n                                        color: Colors.blue,\n                                        fontSize: 12,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                              ]\n                            : null,\n                      ),\n                    ),\n                    subtitle: Text(\"${user.app} - v${user.version}\"),\n                    trailing: Visibility(\n                      visible: controller.signalR.hubConnection?.connectionId ==\n                          user.connectionId,\n                      child: const Text(\n                        \"本机\",\n                      ),\n                    ),\n                  );\n                },\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildIcon(String platform) {\n    if (platform == \"android\") {\n      return const Icon(Remix.android_line);\n    } else if (platform == \"ios\") {\n      return const Icon(Remix.apple_line);\n    } else if (platform == \"tv\") {\n      return const Icon(Remix.tv_2_line);\n    } else if (platform == \"windows\") {\n      return const Icon(Remix.microsoft_fill);\n    } else if (platform == \"xbox\") {\n      return const Icon(Remix.xbox_line);\n    } else if (platform == \"macos\") {\n      return const Icon(Remix.mac_line);\n    } else if (platform == \"linux\") {\n      return const Icon(Remix.ubuntu_line);\n    } else {\n      return const Icon(Remix.device_line);\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_config_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart';\nimport 'package:simple_live_app/widgets/none_border_circular_textfield.dart';\n\nclass RemoteSyncWebDAVConfigPage extends StatefulWidget {\n  const RemoteSyncWebDAVConfigPage({super.key});\n\n  @override\n  State<RemoteSyncWebDAVConfigPage> createState() =>\n      _RemoteSyncWebDAVConfigPageState();\n}\n\nclass _RemoteSyncWebDAVConfigPageState\n    extends State<RemoteSyncWebDAVConfigPage> {\n  late TextEditingController _urlController;\n  late TextEditingController _userNameController;\n  late TextEditingController _passwordController;\n\n  @override\n  void initState() {\n    _urlController = TextEditingController();\n    _userNameController = TextEditingController();\n    _passwordController = TextEditingController();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    _urlController.dispose();\n    _userNameController.dispose();\n    _passwordController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"WebDAV账号配置\"),\n        centerTitle: true,\n        actions: [\n          IconButton(\n            icon: const Icon(Icons.help_outline),\n            onPressed: () {\n              Utils.showInformationHelpDialog(\n                content: [\n                  const Text(\"此功能可以将您的数据备份到 WebDAV 服务器中或者进行数据恢复.\\n\"),\n                  const Text(\n                      \"WebDAV 服务器地址请以 http:// 或 https:// 开头，如坚果云(点击复制)：\"),\n                  Padding(\n                    padding: const EdgeInsets.symmetric(vertical: 16),\n                    child: InkWell(\n                      onTap: () {\n                        Clipboard.setData(const ClipboardData(\n                            text: \"https://dav.jianguoyun.com/dav/\"));\n                        SmartDialog.showToast(\"复制成功\");\n                      },\n                      child: const Text(\"https://dav.jianguoyun.com/dav/\"),\n                    ),\n                  ),\n                ],\n              );\n            },\n          ),\n        ],\n      ),\n      body: GetX<RemoteSyncWebDAVController>(\n        builder: (controller) {\n          return SingleChildScrollView(\n            child: Padding(\n              padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n              child: Column(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  NoneBorderCircularTextField(\n                    editingController: _urlController,\n                    labelText: \"WebDAV服务器地址\",\n                    hintText: \"请以http:// 或 http:// 开头\",\n                    prefixIcon: const Icon(Icons.public),\n                    trailing: InkWell(\n                      child: const Icon(\n                        Icons.cancel,\n                        size: 20,\n                      ),\n                      onTap: () => _urlController.clear(),\n                    ),\n                  ),\n                  NoneBorderCircularTextField(\n                    editingController: _userNameController,\n                    labelText: \"账号\",\n                    prefixIcon: const Icon(Icons.account_circle),\n                    trailing: InkWell(\n                        child: const Icon(\n                          Icons.cancel,\n                          size: 20,\n                        ),\n                        onTap: () => _userNameController.clear()),\n                  ),\n                  NoneBorderCircularTextField(\n                    editingController: _passwordController,\n                    labelText: \"密码\",\n                    prefixIcon: const Icon(Icons.lock),\n                    obscureText: controller.passwordVisible.value,\n                    trailing: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        InkWell(\n                          child: const Icon(\n                            Icons.cancel,\n                            size: 20,\n                          ),\n                          onTap: () => _passwordController.clear(),\n                        ),\n                        AppStyle.hGap12,\n                        InkWell(\n                          child: controller.passwordVisible.value\n                              ? const Icon(Icons.visibility_off)\n                              : const Icon(Icons.visibility),\n                          onTap: () {\n                            controller.changePasswordVisible();\n                          },\n                        ),\n                      ],\n                    ),\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(top: 5, bottom: 15),\n                    child: MaterialButton(\n                      minWidth: double.infinity,\n                      color: Theme.of(context).primaryColor,\n                      focusElevation: 0,\n                      elevation: 0,\n                      highlightElevation: 4,\n                      height: 40,\n                      shape: const RoundedRectangleBorder(\n                        borderRadius: BorderRadius.all(Radius.circular(8.0)),\n                      ),\n                      child: const Text(\n                        \"登录\",\n                        style: TextStyle(color: Colors.white),\n                      ),\n                      onPressed: () {\n                        controller.doWebDAVLogin(\n                          _urlController.text,\n                          _userNameController.text,\n                          _passwordController.text,\n                        );\n                      },\n                    ),\n                  )\n                ],\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:isolate';\nimport 'dart:typed_data';\n\nimport 'package:archive/archive.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:path/path.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/app/utils/archive.dart';\nimport 'package:simple_live_app/app/utils/document.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/webdav_client.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\n\nclass RemoteSyncWebDAVController extends BaseController {\n  // ui\n  var passwordVisible = true.obs;\n  // ui-用户选择是否同步\n  var isSyncFollows = true.obs;\n  var isSyncHistories = true.obs;\n  var isSyncBlockWord = true.obs;\n  var isSyncBilibiliAccount = true.obs;\n\n  late DAVClient davClient;\n  var user = \"--\".obs;\n  var lastRecoverTime = \"--\".obs;\n  var lastUploadTime = \"--\".obs;\n\n  final _userFollowJsonName = 'SimpleLive_follows.json';\n  final _userHistoriesJsonName = 'SimpleLive_histories.json';\n  final _userBlockedWordJsonName = 'SimpleLive_blocked_word.json';\n  final _userBilibiliAccountJsonName = 'SimpleLive_bilibili_account.json';\n  final _userSettingsJsonName = 'SimpleLive_Settings.json';\n  final _userTagsJsonName = 'SimpleLive_Tags.json';\n\n  @override\n  void onInit() {\n    doWebDAVInit();\n    super.onInit();\n  }\n\n  // webDAV 逻辑\n  // 初始化webDAV\n  void doWebDAVInit() {\n    var uri = LocalStorageService.instance\n        .getValue(LocalStorageService.kWebDAVUri, \"\");\n    if (uri.isEmpty) {\n      notLogin.value = true;\n    } else {\n      user.value = LocalStorageService.instance\n          .getValue(LocalStorageService.kWebDAVUser, \"\");\n      var password = LocalStorageService.instance\n          .getValue(LocalStorageService.kWebDAVPassword, \"\");\n      davClient = DAVClient(uri, user.value, password);\n      // 从未同步过默认为最新数据\n      lastRecoverTime.value = Utils.parseTime(\n        DateTime.fromMillisecondsSinceEpoch(\n          LocalStorageService.instance.getValue(\n            LocalStorageService.kWebDAVLastRecoverTime,\n            DateTime.now().millisecondsSinceEpoch,\n          ),\n        ),\n      );\n      lastUploadTime.value = Utils.parseTime(\n        DateTime.fromMillisecondsSinceEpoch(\n          LocalStorageService.instance.getValue(\n            LocalStorageService.kWebDAVLastUploadTime,\n            DateTime.now().millisecondsSinceEpoch,\n          ),\n        ),\n      );\n      checkIsLogin();\n    }\n  }\n\n  // 检查webDAV登录状态\n  Future<void> checkIsLogin() async {\n    try {\n      // 返回登录结果\n      bool value = await davClient.pingCompleter.future;\n      notLogin.value = !value;\n    } catch (e) {\n      Log.e(\"$e\", StackTrace.current);\n      notLogin.value = true;\n    }\n  }\n\n  // WebDAV登录\n  void doWebDAVLogin(\n      String webDAVUri, String webDAVUser, String webDAVPassword) async {\n    // 确认登录\n    davClient = DAVClient(webDAVUri, webDAVUser, webDAVPassword);\n    await checkIsLogin();\n    if (!notLogin.value) {\n      // 保存到本地\n      LocalStorageService.instance\n          .setValue(LocalStorageService.kWebDAVUri, webDAVUri);\n      LocalStorageService.instance\n          .setValue(LocalStorageService.kWebDAVUser, webDAVUser);\n      user.value = webDAVUser;\n      LocalStorageService.instance\n          .setValue(LocalStorageService.kWebDAVPassword, webDAVPassword);\n      Get.back();\n      SmartDialog.showToast(\"登录成功！\");\n    } else {\n      SmartDialog.showToast(\"WebDAV账号密码验证失败，请重新输入！\");\n    }\n  }\n\n  // WebDAV登出\n  @override\n  Future<void> onLogout() async {\n    var result = await Utils.showAlertDialog(\"确定要登出WebDAV账号？\", title: \"退出登录\");\n    if (result) {\n      // 清除本地账号数据\n      LocalStorageService.instance.setValue(LocalStorageService.kWebDAVUri, \"\");\n      LocalStorageService.instance\n          .setValue(LocalStorageService.kWebDAVUser, \"\");\n      LocalStorageService.instance\n          .setValue(LocalStorageService.kWebDAVPassword, \"\");\n      notLogin.value = true;\n    }\n  }\n\n  // webDAV上传到云端\n  Future<void> doWebDAVUpload() async {\n    SmartDialog.showLoading(msg: \"正在上传到云端\");\n    _backupData().then((value) async {\n      SmartDialog.dismiss();\n      if (value.isNotEmpty) {\n        var result = await davClient.backup(Uint8List.fromList(value));\n        if (result) {\n          SmartDialog.showToast(\"上传成功\");\n          DateTime uploadTime = DateTime.now();\n          lastUploadTime.value = Utils.parseTime(uploadTime);\n          LocalStorageService.instance.setValue(\n              LocalStorageService.kWebDAVLastUploadTime,\n              uploadTime.millisecondsSinceEpoch);\n        } else {\n          Log.e(\"备份失败\", StackTrace.current);\n          SmartDialog.showToast(\"上传失败\");\n        }\n      } else {\n        SmartDialog.showToast(\"上传失败\");\n      }\n    });\n  }\n\n  // 备份所有数据\n  Future<List<int>> _backupData() async {\n    final archive = Archive();\n    List<int> zipBytes = [];\n    // 获取本地备份路径\n    var dir = (await getApplicationSupportDirectory()).path;\n    var profile = Directory(join(dir, 'backup'));\n    if (!profile.existsSync()) {\n      profile.createSync();\n    }\n    try {\n      // archive.add(filepath, data_map) 会导致文件损坏\n      // follows\n      var userFollowList = DBService.instance.getFollowList();\n      var dataFollowsMap = {\n        'data': userFollowList.map((e) => e.toJson()).toList()\n      };\n      final userFollowJsonFile = File(join(profile.path, _userFollowJsonName));\n      await userFollowJsonFile.writeAsString(jsonEncode(dataFollowsMap));\n      // 用户自定义标签\n      var userTagsList = DBService.instance.getFollowTagList();\n      var dataTagsMap = {'data': userTagsList.map((e) => e.toJson()).toList()};\n      var userTagsJsonFile = File(join(profile.path, _userTagsJsonName));\n      await userTagsJsonFile.writeAsString(jsonEncode(dataTagsMap));\n      // histories\n      var userHistoriesList = DBService.instance.getHistores();\n      var dataHistoriesMap = {\n        'data': userHistoriesList.map((e) => e.toJson()).toList()\n      };\n      final userHistoriesJsonFile =\n          File(join(profile.path, _userHistoriesJsonName));\n      await userHistoriesJsonFile.writeAsString(jsonEncode(dataHistoriesMap));\n\n      // blocked_word\n      var userShieldList = AppSettingsController.instance.shieldList;\n      var dataShieldListMap = {'data': userShieldList.toList()};\n      final userBlockedWordJsonFile =\n          File(join(profile.path, _userBlockedWordJsonName));\n      await userBlockedWordJsonFile\n          .writeAsString(jsonEncode(dataShieldListMap));\n\n      // bilibili_account\n      var userBiliAccountCookieMap = {\n        'data': {'cookie': BiliBiliAccountService.instance.cookie}\n      };\n      final bilibiliAccountJsonFile =\n          File(join(profile.path, _userBilibiliAccountJsonName));\n      await bilibiliAccountJsonFile\n          .writeAsString(jsonEncode(userBiliAccountCookieMap));\n      // settings\n      var settingList = LocalStorageService.instance.settingsBox.toMap();\n      var dataSettingListMap = {'data': settingList};\n      final settingJsonFile = File(join(profile.path, _userSettingsJsonName));\n      await settingJsonFile.writeAsString(jsonEncode(dataSettingListMap));\n\n      // 遍历profile路径下的所有文件压缩\n      await archive.addDirectoryToArchive(profile.path, profile.path);\n      final zipEncoder = ZipEncoder();\n      zipBytes = zipEncoder.encode(archive);\n      profile.clearSync();\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"备份失败：$e\");\n    }\n    return zipBytes;\n  }\n\n  // webDAV恢复到本地\n  void doWebDAVRecovery() async {\n    SmartDialog.showLoading(msg: \"正在恢复到本地\");\n    final data = await davClient.recovery();\n    final archive = await Isolate.run<Archive>(() {\n      final zipDecoder = ZipDecoder();\n      return zipDecoder.decodeBytes(data);\n    });\n    for (ArchiveFile file in archive) {\n      await _recovery(file);\n    }\n    SmartDialog.dismiss();\n    SmartDialog.showToast('同步完成');\n    DateTime recoverTime = DateTime.now();\n    lastRecoverTime.value = Utils.parseTime(recoverTime);\n    LocalStorageService.instance.setValue(\n        LocalStorageService.kWebDAVLastRecoverTime,\n        recoverTime.millisecondsSinceEpoch);\n  }\n\n  Future<void> _recovery(ArchiveFile file) async {\n    if (file.isFile && file.name.endsWith('.json')) {\n      var jsonString = utf8.decode(file.content);\n      var jsonData = json.decode(jsonString)['data'];\n      // 同步follows\n      if (file.name == _userFollowJsonName && isSyncFollows.value) {\n        // 当前云优先\n        try {\n          // 清空本地关注列表\n          await DBService.instance.followBox.clear();\n          for (var item in jsonData) {\n            var user = FollowUser.fromJson(item);\n            await DBService.instance.followBox.put(user.id, user);\n          }\n          Log.i('已同步关注用户列表');\n        } catch (e) {\n          Log.e('同步关注用户列表失败: $e', StackTrace.current);\n        }\n      } else if (file.name == _userHistoriesJsonName && isSyncHistories.value) {\n        try {\n          for (var item in jsonData) {\n            var history = History.fromJson(item);\n            if (DBService.instance.historyBox.containsKey(history.id)) {\n              var old = DBService.instance.historyBox.get(history.id);\n              //如果本地的更新时间比较新，就不更新\n              if (old!.updateTime.isAfter(history.updateTime)) {\n                continue;\n              }\n            }\n            await DBService.instance.addOrUpdateHistory(history);\n          }\n          Log.i('已同步用户观看历史记录');\n        } catch (e) {\n          Log.e('同步用户观看历史记录失败: $e', StackTrace.current);\n        }\n      } else if (file.name == _userBlockedWordJsonName &&\n          isSyncBlockWord.value) {\n        try {\n          for (var keyword in jsonData) {\n            AppSettingsController.instance.addShieldList(keyword.trim());\n          }\n          Log.i('已同步用户屏蔽词');\n        } catch (e) {\n          Log.e('同步用户屏蔽词失败:$e', StackTrace.current);\n        }\n      } else if (file.name == _userBilibiliAccountJsonName &&\n          isSyncBilibiliAccount.value) {\n        try {\n          var cookie = jsonData['cookie'];\n          BiliBiliAccountService.instance.setCookie(cookie);\n          BiliBiliAccountService.instance.loadUserInfo();\n          Log.i('已同步哔哩哔哩账号');\n        } catch (e) {\n          Log.e('同步哔哩哔哩账号失败：$e', StackTrace.current);\n        }\n      } else if (file.name == _userSettingsJsonName) {\n        try {\n          await LocalStorageService.instance.settingsBox.clear();\n          LocalStorageService.instance.settingsBox.putAll(jsonData);\n          Log.i('已同步用户设置');\n        } catch (e) {\n          Log.e(\"同步用户设置失败：$e\", StackTrace.current);\n        }\n      } else if (file.name == _userTagsJsonName && isSyncFollows.value) {\n        try {\n          // 标签功能和关注具有依赖关系，必须同时同步\n          // 清空本地标签列表\n          await DBService.instance.tagBox.clear();\n          for (var item in jsonData) {\n            var tag = FollowUserTag.fromJson(item);\n            await DBService.instance.tagBox.put(tag.id, tag);\n            // 插入之后验证\n            var insertedTag = DBService.instance.tagBox.get(tag.id);\n            Log.i('Inserted tag: ${insertedTag?.tag}');\n          }\n          EventBus.instance.emit(Constant.kUpdateFollow, 0);\n          Log.i('已同步用户自定义标签');\n        } catch (e) {\n          Log.e('同步用户自定义标签失败:$e', StackTrace.current);\n        }\n      } else {\n        return;\n      }\n    } else {\n      Log.i('不是正确的文件名');\n    }\n  }\n\n  // ui控制--密码可见控制\n  void changePasswordVisible() {\n    passwordVisible.value = !passwordVisible.value;\n  }\n\n  void changeIsSyncFollows() {\n    isSyncFollows.value = !isSyncFollows.value;\n  }\n\n  void changeIsSyncHistories() {\n    isSyncHistories.value = !isSyncHistories.value;\n  }\n\n  void changeIsSyncBlockWord() {\n    isSyncBlockWord.value = !isSyncBlockWord.value;\n  }\n\n  void changeIsSyncBilibiliAccount() {\n    isSyncBilibiliAccount.value = !isSyncBilibiliAccount.value;\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/remote_sync_webdav_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass RemoteSyncWebDAVPage extends GetView<RemoteSyncWebDAVController> {\n  const RemoteSyncWebDAVPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"WebDAV同步\"),\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          SettingsCard(\n            child: Obx(\n              () => Column(\n                children: controller.notLogin.value\n                    ? [\n                        ListTile(\n                          title: const Text(\"点击登录\"),\n                          leading: const Icon(Icons.login),\n                          subtitle: const Text(\"登录后可以同步您的所有数据\"),\n                          trailing: const Icon(Icons.chevron_right),\n                          onTap: () {\n                            Get.toNamed(RoutePath.kRemoteSyncWebDavConfig);\n                          },\n                        ),\n                      ]\n                    : [\n                        ListTile(\n                          title: const Text(\"已登录\"),\n                          leading: const Icon(Icons.cloud_circle_outlined),\n                          subtitle: Text(controller.user.value),\n                          trailing: const Icon(Icons.logout),\n                          onTap: () {\n                            controller.onLogout();\n                          },\n                        ),\n                        AppStyle.divider,\n                        ListTile(\n                          title: const Text(\"上传到云端\"),\n                          subtitle: Text(\"上次上传：${controller.lastUploadTime}\"),\n                          leading: const Icon(Icons.cloud_upload_outlined),\n                          trailing: const Icon(Icons.chevron_right),\n                          onTap: () {\n                            controller.doWebDAVUpload();\n                          },\n                        ),\n                        AppStyle.divider,\n                        ListTile(\n                          title: const Text(\"恢复到本地\"),\n                          subtitle: Text(\"上次恢复：${controller.lastRecoverTime}\"),\n                          leading: const Icon(Icons.cloud_download_outlined),\n                          trailing: Row(\n                            mainAxisSize: MainAxisSize.min,\n                            children: [\n                              IconButton(\n                                icon: const Icon(Icons.settings),\n                                onPressed: showSetting,\n                              ),\n                              const Icon(Icons.chevron_right),\n                            ],\n                          ),\n                          onTap: () {\n                            controller.doWebDAVRecovery();\n                          },\n                          onLongPress: showSetting,\n                        ),\n                      ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showSetting() {\n    Utils.showBottomSheet(\n      title: '同步选项',\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: [\n          AppStyle.divider,\n          Obx(\n            () => CheckboxListTile(\n              secondary: const Icon(Remix.heart_line),\n              title: const Text(\"同步关注列表\"),\n              value: controller.isSyncFollows.value,\n              controlAffinity: ListTileControlAffinity.trailing,\n              onChanged: (value) => controller.changeIsSyncFollows(),\n            ),\n          ),\n          AppStyle.divider,\n          Obx(\n            () => CheckboxListTile(\n              secondary: const Icon(Icons.history),\n              title: const Text(\"同步播放历史记录\"),\n              value: controller.isSyncHistories.value,\n              controlAffinity: ListTileControlAffinity.trailing,\n              onChanged: (value) => controller.changeIsSyncHistories(),\n            ),\n          ),\n          AppStyle.divider,\n          Obx(\n            () => CheckboxListTile(\n              secondary: const Icon(Remix.shield_keyhole_line),\n              title: const Text(\"同步屏蔽字\"),\n              value: controller.isSyncBlockWord.value,\n              controlAffinity: ListTileControlAffinity.trailing,\n              onChanged: (value) => controller.changeIsSyncBlockWord(),\n            ),\n          ),\n          AppStyle.divider,\n          Obx(\n            () => CheckboxListTile(\n              secondary: const Icon(Remix.account_circle_line),\n              title: const Text(\"同步哔哩哔哩账号\"),\n              value: controller.isSyncBilibiliAccount.value,\n              controlAffinity: ListTileControlAffinity.trailing,\n              onChanged: (value) => controller.changeIsSyncBilibiliAccount(),\n            ),\n          ),\n          AppStyle.divider,\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/modules/sync/remote_sync/webdav/webdav_client.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:webdav_client/webdav_client.dart';\n\nclass DAVClient {\n  late Client client;\n  Completer<bool> pingCompleter = Completer();\n\n  DAVClient(\n      String webDAVUri,\n      String webDAVUser,\n      String webDAVPassword,\n      ) {\n    client = newClient(\n      webDAVUri,\n      user: webDAVUser,\n      password: webDAVPassword,\n    );\n    client.setHeaders(\n      {\n        'accept-charset': 'utf-8',\n        'Content-Type': 'text/xml',\n      },\n    );\n    client.setConnectTimeout(8000);\n    client.setSendTimeout(8000);\n    client.setReceiveTimeout(8000);\n    pingCompleter.complete(_ping());\n  }\n\n  Future<bool> _ping() async {\n    try {\n      await client.ping();\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n  // 强制统一\n  get root => \"/simple_live_app\";\n\n  get backupFile => \"$root/backup.zip\";\n\n  backup(Uint8List data) async {\n    await client.mkdir(\"$root\");\n    await client.write(\"$backupFile\", data);\n    return true;\n  }\n\n  Future<List<int>> recovery() async {\n    await client.mkdir(\"$root\");\n    final data = await client.read(backupFile);\n    return data;\n  }\n}"
  },
  {
    "path": "simple_live_app/lib/modules/sync/sync_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/widgets/settings/settings_card.dart';\n\nclass SyncPage extends StatelessWidget {\n  const SyncPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text(\"数据同步\"),\n        actions: [\n          Visibility(\n            visible: GetPlatform.isAndroid || GetPlatform.isIOS,\n            child: TextButton.icon(\n              onPressed: () async {\n                var result = await Get.toNamed(RoutePath.kSyncScan);\n                if (result == null || result.isEmpty) {\n                  return;\n                }\n                if (result.length == 5) {\n                  Get.toNamed(RoutePath.kRemoteSyncRoom, arguments: result);\n                } else {\n                  Get.toNamed(RoutePath.kLocalSync, arguments: result);\n                }\n              },\n              icon: const Icon(Remix.qr_scan_line),\n              label: const Text(\"扫一扫\"),\n            ),\n          ),\n        ],\n      ),\n      body: ListView(\n        padding: AppStyle.edgeInsetsA12,\n        children: [\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 0),\n            child: Text(\n              \"远程同步\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              children: [\n                ListTile(\n                  title: const Text(\"创建房间\"),\n                  leading: const Icon(Remix.home_wifi_line),\n                  subtitle: const Text(\"其他设备可以通过房间号加入\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kRemoteSyncRoom);\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  title: const Text(\"加入房间\"),\n                  leading: const Icon(Remix.add_circle_line),\n                  subtitle: const Text(\"加入其他设备创建的房间\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () async {\n                    var input = await Utils.showEditTextDialog(\n                      \"\",\n                      title: \"加入房间\",\n                      hintText: \"请输入房间号,不区分大小写\",\n                      validate: (text) {\n                        if (text.isEmpty) {\n                          SmartDialog.showToast(\"房间号不能为空\");\n                          return false;\n                        }\n                        if (text.length != 5) {\n                          SmartDialog.showToast(\"请输入5位房间号\");\n                          return false;\n                        }\n                        return true;\n                      },\n                    );\n                    if (input != null && input.isNotEmpty) {\n                      Get.toNamed(RoutePath.kRemoteSyncRoom,\n                          arguments: input.toUpperCase());\n                    }\n                  },\n                ),\n                AppStyle.divider,\n                ListTile(\n                  title: const Text(\"WebDAV\"),\n                  leading: const Icon(Icons.cloud_upload_outlined),\n                  subtitle: const Text(\"通过WebDAV同步数据\"),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kRemoteSyncWebDav);\n                  },\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA12.copyWith(top: 24),\n            child: Text(\n              \"局域网同步\",\n              style: Get.textTheme.titleSmall,\n            ),\n          ),\n          SettingsCard(\n            child: Column(\n              children: [\n                ListTile(\n                  title: const Text(\"局域网同步\"),\n                  subtitle: const Text(\"在局域网内同步数据\"),\n                  leading: const Icon(Remix.device_line),\n                  trailing: const Icon(Icons.chevron_right),\n                  onTap: () {\n                    Get.toNamed(RoutePath.kLocalSync);\n                  },\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/requests/custom_log_interceptor.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass CustomLogInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    options.extra[\"ts\"] = DateTime.now().millisecondsSinceEpoch;\n\n    super.onRequest(options, handler);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    var time =\n        DateTime.now().millisecondsSinceEpoch - err.requestOptions.extra[\"ts\"];\n    if (!kReleaseMode) {\n      Log.e('''【HTTP请求错误-${err.type}】 耗时:${time}ms\n${err.message}\n\nRequest Method：${err.requestOptions.method}\nResponse Code：${err.response?.statusCode}\nRequest URL：${err.requestOptions.uri}\nRequest Query：${err.requestOptions.queryParameters}\nRequest Data：${err.requestOptions.data}\nRequest Headers：${err.requestOptions.headers}\nResponse Headers：${err.response?.headers.map}\nResponse Data：${err.response?.data}''', err.stackTrace);\n    } else {\n      CoreLog.e('''[HTTP Error] [${err.type}] [Time:${time}ms]\n${err.message}\n\nRequest Method：${err.requestOptions.method}\nResponse Code：${err.response?.statusCode}\nRequest URL：${err.requestOptions.uri}\nRequest Query：${err.requestOptions.queryParameters}\nRequest Data：${err.requestOptions.data}\nRequest Headers：${_maskHeader(err.requestOptions.headers)}\nResponse Headers：${err.response?.headers.map}\nResponse Data：${err.response?.data}''', err.stackTrace);\n    }\n\n    super.onError(err, handler);\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    var time = DateTime.now().millisecondsSinceEpoch -\n        response.requestOptions.extra[\"ts\"];\n    if (!kReleaseMode) {\n      Log.i(\n        '''【HTTP请求响应】 耗时:${time}ms\nRequest Method：${response.requestOptions.method}\nRequest Code：${response.statusCode}\nRequest URL：${response.requestOptions.uri}\nRequest Query：${response.requestOptions.queryParameters}\nRequest Data：${response.requestOptions.data}\nRequest Headers：${response.requestOptions.headers}\nResponse Headers：${response.headers.map}\nResponse Data：${response.data}''',\n      );\n    } else {\n      CoreLog.i(\n        \"[HTTP Response] [time:${time}ms] [${response.statusCode}] ${response.requestOptions.uri}\",\n      );\n    }\n    super.onResponse(response, handler);\n  }\n\n  // Header脱敏\n  String _maskHeader(Map<String, dynamic> header) {\n    var result = <String, dynamic>{};\n    header.forEach((key, value) {\n      var k = key.toLowerCase();\n      if (k == \"cookie\" || k == \"authorization\") {\n        result[key] = \"******\";\n      } else {\n        result[key] = value;\n      }\n    });\n    return result.toString();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/requests/http_client.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:simple_live_app/requests/custom_log_interceptor.dart';\nimport 'package:simple_live_app/requests/http_error.dart';\n\nclass HttpClient {\n  static HttpClient? _httpUtil;\n\n  static HttpClient get instance {\n    _httpUtil ??= HttpClient();\n    return _httpUtil!;\n  }\n\n  late Dio dio;\n  HttpClient() {\n    dio = Dio(\n      BaseOptions(\n        connectTimeout: const Duration(seconds: 20),\n        receiveTimeout: const Duration(seconds: 20),\n        sendTimeout: const Duration(seconds: 20),\n      ),\n    );\n    dio.interceptors.add(CustomLogInterceptor());\n  }\n\n  /// Get请求，返回String\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<String> getText(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.plain,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Get请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<dynamic> getJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Get请求，返回Response\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<Response<dynamic>> get(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Post请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [data] 内容\n  /// * [cancel] 任务取消Token\n  Future<dynamic> postJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    dynamic data,\n    Map<String, dynamic>? header,\n    bool formUrlEncoded = false,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      data ??= {};\n      var result = await dio.post(\n        url,\n        queryParameters: queryParameters,\n        data: data,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n          contentType:\n              formUrlEncoded ? Headers.formUrlEncodedContentType : null,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送POST请求失败\");\n      }\n    }\n  }\n\n  /// Head请求，返回Response\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<Response> head(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.head(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          headers: header,\n          receiveDataWhenStatusError: true,\n        ),\n        cancelToken: cancel,\n      );\n      return result;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        return e.response!;\n      } else {\n        throw HttpError(\"发送HEAD请求失败\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/requests/http_error.dart",
    "content": "class HttpError extends Error {\n  /// 错误码\n  final int statusCode;\n\n  /// 错误信息\n  final String message;\n\n  HttpError(\n    this.message, {\n    this.statusCode = 0,\n  });\n  @override\n  String toString() {\n    if (statusCode != 0) {\n      return statusCodeToString(statusCode);\n    }\n\n    return message;\n  }\n\n  String statusCodeToString(int statusCode) {\n    switch (statusCode) {\n      case 400:\n        return \"错误的请求(400)\";\n      case 401:\n        return \"无权限访问资源(401)\";\n      case 403:\n        return \"无权限访问资源(403)\";\n      case 404:\n        return \"服务器找不到请求的资源(404)\";\n      case 500:\n        return \"服务器出现错误(500)\";\n      case 502:\n        return \"服务器出现错误(502)\";\n      case 503:\n        return \"服务器出现错误(503)\";\n      default:\n        return \"连接服务器失败，请稍后再试($statusCode)\";\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/requests/sync_client_request.dart",
    "content": "import 'package:simple_live_app/models/sync_client_info_model.dart';\nimport 'package:simple_live_app/requests/http_client.dart';\nimport 'package:simple_live_app/services/sync_service.dart';\n\nclass SyncClientRequest {\n  Future<SyncClientInfoModel> getClientInfo(SyncClinet client) async {\n    var url = \"http://${client.address}:${client.port}/info\";\n    var data = await HttpClient.instance.getJson(url);\n\n    return SyncClientInfoModel.fromJson(data);\n  }\n\n  Future<bool> syncFollow(\n    SyncClinet client,\n    dynamic body, {\n    bool overlay = false,\n  }) async {\n    var url = \"http://${client.address}:${client.port}/sync/follow\";\n    var data = await HttpClient.instance.postJson(\n      url,\n      data: body,\n      queryParameters: {\n        'overlay': overlay ? '1' : '0',\n      },\n    );\n\n    if (data[\"status\"]) {\n      return true;\n    } else {\n      throw data[\"message\"];\n    }\n  }\n\n  Future<bool> syncTag(\n      SyncClinet client,\n      dynamic body, {\n        bool overlay = false,\n      }) async {\n    var url = \"http://${client.address}:${client.port}/sync/tag\";\n    var data = await HttpClient.instance.postJson(\n      url,\n      data: body,\n      queryParameters: {\n        'overlay': overlay ? '1' : '0',\n      },\n    );\n\n    if (data[\"status\"]) {\n      return true;\n    } else {\n      throw data[\"message\"];\n    }\n  }\n\n  Future<bool> syncHistory(\n    SyncClinet client,\n    dynamic body, {\n    bool overlay = false,\n  }) async {\n    var url = \"http://${client.address}:${client.port}/sync/history\";\n    var data = await HttpClient.instance.postJson(\n      url,\n      data: body,\n      queryParameters: {\n        'overlay': overlay ? '1' : '0',\n      },\n    );\n\n    if (data[\"status\"]) {\n      return true;\n    } else {\n      throw data[\"message\"];\n    }\n  }\n\n  Future<bool> syncBlockedWord(\n    SyncClinet client,\n    dynamic body, {\n    bool overlay = false,\n  }) async {\n    var url = \"http://${client.address}:${client.port}/sync/blocked_word\";\n    var data = await HttpClient.instance.postJson(\n      url,\n      data: body,\n      queryParameters: {\n        'overlay': overlay ? '1' : '0',\n      },\n    );\n\n    if (data[\"status\"]) {\n      return true;\n    } else {\n      throw data[\"message\"];\n    }\n  }\n\n  Future<bool> syncBiliAccount(SyncClinet client, String cookie) async {\n    var url = \"http://${client.address}:${client.port}/sync/account/bilibili\";\n    var data = await HttpClient.instance.postJson(\n      url,\n      data: {\n        \"cookie\": cookie,\n      },\n    );\n\n    if (data[\"status\"]) {\n      return true;\n    } else {\n      throw data[\"message\"];\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/routes/app_navigation.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/sync_client_info_model.dart';\nimport 'package:simple_live_app/routes/route_path.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/sync_service.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\n/// APP页面跳转封装\n/// * 需要参数的页面都应使用此类\n/// * 如不需要参数，可以使用Get.toNamed\nclass AppNavigator {\n  /// 跳转至分类详情\n  static void toCategoryDetail(\n      {required Site site, required LiveSubCategory category}) {\n    Get.toNamed(RoutePath.kCategoryDetail, arguments: [site, category]);\n  }\n\n  /// 跳转至直播间\n  static void toLiveRoomDetail(\n      {required Site site, required String roomId}) async {\n    if (site.id == Constant.kBiliBili &&\n        !BiliBiliAccountService.instance.logined.value &&\n        AppSettingsController.instance.bilibiliLoginTip.value) {\n      var result = await Utils.showAlertDialog(\n        \"哔哩哔哩需要登录才能观看高清直播，是否前往登录？\",\n        title: \"登录哔哩哔哩\",\n        actions: [\n          TextButton(\n            onPressed: () {\n              AppSettingsController.instance.setBiliBiliLoginTip(false);\n              Get.back(result: false);\n            },\n            child: const Text(\"不再提示\"),\n          ),\n        ],\n      );\n      if (result == true) {\n        await toBiliBiliLogin();\n        if (!BiliBiliAccountService.instance.logined.value) {\n          SmartDialog.showToast(\"未完成登录\");\n        }\n      }\n    }\n\n    Get.toNamed(RoutePath.kLiveRoomDetail, arguments: site, parameters: {\n      \"roomId\": roomId,\n    });\n  }\n\n  /// 跳转至哔哩哔哩登录\n  static Future toBiliBiliLogin() async {\n    if (Platform.isAndroid || Platform.isIOS) {\n      await Get.toNamed(RoutePath.kBiliBiliWebLogin);\n    } else {\n      await Get.toNamed(RoutePath.kBiliBiliQRLogin);\n    }\n  }\n\n  /// 跳转至同步设备\n  static Future toSyncDevice(\n      SyncClinet client, SyncClientInfoModel info) async {\n    await Get.toNamed(\n      RoutePath.kLocalSyncDevice,\n      arguments: {\n        \"client\": client,\n        \"info\": info,\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/routes/app_pages.dart",
    "content": "// ignore_for_file: prefer_inlined_adds\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/modules/category/detail/category_detail_controller.dart';\nimport 'package:simple_live_app/modules/category/detail/category_detail_page.dart';\nimport 'package:simple_live_app/modules/indexed/indexed_controller.dart';\nimport 'package:simple_live_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_app/modules/live_room/live_room_page.dart';\nimport 'package:simple_live_app/modules/settings/follow_settings_page.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/remote_sync_webdav_config_page.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/remote_sync_webdav_controller.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/webdav/remote_sync_webdav_page.dart';\nimport 'package:simple_live_app/modules/sync/sync_page.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/room/remote_sync_room_controller.dart';\nimport 'package:simple_live_app/modules/sync/remote_sync/room/remote_sync_room_page.dart';\nimport 'package:simple_live_app/modules/search/search_controller.dart';\nimport 'package:simple_live_app/modules/search/search_page.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/device/sync_device_controller.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/device/sync_device_page.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/scan_qr/sync_scan_qr_controller.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/scan_qr/sync_scan_qr_page.dart';\nimport 'package:simple_live_app/modules/mine/parse/parse_controller.dart';\nimport 'package:simple_live_app/modules/mine/parse/parse_page.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/local_sync_controller.dart';\nimport 'package:simple_live_app/modules/sync/local_sync/local_sync_page.dart';\nimport 'package:simple_live_app/modules/mine/account/account_controller.dart';\nimport 'package:simple_live_app/modules/mine/account/account_page.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/qr_login_controller.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/qr_login_page.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/web_login_controller.dart';\nimport 'package:simple_live_app/modules/mine/account/bilibili/web_login_page.dart';\nimport 'package:simple_live_app/modules/settings/appstyle_setting_page.dart';\nimport 'package:simple_live_app/modules/settings/auto_exit_settings_page.dart';\nimport 'package:simple_live_app/modules/settings/danmu_settings_page.dart';\nimport 'package:simple_live_app/modules/settings/danmu_shield/danmu_shield_controller.dart';\nimport 'package:simple_live_app/modules/settings/danmu_shield/danmu_shield_page.dart';\nimport 'package:simple_live_app/modules/follow_user/follow_user_controller.dart';\nimport 'package:simple_live_app/modules/follow_user/follow_user_page.dart';\nimport 'package:simple_live_app/modules/mine/history/history_controller.dart';\nimport 'package:simple_live_app/modules/mine/history/history_page.dart';\nimport 'package:simple_live_app/modules/settings/indexed_settings/indexed_settings_controller.dart';\nimport 'package:simple_live_app/modules/settings/indexed_settings/indexed_settings_page.dart';\nimport 'package:simple_live_app/modules/settings/other/other_settings_controller.dart';\nimport 'package:simple_live_app/modules/settings/other/other_settings_page.dart';\nimport 'package:simple_live_app/modules/settings/play_settings_page.dart';\n\nimport '../modules/indexed/indexed_page.dart';\nimport 'route_path.dart';\n\nclass AppPages {\n  AppPages._();\n  static final routes = [\n    // 首页\n    GetPage(\n      name: RoutePath.kIndex,\n      page: () => const IndexedPage(),\n      bindings: [\n        BindingsBuilder.put(() => IndexedController()),\n        //BindingsBuilder.put(() => HomeController()),\n      ],\n    ),\n    // 观看记录\n    GetPage(\n      name: RoutePath.kHistory,\n      page: () => const HistoryPage(),\n      bindings: [\n        BindingsBuilder.put(() => HistoryController()),\n      ],\n    ),\n    // 关注用户\n    GetPage(\n      name: RoutePath.kFollowUser,\n      page: () => const FollowUserPage(),\n      bindings: [\n        BindingsBuilder.put(() => FollowUserController()),\n      ],\n    ),\n    // 搜索\n    GetPage(\n      name: RoutePath.kSearch,\n      page: () => const SearchPage(),\n      bindings: [\n        BindingsBuilder.put(() => AppSearchController()),\n      ],\n    ),\n    //分类详情\n    GetPage(\n      name: RoutePath.kCategoryDetail,\n      page: () => const CategoryDetailPage(),\n      binding: BindingsBuilder.put(\n        () => CategoryDetailController(\n          site: Get.arguments[0],\n          subCategory: Get.arguments[1],\n        ),\n      ),\n    ),\n    //直播间\n    GetPage(\n      name: RoutePath.kLiveRoomDetail,\n      page: () => const LiveRoomPage(),\n      binding: BindingsBuilder.put(\n        () => LiveRoomController(\n          pSite: Get.arguments,\n          pRoomId: Get.parameters[\"roomId\"] ?? \"\",\n        ),\n      ),\n    ),\n    //弹幕设置\n    GetPage(\n      name: RoutePath.kSettingsDanmu,\n      page: () => const DanmuSettingsPage(),\n    ),\n    //外观设置\n    GetPage(\n        name: RoutePath.kAppstyleSetting,\n        page: () => const AppstyleSettingPage()),\n    //播放设置\n    GetPage(\n      name: RoutePath.kSettingsPlay,\n      page: () => const PlaySettingsPage(),\n    ),\n    //自动关闭\n    GetPage(\n      name: RoutePath.kSettingsAutoExit,\n      page: () => const AutoExitSettingsPage(),\n    ),\n    //工具箱\n    GetPage(\n      name: RoutePath.kTools,\n      page: () => const ParsePage(),\n      bindings: [\n        BindingsBuilder.put(() => ParseController()),\n      ],\n    ),\n    //关键词屏蔽\n    GetPage(\n      name: RoutePath.kSettingsDanmuShield,\n      page: () => const DanmuShieldPage(),\n      bindings: [\n        BindingsBuilder.put(() => DanmuShieldController()),\n      ],\n    ),\n    //主页设置\n    GetPage(\n      name: RoutePath.kSettingsIndexed,\n      page: () => const IndexedSettingsPage(),\n      bindings: [\n        BindingsBuilder.put(() => IndexedSettingsController()),\n      ],\n    ),\n    //账号设置\n    GetPage(\n      name: RoutePath.kSettingsAccount,\n      page: () => const AccountPage(),\n      bindings: [\n        BindingsBuilder.put(() => AccountController()),\n      ],\n    ),\n    //哔哩哔哩Web登录\n    GetPage(\n      name: RoutePath.kBiliBiliWebLogin,\n      page: () => const BiliBiliWebLoginPage(),\n      bindings: [\n        BindingsBuilder.put(() => BiliBiliWebLoginController()),\n      ],\n    ),\n    //哔哩哔哩二维码登录\n    GetPage(\n      name: RoutePath.kBiliBiliQRLogin,\n      page: () => const BiliBiliQRLoginPage(),\n      bindings: [\n        BindingsBuilder.put(() => BiliBiliQRLoginController()),\n      ],\n    ),\n    // 数据同步\n    GetPage(\n      name: RoutePath.kSync,\n      page: () => const SyncPage(),\n    ),\n    // 本地同步\n    GetPage(\n      name: RoutePath.kLocalSync,\n      page: () => const LocalSyncPage(),\n      bindings: [\n        BindingsBuilder.put(\n          () => LocalSyncController(\n            Get.arguments ?? \"\",\n          ),\n        ),\n      ],\n    ),\n    //扫码\n    GetPage(\n      name: RoutePath.kSyncScan,\n      page: () => const SyncScanQRPage(),\n      bindings: [\n        BindingsBuilder.put(() => SyncScanQRControlelr()),\n      ],\n    ),\n    //同步设备\n    GetPage(\n      name: RoutePath.kLocalSyncDevice,\n      page: () => const SyncDevicePage(),\n      bindings: [\n        BindingsBuilder.put(\n          () => SyncDeviceController(\n            client: Get.arguments['client'],\n            info: Get.arguments['info'],\n          ),\n        ),\n      ],\n    ),\n    //远程同步-房间\n    GetPage(\n      name: RoutePath.kRemoteSyncRoom,\n      page: () => const RemoteSyncRoomPage(),\n      bindings: [\n        BindingsBuilder.put(\n          () => RemoteSyncRoomController(Get.arguments ?? \"\"),\n        ),\n      ],\n    ),\n    //远程同步-WebDAV\n    GetPage(\n      name: RoutePath.kRemoteSyncWebDav,\n      page: () => const RemoteSyncWebDAVPage(),\n      bindings: [\n        BindingsBuilder.put(\n              () => RemoteSyncWebDAVController(),\n        ),\n      ],\n    ),\n    //远程同步-WebDAVConfig\n    GetPage(\n      name: RoutePath.kRemoteSyncWebDavConfig,\n      page: () => const RemoteSyncWebDAVConfigPage(),\n    ),\n    //其他设置\n    GetPage(\n      name: RoutePath.kSettingsOther,\n      page: () => const OtherSettingsPage(),\n      bindings: [\n        BindingsBuilder.put(() => OtherSettingsController()),\n      ],\n    ),\n    //关注设置\n    GetPage(\n      name: RoutePath.kSettingsFollow,\n      page: () => const FollowSettingsPage(),\n    ),\n  ];\n}\n"
  },
  {
    "path": "simple_live_app/lib/routes/route_path.dart",
    "content": "/// 路由路径\nclass RoutePath {\n  /// 首页\n  static const kIndex = \"/index\";\n\n  /// 搜索\n  static const kSearch = \"/search\";\n\n  /// 分类详情\n  static const kCategoryDetail = \"/category/detail\";\n\n  /// 直播间\n  static const kLiveRoomDetail = \"/room/detail\";\n\n  /// 弹幕设置\n  static const kSettingsDanmu = \"/settings/danmu\";\n\n  /// 定时关闭设置\n  static const kSettingsAutoExit = \"/settings/auto_exit\";\n\n  /// 直播间设置\n  static const kSettingsPlay = \"/settings/play\";\n\n  /// 弹幕关键词屏蔽\n  static const kSettingsDanmuShield = \"/settings/danmu/shield\";\n\n  /// 其他设置\n  static const kSettingsOther = \"/settings/other\";\n\n  /// 赞助\n  static const kSponsor = \"/sponsor\";\n\n  /// 历史记录\n  static const kHistory = \"/user/history\";\n\n  /// 我的关注\n  static const kFollowUser = \"/user/follow\";\n\n  /// 工具箱\n  static const kTools = \"/other/tools\";\n\n  /// 主页设置\n  static const kSettingsIndexed = \"/settings/indexed\";\n\n  /// 外观设置\n  static const kAppstyleSetting = \"/settings/appstyle\";\n\n  /// 账号管理\n  static const kSettingsAccount = \"/settings/account\";\n\n  /// 关注设置\n  static const kSettingsFollow = \"/settings/follow\";\n\n  /// BiliBili Web登录\n  static const kBiliBiliWebLogin = \"/settings/account/bilibili/web_login\";\n\n  /// BiliBili 二维码登录\n  static const kBiliBiliQRLogin = \"/settings/account/bilibili/qr_login\";\n\n  /// 数据同步\n  static const kLocalSync = \"/local_sync\";\n\n  /// 数据同步\n  static const kSync = \"/sync\";\n\n  /// 扫描\n  static const kSyncScan = \"/sync/scan\";\n\n  /// 同步设备\n  static const kLocalSyncDevice = \"/sync/device\";\n\n  /// 远程同步-房间\n  static const kRemoteSyncRoom = \"/remote_sync/room\";\n\n  /// 远程同步-WebDAV\n  static const kRemoteSyncWebDav = \"/remote_sync/webDAV\";\n\n  /// 远程同步-WebDAVConfig\n  static const kRemoteSyncWebDavConfig = \"/remote_sync/webDAVConfig\";\n\n  /// 测试页面\n  static const kTest = \"/test\";\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/bilibili_account_service.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/models/account/bilibili_user_info_page.dart';\nimport 'package:simple_live_app/requests/http_client.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass BiliBiliAccountService extends GetxService {\n  static BiliBiliAccountService get instance =>\n      Get.find<BiliBiliAccountService>();\n\n  var logined = false.obs;\n\n  var cookie = \"\";\n  var uid = 0;\n  var name = \"未登录\".obs;\n\n  @override\n  void onInit() {\n    cookie = LocalStorageService.instance\n        .getValue(LocalStorageService.kBilibiliCookie, \"\");\n    logined.value = cookie.isNotEmpty;\n    loadUserInfo();\n    super.onInit();\n  }\n\n  Future loadUserInfo() async {\n    if (cookie.isEmpty) {\n      return;\n    }\n    try {\n      var result = await HttpClient.instance.getJson(\n        \"https://api.bilibili.com/x/member/web/account\",\n        header: {\n          \"Cookie\": cookie,\n        },\n      );\n      if (result[\"code\"] == 0) {\n        var info = BiliBiliUserInfoModel.fromJson(result[\"data\"]);\n        name.value = info.uname ?? \"未登录\";\n        uid = info.mid ?? 0;\n        setSite();\n      } else {\n        SmartDialog.showToast(\"哔哩哔哩登录已失效，请重新登录\");\n        logout();\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"获取哔哩哔哩用户信息失败，可前往账号管理重试\");\n    }\n  }\n\n  void setSite() {\n    var site = (Sites.allSites[Constant.kBiliBili]!.liveSite as BiliBiliSite);\n    site.userId = uid;\n    site.cookie = cookie;\n  }\n\n  void setCookie(String cookie) {\n    this.cookie = cookie;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliCookie, cookie);\n    logined.value = cookie.isNotEmpty;\n  }\n\n  void logout() async {\n    cookie = \"\";\n    uid = 0;\n    name.value = \"未登录\";\n    setSite();\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliCookie, \"\");\n    logined.value = false;\n\n    if (Platform.isAndroid || Platform.isIOS) {\n      CookieManager cookieManager = CookieManager.instance();\n      await cookieManager.deleteAllCookies();\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/db_service.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:uuid/uuid.dart';\nimport 'package:collection/collection.dart';\n\nclass DBService extends GetxService {\n  static DBService get instance => Get.find<DBService>();\n  late Box<History> historyBox;\n  late Box<FollowUser> followBox;\n  late Box<FollowUserTag> tagBox;\n  final Uuid uuid = const Uuid();\n\n  Future init() async {\n    historyBox = await Hive.openBox(\"History\");\n    followBox = await Hive.openBox(\"FollowUser\");\n    tagBox = await Hive.openBox(\"FollowUserTag\");\n  }\n\n  // follow_user_tag 相关逻辑\n  bool getFollowTagExist(String id) {\n    return tagBox.containsKey(id);\n  }\n\n  // 删除标签\n  Future deleteFollowTag(String id) async {\n    await tagBox.delete(id);\n  }\n\n  FollowUserTag? getFollowTag(String tag) {\n    return tagBox.values.firstWhereOrNull((item) => item.tag == tag);\n  }\n\n  // 判断标签名称是否重复\n  bool getFollowTagExistByTag(String tag) {\n    return tagBox.values.any((item) => item.tag == tag);\n  }\n\n  // 获取标签列表\n  List<FollowUserTag> getFollowTagList() {\n    return tagBox.values.toList();\n  }\n\n  // 修改标签\n  Future updateFollowTag(FollowUserTag followTag) async {\n    await tagBox.put(followTag.id, followTag);\n  }\n\n  // 添加标签\n  Future<FollowUserTag> addFollowTag(String tag) async {\n    // 限制标签唯一且长度不超过8个字符\n    if (getFollowTagExistByTag(tag) && tag.length > 8) {\n      return getFollowTag(tag)!;\n    }\n    final String uniqueId = uuid.v4();\n    final followUserTag = FollowUserTag(id: uniqueId, tag: tag, userId: []);\n    await tagBox.put(uniqueId, followUserTag);\n    return followUserTag;\n  }\n\n  // 调整标签顺序\n  Future updateFollowTagOrder(List<FollowUserTag> userTagList) async {\n    final Map<int, FollowUserTag> updatedMap = {\n      for (int i = 0; i < userTagList.length; i++) i: userTagList[i]\n    };\n    await tagBox.clear();\n    await tagBox.putAll(updatedMap);\n  }\n\n  bool getFollowExist(String id) {\n    return followBox.containsKey(id);\n  }\n\n  List<FollowUser> getFollowList() {\n    return followBox.values.toList();\n  }\n\n  Future addFollow(FollowUser follow) async {\n    await followBox.put(follow.id, follow);\n  }\n\n  Future deleteFollow(String id) async {\n    await followBox.delete(id);\n  }\n\n  History? getHistory(String id) {\n    if (historyBox.containsKey(id)) {\n      return historyBox.get(id);\n    }\n    return null;\n  }\n\n  Future addOrUpdateHistory(History history) async {\n    await historyBox.put(history.id, history);\n  }\n\n  List<History> getHistores() {\n    var his = historyBox.values.toList();\n    his.sort((a, b) => b.updateTime.compareTo(a.updateTime));\n    return his;\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/douyin_account_service.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/services/local_storage_service.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass DouyinAccountService extends GetxService {\n  static DouyinAccountService get instance =>\n      Get.find<DouyinAccountService>();\n\n  var cookie = \"\";\n  var hasCookie = false.obs;\n\n  @override\n  void onInit() {\n    cookie = LocalStorageService.instance\n        .getValue(LocalStorageService.kDouyinCookie, \"\");\n    hasCookie.value = cookie.isNotEmpty;\n    setSite();\n    super.onInit();\n  }\n\n  void setSite() {\n    var site = (Sites.allSites[Constant.kDouyin]!.liveSite as DouyinSite);\n    site.cookie = cookie;\n  }\n\n  void setCookie(String cookie) {\n    this.cookie = cookie;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDouyinCookie, cookie);\n    hasCookie.value = cookie.isNotEmpty;\n    setSite();\n  }\n\n  void clearCookie() {\n    cookie = \"\";\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDouyinCookie, \"\");\n    hasCookie.value = false;\n    setSite();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/follow_service.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/services/db_service.dart';\n\nclass FollowService extends GetxService {\n  StreamSubscription<dynamic>? subscription;\n  static FollowService get instance => Get.find<FollowService>();\n\n  final StreamController _updatedListController = StreamController.broadcast();\n  Stream get updatedListStream => _updatedListController.stream;\n\n  /// 关注用户列表\n  RxList<FollowUser> followList = RxList<FollowUser>();\n\n  /// 直播中的用户列表\n  RxList<FollowUser> liveList = RxList<FollowUser>();\n\n  /// 未直播的用户列表\n  RxList<FollowUser> notLiveList = RxList<FollowUser>();\n\n  /// 用户自定义的tag\n  RxList<FollowUserTag> followTagList = RxList<FollowUserTag>();\n\n  /// 当前tag的用户列表\n  RxList<FollowUser> curTagFollowList = RxList<FollowUser>();\n\n  /// 已经更新状态的数量\n  var updatedCount = 0;\n\n  /// 是否正在更新\n  var updating = false.obs;\n\n  Timer? updateTimer;\n\n  @override\n  void onInit() {\n    subscription = EventBus.instance.listen(Constant.kUpdateFollow, (p0) {\n      loadData(updateStatus: false);\n    });\n    initTimer();\n    super.onInit();\n  }\n\n  // 添加标签\n  Future<void> addFollowUserTag(String tag) async {\n    // 判断待添加tag是否已存在，存在则return\n    if (followTagList.any((item) => item.tag == tag)) {\n      SmartDialog.showToast(\"标签名重复，修改失败\");\n      return;\n    }\n    FollowUserTag item = await DBService.instance.addFollowTag(tag);\n    followTagList.add(item);\n  }\n\n  // 删除标签\n  Future<void> delFollowUserTag(FollowUserTag tag) async {\n    followTagList.remove(tag);\n    await DBService.instance.deleteFollowTag(tag.id);\n  }\n\n  // 获取用户自定义标签列表\n  void getAllTagList() {\n    var list = DBService.instance.getFollowTagList();\n    followTagList.assignAll(list);\n  }\n\n  // 修改标签\n  void updateFollowUserTag(FollowUserTag tag) {\n    DBService.instance.updateFollowTag(tag);\n    // 查找并修改\n    var index = followTagList.indexWhere((oTag) => oTag.id == tag.id);\n    followTagList[index] = tag;\n  }\n\n  // 根据标签筛选数据\n  void filterDataByTag(FollowUserTag tag) {\n    curTagFollowList.clear();\n    // 用一个新的列表来存储需要删除的 userId\n    List<String> toRemove = [];\n    for (var id in tag.userId) {\n      if (followList.any((x) => x.id == id)) {\n        // 找到对应的 followUser 添加到 curTagFollowList\n        curTagFollowList.add(followList.firstWhere((x) => x.id == id));\n      } else {\n        // 标记要删除的 id\n        toRemove.add(id);\n      }\n    }\n    // 双向确认用户取消关注后标签内是否还有该用户\n    // 在遍历结束后统一移除不在 followList 中的 id\n    tag.userId.removeWhere((id) => toRemove.contains(id));\n    // 更新数据库\n    if (toRemove.isNotEmpty) {\n      DBService.instance.updateFollowTag(tag);\n    }\n    // 标签内排序\n    curTagFollowList.sort(\n      (a, b) => b.liveStatus.value.compareTo(a.liveStatus.value),\n    );\n  }\n\n  // 添加关注\n  Future<void> addFollow(FollowUser follow) async {\n    await DBService.instance.addFollow(follow);\n  }\n\n  void initTimer() {\n    if (AppSettingsController.instance.autoUpdateFollowEnable.value) {\n      updateTimer?.cancel();\n      updateTimer = Timer.periodic(\n        Duration(\n            minutes:\n                AppSettingsController.instance.autoUpdateFollowDuration.value),\n        (timer) {\n          Log.logPrint(\"Update Follow Timer\");\n          loadData();\n        },\n      );\n    } else {\n      updateTimer?.cancel();\n    }\n  }\n\n  Future<void> loadData({bool updateStatus = true}) async {\n    var list = DBService.instance.getFollowList();\n    getAllTagList();\n    if (list.isEmpty) {\n      updating.value = false;\n      followList.assignAll(list);\n      return;\n    }\n    followList.assignAll(list);\n    if (updateStatus) {\n      startUpdateStatus();\n    }\n  }\n\n  /// 获取最优并发数\n  /// 根据 CPU 核心数和用户设置自动计算\n  int getOptimalConcurrency() {\n    var userSetting = AppSettingsController.instance.updateFollowThreadCount.value;\n\n    // 如果用户设置为 0，则自动根据 CPU 核心数计算\n    if (userSetting == 0) {\n      var cpuCount = Platform.numberOfProcessors;\n      // 网络 I/O 密集型任务，并发数可以是 CPU 核心数的 2-3 倍\n      var optimal = (cpuCount * 2.5).round();\n      // 限制在合理范围内（最少 4，最多 20）\n      return optimal.clamp(4, 20);\n    }\n\n    return userSetting;\n  }\n\n  /// 按平台交错排列，避免单一平台阻塞\n  List<FollowUser> interleaveByPlatform(List<FollowUser> list) {\n    // 按平台分组\n    var grouped = <String, Queue<FollowUser>>{};\n    for (var item in list) {\n      grouped.putIfAbsent(item.siteId, () => Queue<FollowUser>()).add(item);\n    }\n\n    // 交错处理\n    var result = <FollowUser>[];\n    while (grouped.values.any((queue) => queue.isNotEmpty)) {\n      for (var queue in grouped.values) {\n        if (queue.isNotEmpty) {\n          result.add(queue.removeFirst());\n        }\n      }\n    }\n\n    return result;\n  }\n\n  void startUpdateStatus() async {\n    updatedCount = 0;\n    updating.value = true;\n\n    var concurrency = getOptimalConcurrency();\n\n    Log.logPrint(\"开始更新关注状态，并发数: $concurrency，总数: ${followList.length}\");\n\n    // 按平台交错排列，避免单一平台阻塞\n    var interleavedList = interleaveByPlatform(followList);\n\n    // 创建任务队列\n    var taskQueue = Queue<FollowUser>.from(interleavedList);\n\n    // 工作函数 - 持续从队列中取任务执行\n    Future<void> worker(int workerId) async {\n      while (taskQueue.isNotEmpty) {\n        var item = taskQueue.removeFirst();\n        await updateLiveStatus(item);\n      }\n    }\n\n    // 启动固定数量的并发 worker\n    var workers = <Future>[];\n    for (var i = 0; i < concurrency; i++) {\n      workers.add(worker(i));\n    }\n\n    await Future.wait(workers);\n\n    Log.logPrint(\"关注状态更新完成\");\n  }\n\n  Future updateLiveStatus(FollowUser item) async {\n    try {\n      var site = Sites.allSites[item.siteId]!;\n      // 先只查状态\n      var isLiving = await site.liveSite.getLiveStatus(roomId: item.roomId);\n      item.liveStatus.value = isLiving ? 2 : 1;\n      if (item.liveStatus.value == 2) {\n        // 只有正在直播时才查详细信息\n        var detail = await site.liveSite.getRoomDetail(roomId: item.roomId);\n        item.liveStartTime = detail.showTime;\n      } else {\n        item.liveStartTime = null;\n      }\n    } catch (e) {\n      Log.logPrint(e);\n      item.liveStatus.value = 0;\n      item.liveStartTime = null;\n    } finally {\n      updatedCount++;\n      if (updatedCount >= followList.length) {\n        filterData();\n        updating.value = false;\n      }\n    }\n  }\n\n  void filterData() {\n    followList.sort((a, b) => b.liveStatus.value.compareTo(a.liveStatus.value));\n    liveList.assignAll(followList.where((x) => x.liveStatus.value == 2));\n    notLiveList.assignAll(followList.where((x) => x.liveStatus.value == 1));\n    _updatedListController.add(0);\n  }\n\n  void exportFile() async {\n    if (followList.isEmpty) {\n      SmartDialog.showToast(\"列表为空\");\n      return;\n    }\n\n    try {\n      var status = await Utils.checkStorgePermission();\n      if (!status) {\n        SmartDialog.showToast(\"无权限\");\n        return;\n      }\n\n      var dir = \"\";\n      if (Platform.isIOS) {\n        dir = (await getApplicationDocumentsDirectory()).path;\n      } else {\n        dir = await FilePicker.platform.getDirectoryPath() ?? \"\";\n      }\n\n      if (dir.isEmpty) {\n        return;\n      }\n      var jsonFile = File(\n          '$dir/SimpleLive_${DateTime.now().millisecondsSinceEpoch ~/ 1000}.json');\n      var jsonText = generateJson();\n      await jsonFile.writeAsString(jsonText);\n      SmartDialog.showToast(\"已导出关注列表\");\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"导出失败：$e\");\n    }\n  }\n\n  void inputFile() async {\n    try {\n      var status = await Utils.checkStorgePermission();\n      if (!status) {\n        SmartDialog.showToast(\"无权限\");\n        return;\n      }\n      var file = await FilePicker.platform.pickFiles(\n        type: FileType.custom,\n        allowedExtensions: ['json'],\n      );\n      if (file == null) {\n        return;\n      }\n      var jsonFile = File(file.files.single.path!);\n      await inputJson(await jsonFile.readAsString());\n      SmartDialog.showToast(\"导入成功\");\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"导入失败:$e\");\n    } finally {\n      loadData();\n    }\n  }\n\n  void exportText() {\n    if (followList.isEmpty) {\n      SmartDialog.showToast(\"列表为空\");\n      return;\n    }\n    var content = generateJson();\n    Get.dialog(\n      AlertDialog(\n        title: const Text(\"导出为文本\"),\n        content: TextField(\n          controller: TextEditingController(text: content),\n          decoration: const InputDecoration(\n            border: OutlineInputBorder(),\n          ),\n          minLines: 5,\n          maxLines: 8,\n        ),\n        actions: [\n          TextButton(\n            onPressed: () {\n              Get.back();\n            },\n            child: const Text(\"关闭\"),\n          ),\n          TextButton(\n            onPressed: () {\n              Utils.copyToClipboard(content);\n              Get.back();\n            },\n            child: const Text(\"复制\"),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void inputText() async {\n    final TextEditingController textController = TextEditingController();\n    await Get.dialog(\n      AlertDialog(\n        title: const Text(\"从文本导入\"),\n        content: TextField(\n          controller: textController,\n          decoration: const InputDecoration(\n            border: OutlineInputBorder(),\n            hintText: \"请输入内容\",\n          ),\n          minLines: 5,\n          maxLines: 8,\n        ),\n        actions: [\n          TextButton(\n            onPressed: () {\n              Get.back();\n            },\n            child: const Text(\"关闭\"),\n          ),\n          TextButton(\n            onPressed: () async {\n              var content = await Utils.getClipboard();\n              if (content != null) {\n                textController.text = content;\n              }\n            },\n            child: const Text(\"粘贴\"),\n          ),\n          TextButton(\n            onPressed: () async {\n              if (textController.text.isEmpty) {\n                SmartDialog.showToast(\"内容为空\");\n                return;\n              }\n              try {\n                await inputJson(textController.text);\n                SmartDialog.showToast(\"导入成功\");\n                Get.back();\n                loadData();\n              } catch (e) {\n                SmartDialog.showToast(\"导入失败，请检查内容是否正确\");\n              }\n            },\n            child: const Text(\"导入\"),\n          ),\n        ],\n      ),\n    );\n  }\n\n  String generateJson() {\n    var data = followList\n        .map(\n          (item) => {\n            \"siteId\": item.siteId,\n            \"id\": item.id,\n            \"roomId\": item.roomId,\n            \"userName\": item.userName,\n            \"face\": item.face,\n            \"addTime\": item.addTime.toString(),\n            \"tag\": item.tag\n          },\n        )\n        .toList();\n    return jsonEncode(data);\n  }\n\n  Future inputJson(String content) async {\n    var data = jsonDecode(content);\n\n    for (var item in data) {\n      var follow = FollowUser.fromJson(item);\n      // 导入关注列表同时导入标签列表 此方法可优化为所有导入逻辑\n      if (follow.tag != \"全部\") {\n        // logic: 尝试添加，存在则返回已存在的对象\n        var tag = await DBService.instance.addFollowTag(follow.tag);\n        // 更新tag\n        tag.userId.addIf(!tag.userId.contains(follow.id), follow.id);\n        await DBService.instance.updateFollowTag(tag);\n      }\n      await DBService.instance.addFollow(follow);\n    }\n  }\n\n  @override\n  void onClose() {\n    updateTimer?.cancel();\n    subscription?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/local_storage_service.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\nimport 'package:simple_live_app/app/log.dart';\n\nclass LocalStorageService extends GetxService {\n  static LocalStorageService get instance => Get.find<LocalStorageService>();\n\n  /// 首次运行\n  static const String kFirstRun = \"FirstRun\";\n\n  /// 缩放模式\n  static const String kPlayerScaleMode = \"ScaleMode\";\n\n  /// 网站排序\n  static const String kSiteSort = \"SiteSort\";\n\n  /// 首页排序\n  static const String kHomeSort = \"HomeSort\";\n\n  /// 显示模式\n  /// * [0] 跟随系统\n  /// * [1] 浅色模式\n  /// * [2] 深色模式\n  static const String kThemeMode = \"ThemeMode\";\n\n  /// DEBUG模式\n  static const String kDebugModeKey = \"DebugMode\";\n\n  /// 弹幕大小\n  static const String kDanmuSize = \"DanmuSize\";\n\n  /// 弹幕速度\n  static const String kDanmuSpeed = \"DanmuSpeed\";\n\n  /// 弹幕区域\n  static const String kDanmuArea = \"DanmuArea\";\n\n  /// 弹幕透明度\n  static const String kDanmuOpacity = \"DanmuOpacity\";\n\n  /// 弹幕描边大小\n  static const String kDanmuStrokeWidth = \"DanmuStrokeWidth\";\n\n  /// 弹幕-屏蔽滚动\n  static const String kDanmuHideScroll = \"DanmuHideScroll\";\n\n  /// 弹幕-屏蔽底部\n  static const String kDanmuHideBottom = \"DanmuHideBottom\";\n\n  /// 弹幕-屏蔽顶部\n  static const String kDanmuHideTop = \"DanmuHideTop\";\n\n  /// 弹幕-顶部边距\n  static const String kDanmuTopMargin = \"DanmuTopMargin\";\n\n  /// 弹幕-底部边距\n  static const String kDanmuBottomMargin = \"DanmuBottomMargin\";\n\n  /// 弹幕开启\n  static const String kDanmuEnable = \"DanmuEnable\";\n\n  /// 弹幕字重\n  static const String kDanmuFontWeight = \"DanmuFontWeight\";\n\n  /// 硬件解码\n  static const String kHardwareDecode = \"HardwareDecode\";\n\n  /// 聊天区文字大小\n  static const String kChatTextSize = \"ChatTextSize\";\n\n  /// 聊天区间隔\n  static const String kChatTextGap = \"ChatTextGap\";\n\n  /// 聊天区-气泡样式\n  static const String kChatBubbleStyle = \"ChatBubbleStyle\";\n\n  /// 播放清晰度，0=低，1=中，2=高\n  static const String kQualityLevel = \"QualityLevel\";\n\n  /// 蜂窝网络下播放清晰度，0=低，1=中，2=高\n  static const String kQualityLevelCellular = \"QualityLevelCellular\";\n\n  /// 开启定时关闭\n  static const String kAutoExitEnable = \"AutoExitEnable\";\n\n  /// 定时关闭时间（分钟）\n  static const String kAutoExitDuration = \"AutoExitDuration\";\n\n  /// 房间内定时关闭时间（分钟）\n  /// 需要一个不同的 key，因为用户在房间内设置的倒计时和全局的可能不同。\n  static const String kRoomAutoExitDuration = \"RoomAutoExitDuration\";\n\n  /// 播放器兼容模式\n  static const String kPlayerCompatMode = \"PlayerCompatMode\";\n\n  /// 播放器后台自动暂停\n  static const String kPlayerAutoPause = \"PlayerAutoPause\";\n\n  /// 播放器缓冲区大小\n  static const String kPlayerBufferSize = \"PlayerBufferSize\";\n\n  /// 播放器强制使用HTTPS\n  static const String kPlayerForceHttps = \"PlayerForceHttps\";\n\n  /// 自动全屏\n  static const String kAutoFullScreen = \"AutoFullScreen\";\n\n  /// 显示SC\n  static const String kPlayerShowSuperChat = \"PlayerShowSuperChat\";\n\n  /// 播放器音量\n  static const String kPlayerVolume = \"PlayerVolume\";\n\n  /// 小窗隐藏弹幕\n  static const String kPIPHideDanmu = \"PIPHideDanmu\";\n\n  /// 哔哩哔哩cookie\n  static const String kBilibiliCookie = \"BilibiliCookie\";\n\n  /// 抖音cookie\n  static const String kDouyinCookie = \"DouyinCookie\";\n\n  ///主题色\n  static const String kStyleColor = \"kStyleColor\";\n\n  ///动态取色\n  static const String kIsDynamic = \"kIsDynamic\";\n\n  /// 提示哔哩哔哩登录\n  static const String kBilibiliLoginTip = \"BilibiliLoginTip\";\n\n  /// 日志记录\n  static const String kLogEnable = \"LogEnable\";\n\n  /// 开启自定义播放器视频输出\n  static const String kCustomPlayerOutput = \"CustomPlayerOutput\";\n\n  /// 视频输出驱动\n  static const String kVideoOutputDriver = \"VideoOutputDriver\";\n\n  /// 视频硬件解码器\n  static const String kVideoHardwareDecoder = \"VideoHardwareDecoder\";\n\n  /// 音频输出驱动\n  static const String kAudioOutputDriver = \"AudioOutputDriver\";\n\n  /// 开启自动更新关注\n  static const String kAutoUpdateFollowEnable = \"AutoUpdateFollowEnable\";\n\n  /// 定时自动更新关注间隔（分钟）\n  static const String kUpdateFollowDuration = \"AutoUpdateFollowDuration\";\n\n  /// 开启多线程更新关注\n  static const String kUpdateFollowThreadCount = \"UpdateFollowThreadCount\";\n\n  /// WebDAV_服务器地址\n  static const String kWebDAVUri = \"WebDAVUri\";\n\n  /// WebDAV_登录账号\n  static const String kWebDAVUser = \"WebDAVUser\";\n\n  /// WebDAV_登录密码\n  static const String kWebDAVPassword = \"kWebDAVPassword\";\n\n  /// WebDAV_最后一次上传时间\n  static const String kWebDAVLastUploadTime = \"kWebDAVLastUploadTime\";\n\n  /// WebDAV_最后一次备份时间\n  static const String kWebDAVLastRecoverTime = \"kWebDAVLastRecoverTime\";\n\n  late Box settingsBox;\n  late Box<String> shieldBox;\n\n  Future init() async {\n    settingsBox = await Hive.openBox(\n      \"LocalStorage\",\n    );\n    shieldBox = await Hive.openBox(\n      \"DanmuShield\",\n    );\n  }\n\n  T getValue<T>(dynamic key, T defaultValue) {\n    try {\n      var value = settingsBox.get(key, defaultValue: defaultValue) as T;\n      Log.d(\"Get LocalStorage：$key\\r\\n$value\");\n      return value;\n    } catch (e) {\n      Log.logPrint(e);\n      return defaultValue;\n    }\n  }\n\n  Future setValue<T>(dynamic key, T value) async {\n    Log.d(\"Set LocalStorage：$key\\r\\n$value\");\n    return await settingsBox.put(key, value);\n  }\n\n  Future removeValue<T>(dynamic key) async {\n    Log.d(\"Remove LocalStorage：$key\");\n    return await settingsBox.delete(key);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/signalr_service.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:signalr_netcore/signalr_client.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\n\nenum SignalRConnectionState {\n  connecting,\n  connected,\n  disconnected,\n}\n\nclass SignalRService {\n  static const String kUrl = \"https://sync1.nsapps.cn/sync\";\n\n  SignalRConnectionState state = SignalRConnectionState.connecting;\n\n  final _stateStreamController =\n      StreamController<SignalRConnectionState>.broadcast();\n  Stream<SignalRConnectionState> get stateStream =>\n      _stateStreamController.stream;\n\n  final _onFavoriteStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onFavoriteStream =>\n      _onFavoriteStreamController.stream;\n\n  final _onHistoryStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onHistoryStream =>\n      _onHistoryStreamController.stream;\n\n  final _onShieldWordStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onShieldWordStream =>\n      _onShieldWordStreamController.stream;\n\n  final _onBiliAccountStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onBiliAccountStream =>\n      _onBiliAccountStreamController.stream;\n\n  final _onRoomDestroyedStreamController = StreamController<String>.broadcast();\n  Stream<String> get onRoomDestroyedStream =>\n      _onRoomDestroyedStreamController.stream;\n\n  final _onRoomUserUpdatedStreamController =\n      StreamController<List<RoomUser>>.broadcast();\n  Stream<List<RoomUser>> get onRoomUserUpdatedStream =>\n      _onRoomUserUpdatedStreamController.stream;\n\n  HubConnection? hubConnection;\n  Future<void> connect() async {\n    hubConnection = HubConnectionBuilder().withUrl(kUrl).build();\n    hubConnection!.onclose(({Exception? error}) {\n      state = SignalRConnectionState.disconnected;\n      _stateStreamController.add(state);\n    });\n    hubConnection!.onreconnected(({String? connectionId}) {\n      Log.d(\"reconnected: $connectionId\");\n      state = SignalRConnectionState.connected;\n      _stateStreamController.add(state);\n    });\n    await hubConnection!.start();\n    state = SignalRConnectionState.connected;\n    _stateStreamController.add(state);\n    _listen();\n  }\n\n  void _listen() {\n    hubConnection?.on(\"onFavoriteReceived\", (args) {\n      _onFavoriteStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onHistoryReceived\", (args) {\n      _onHistoryStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onShieldWordReceived\", (args) {\n      _onShieldWordStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onBiliAccountReceived\", (args) {\n      _onBiliAccountStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onRoomDestroyed\", (args) {\n      _onRoomDestroyedStreamController.add(args![0].toString());\n    });\n    hubConnection?.on(\"onUserUpdated\", (args) {\n      var list = (args![0] as List).map((e) => RoomUser.fromObject(e)).toList();\n      _onRoomUserUpdatedStreamController.add(list);\n    });\n  }\n\n  Future<void> disconnect() async {\n    await hubConnection?.stop();\n    state = SignalRConnectionState.disconnected;\n    _stateStreamController.add(state);\n  }\n\n  Future<Resp<String>> createRoom() async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    String app = \"Simple Live\";\n    String platform = Platform.operatingSystem;\n    String version = Utils.packageInfo.version;\n    var resp = await hubConnection\n        ?.invoke(\"CreateRoom\", args: [app, platform, version]);\n    return Resp<String>.fromObject(resp);\n  }\n\n  Future<Resp> joinRoom(String roomId) async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    String app = \"Simple Live\";\n    String platform = Platform.operatingSystem;\n    String version = Utils.packageInfo.version;\n    var resp = await hubConnection\n        ?.invoke(\"JoinRoom\", args: [roomId, app, platform, version]);\n    return Resp.fromObject(resp);\n  }\n\n  Future<Resp> sendContent({\n    required String roomName,\n    required String action,\n    required bool overlay,\n    required String content,\n  }) async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    var resp =\n        await hubConnection?.invoke(action, args: [roomName, overlay, content]);\n    return Resp.fromObject(resp);\n  }\n\n  void dispose() {\n    _stateStreamController.close();\n    _onFavoriteStreamController.close();\n    _onHistoryStreamController.close();\n    _onShieldWordStreamController.close();\n    _onBiliAccountStreamController.close();\n    _onRoomDestroyedStreamController.close();\n    _onRoomUserUpdatedStreamController.close();\n\n    hubConnection?.stop();\n  }\n}\n\nclass Resp<T> {\n  final bool isSuccess;\n  final String message;\n  final T? data;\n  Resp(this.isSuccess, this.message, this.data);\n\n  factory Resp.fromJson(Map<String, dynamic> json) {\n    return Resp(\n      json['isSuccess'],\n      json['message'] ?? \"\",\n      json['data'],\n    );\n  }\n\n  factory Resp.fromObject(Object? obj) {\n    if (obj is Map<String, dynamic>) {\n      return Resp.fromJson(obj);\n    }\n    return Resp(false, \"unknown\", null);\n  }\n}\n\nclass RoomUser {\n  final String connectionId;\n  final String shortId;\n  final String platform;\n  final String version;\n  final String app;\n  final bool? isCreator;\n\n  RoomUser({\n    required this.connectionId,\n    required this.shortId,\n    required this.platform,\n    required this.version,\n    required this.app,\n    this.isCreator = false,\n  });\n\n  factory RoomUser.fromJson(Map<String, dynamic> json) {\n    return RoomUser(\n      connectionId: json['connectionId'],\n      shortId: json['shortId'],\n      platform: json['platform'],\n      version: json['version'],\n      app: json['app'],\n      isCreator: json['isCreator'],\n    );\n  }\n\n  factory RoomUser.fromObject(Object? obj) {\n    if (obj is Map<String, dynamic>) {\n      return RoomUser.fromJson(obj);\n    }\n    return RoomUser(\n      connectionId: \"\",\n      shortId: \"\",\n      platform: \"\",\n      version: \"\",\n      app: \"\",\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/services/sync_service.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:network_info_plus/network_info_plus.dart';\nimport 'package:simple_live_app/app/constant.dart';\nimport 'package:simple_live_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_app/app/event_bus.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/models/db/follow_user_tag.dart';\nimport 'package:simple_live_app/models/db/history.dart';\nimport 'package:simple_live_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_app/services/db_service.dart';\nimport 'package:udp/udp.dart';\nimport 'package:shelf/shelf.dart' as shelf;\nimport 'package:shelf/shelf_io.dart' as shelf_io;\nimport 'package:shelf_router/shelf_router.dart';\nimport 'package:uuid/uuid.dart';\n\nclass SyncService extends GetxService {\n  static SyncService get instance => Get.find<SyncService>();\n\n  UDP? udp;\n  RxList<SyncClinet> scanClients = <SyncClinet>[].obs;\n  static const int udpPort = 23235;\n  static const int httpPort = 23234;\n  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n  NetworkInfo networkInfo = NetworkInfo();\n  HttpServer? server;\n  var ipAddress = \"\".obs;\n  var httpRunning = false.obs;\n  var httpErrorMsg = \"\".obs;\n\n  var deviceId = \"\";\n\n  @override\n  void onInit() {\n    Log.d('TVService init');\n    deviceId = (const Uuid().v4()).split('-').first;\n    listenUDP();\n    initServer();\n    super.onInit();\n  }\n\n  /// 监听其他端UDP广播的回复\n  void listenUDP() async {\n    udp = await UDP.bind(Endpoint.any(port: const Port(udpPort)));\n    udp!.asStream().listen(listenUdp);\n  }\n\n  void listenUdp(Datagram? datagram) {\n    var str = String.fromCharCodes(datagram!.data);\n    Log.i(\"Received: $str from ${datagram.address}:${datagram.port}\");\n    if (str.startsWith('{') && str.endsWith('}')) {\n      var data = json.decode(str);\n      //如果是自己的广播，就不处理\n      if (data['id'] == deviceId) {\n        return;\n      }\n      //处理Hello的广播\n      if (data[\"type\"] == \"hello\") {\n        //如果http服务已经启动，就回复自己的信息\n        if (httpRunning.value) {\n          sendInfo();\n        }\n        return;\n      }\n      // 处理其他端的广播\n      // 地址直接从datagram中获取，能收到回复说明地址是可以连通的\n      var address = datagram.address.address;\n      //检查是否已经存在\n      var index =\n          scanClients.indexWhere((element) => element.address == address);\n      if (index == -1) {\n        scanClients.add(\n          SyncClinet(\n            id: data['id'],\n            name: data['name'],\n            address: address,\n            port: httpPort,\n            type: data['type'],\n          ),\n        );\n      }\n    }\n  }\n\n  /// 发送UDP广播至其他端\n  void sendHello() async {\n    await udp!.send(\n      json.encode({\n        \"id\": deviceId,\n        \"type\": \"hello\",\n      }).codeUnits,\n      Endpoint.broadcast(\n        port: const Port(udpPort),\n      ),\n    );\n    Log.i(\"send udp: hello\");\n  }\n\n  /// UDP广播自身信息\n  void sendInfo() async {\n    //var ip = await getLocalIP();\n\n    var name = await getDeviceName();\n\n    var data = {\n      \"id\": deviceId,\n      \"type\": Platform.operatingSystem,\n      //'version': Utils.packageInfo.version,\n      \"name\": name,\n      //\"address\": ip,\n      //\"port\": httpPort,\n    };\n\n    await udp!.send(\n      json.encode(data).codeUnits,\n      Endpoint.broadcast(\n        port: const Port(udpPort),\n      ),\n    );\n    Log.i(\"send udp info: $data\");\n  }\n\n  Future<String> getDeviceName() async {\n    var name = \"SimpleLive-${Platform.operatingSystem}\";\n    if (Platform.isAndroid) {\n      var info = await deviceInfo.androidInfo;\n      name = info.model;\n    } else if (Platform.isIOS) {\n      var info = await deviceInfo.iosInfo;\n      name = info.name;\n    } else if (Platform.isMacOS) {\n      var info = await deviceInfo.macOsInfo;\n      name = info.computerName;\n    } else if (Platform.isLinux) {\n      var info = await deviceInfo.linuxInfo;\n      name = info.name;\n    } else if (Platform.isWindows) {\n      var info = await deviceInfo.windowsInfo;\n      name = info.userName;\n    }\n    return name;\n  }\n\n  void refreshClients() {\n    scanClients.clear();\n    sendHello();\n  }\n\n  /// 读取本地IP\n  /// - 如果是wifi，直接获取wifi的IP\n  /// - 如果是有线，获取所有的IP，找到全部的IP\n  Future<String> getLocalIP() async {\n    String? ip = \"\";\n    try {\n      ip = await networkInfo.getWifiIP();\n    } catch (e) {\n      Log.logPrint(e);\n    }\n    try {\n      if (ip == null || ip.isEmpty) {\n        var interfaces = await NetworkInterface.list();\n        var ipList = <String>[];\n        for (var interface in interfaces) {\n          for (var addr in interface.addresses) {\n            if (addr.type.name == 'IPv4' &&\n                !addr.address.startsWith('127') &&\n                !addr.isMulticast &&\n                !addr.isLoopback) {\n              ipList.add(addr.address);\n              break;\n            }\n          }\n        }\n        ip = ipList.join(';');\n      }\n    } catch (e) {\n      Log.logPrint(e);\n    }\n    return ip ?? \"\";\n  }\n\n  /// 初始化HTTP服务\n  void initServer() async {\n    try {\n      var serverRouter = Router();\n      serverRouter.get('/', _helloRequest);\n      serverRouter.get('/info', _infoRequest);\n      serverRouter.post('/sync/follow', _syncFollowUserReuqest);\n      serverRouter.post('/sync/tag', _syncFollowUserTagRequest);\n      serverRouter.post('/sync/history', _syncHistoryReuqest);\n      serverRouter.post('/sync/blocked_word', _syncBlockedWordReuqest);\n      serverRouter.post('/sync/account/bilibili', _syncBiliAccountReuqest);\n\n      var server = await shelf_io.serve(\n        serverRouter,\n        InternetAddress.anyIPv4,\n        httpPort,\n      );\n\n      // Enable content compression\n      server.autoCompress = true;\n\n      httpRunning.value = true;\n\n      var ip = await getLocalIP();\n      ipAddress.value = ip;\n\n      Log.d('Serving at http://$ip:${server.port}');\n    } catch (e) {\n      httpErrorMsg.value = e.toString();\n      Log.logPrint(e);\n    }\n  }\n\n  /// 测试服务能否正常访问\n  shelf.Response _helloRequest(shelf.Request request) {\n    return toJsonResponse({\n      'status': true,\n      'message': 'http server is running...',\n      \"version\":\n          'SimpeLive ${Platform.operatingSystem} v${Utils.packageInfo.version}',\n    });\n  }\n\n  /// 发送自己的信息\n  Future<shelf.Response> _infoRequest(shelf.Request request) async {\n    var name = await getDeviceName();\n    return toJsonResponse({\n      \"id\": deviceId,\n      'type': Platform.operatingSystem,\n      'name': name,\n      'version': Utils.packageInfo.version,\n      'address': ipAddress.value,\n      'port': httpPort,\n    });\n  }\n\n  /// 同步关注用户列表\n  Future<shelf.Response> _syncFollowUserReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n\n      var body = await request.readAsString();\n      Log.d('_syncFollowUserReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        await DBService.instance.followBox.clear();\n      }\n      for (var item in jsonBody) {\n        var user = FollowUser.fromJson(item);\n        await DBService.instance.followBox.put(user.id, user);\n      }\n\n      SmartDialog.showToast('已同步关注用户列表');\n      EventBus.instance.emit(Constant.kUpdateFollow, 0);\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步标签列表\n  Future<shelf.Response> _syncFollowUserTagRequest(shelf.Request request) async {\n    try {\n      var overlay =\n      int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n\n      var body = await request.readAsString();\n      Log.d('_syncFollowUserTagRequest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        await DBService.instance.tagBox.clear();\n      }\n      for (var item in jsonBody) {\n        var tag = FollowUserTag.fromJson(item);\n        await DBService.instance.tagBox.put(tag.id, tag);\n      }\n\n      SmartDialog.showToast('已同步标签列表');\n      EventBus.instance.emit(Constant.kUpdateFollow, 0);\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步观看记录\n  Future<shelf.Response> _syncHistoryReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n      var body = await request.readAsString();\n      Log.d('_syncFollowUserReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        await DBService.instance.historyBox.clear();\n      }\n      for (var item in jsonBody) {\n        var history = History.fromJson(item);\n        if (DBService.instance.historyBox.containsKey(history.id)) {\n          var old = DBService.instance.historyBox.get(history.id);\n          //如果本地的更新时间比较新，就不更新\n          if (old!.updateTime.isAfter(history.updateTime)) {\n            continue;\n          }\n        }\n        await DBService.instance.addOrUpdateHistory(history);\n      }\n\n      SmartDialog.showToast('已同步观看记录');\n      EventBus.instance.emit(Constant.kUpdateHistory, 0);\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步弹幕屏蔽词\n  Future<shelf.Response> _syncBlockedWordReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n      var body = await request.readAsString();\n      Log.d('_syncBlockedWordReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        AppSettingsController.instance.clearShieldList();\n      }\n      for (var keyword in jsonBody) {\n        AppSettingsController.instance.addShieldList(keyword.trim());\n      }\n      SmartDialog.showToast('已同步弹幕屏蔽词');\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步哔哩哔哩账号\n  Future<shelf.Response> _syncBiliAccountReuqest(shelf.Request request) async {\n    try {\n      var body = await request.readAsString();\n      Log.d('_syncBiliAccountReuqest: $body');\n      var jsonBody = json.decode(body);\n      var cookie = jsonBody['cookie'];\n      BiliBiliAccountService.instance.setCookie(cookie);\n      BiliBiliAccountService.instance.loadUserInfo();\n      SmartDialog.showToast('已同步哔哩哔哩账号');\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  shelf.Response toJsonResponse(Map<String, dynamic> data) {\n    return shelf.Response.ok(\n      json.encode(data),\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      encoding: Encoding.getByName('utf-8'),\n    );\n  }\n\n  @override\n  void onClose() {\n    Log.d('SyncService close');\n    udp?.close();\n    server?.close(force: true);\n    super.onClose();\n  }\n}\n\nclass SyncClinet {\n  final String id;\n  final String name;\n  final String address;\n  final int port;\n  final String type;\n  SyncClinet({\n    required this.id,\n    required this.name,\n    required this.address,\n    required this.port,\n    required this.type,\n  });\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/desktop_refresh_button.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass DesktopRefreshButton extends StatelessWidget {\n  final bool refreshing;\n  final Function()? onPressed;\n  const DesktopRefreshButton(\n      {required this.refreshing, this.onPressed, super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        color: Theme.of(context).cardColor,\n        borderRadius: AppStyle.radius48,\n        boxShadow: [\n          BoxShadow(\n            color: Colors.grey.withAlpha(50),\n            blurRadius: 4,\n          ),\n        ],\n      ),\n      width: 40,\n      height: 40,\n      child: refreshing\n          ? const Center(\n              child: SizedBox(\n                width: 20,\n                height: 20,\n                child: CircularProgressIndicator(\n                  strokeWidth: 2,\n                ),\n              ),\n            )\n          : IconButton(\n              onPressed: onPressed,\n              icon: const Icon(Icons.refresh),\n            ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/filter_button.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass FilterButton extends StatelessWidget {\n  final bool selected;\n  final String text;\n  final Function()? onTap;\n  const FilterButton({\n    this.selected = false,\n    required this.text,\n    this.onTap,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      borderRadius: AppStyle.radius24,\n      onTap: onTap,\n      child: Container(\n        padding: AppStyle.edgeInsetsH12.copyWith(top: 4, bottom: 4),\n        decoration: BoxDecoration(\n          border: Border.all(\n              color: selected\n                  ? Theme.of(context).textTheme.bodyMedium!.color!\n                  : Colors.grey),\n          borderRadius: AppStyle.radius24,\n        ),\n        child: Text(\n          text,\n          style: selected\n              ? Theme.of(context).textTheme.bodyMedium\n              : Theme.of(context).textTheme.bodyMedium!.copyWith(\n                    color: Colors.grey,\n                  ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/follow_user_item.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/log.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/models/db/follow_user.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'dart:ui' as ui;\n\nclass FollowUserItem extends StatelessWidget {\n  final FollowUser item;\n  final Function()? onRemove;\n  final Function()? onTap;\n  final Function()? onLongPress;\n  final bool playing;\n  const FollowUserItem({\n    required this.item,\n    this.onRemove,\n    this.onTap,\n    this.onLongPress,\n    this.playing = false,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var site = Sites.allSites[item.siteId]!;\n    return ListTile(\n      contentPadding: AppStyle.edgeInsetsL16.copyWith(right: 4),\n      leading: NetImage(\n        item.face,\n        width: 48,\n        height: 48,\n        borderRadius: 24,\n      ),\n      title: Text.rich(\n        TextSpan(\n          text: item.userName,\n          children: [\n            WidgetSpan(\n              alignment: ui.PlaceholderAlignment.middle,\n              child: Obx(\n                () => Offstage(\n                  offstage: item.liveStatus.value == 0,\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      AppStyle.hGap12,\n                      Container(\n                        width: 8,\n                        height: 8,\n                        decoration: BoxDecoration(\n                          color: item.liveStatus.value == 2\n                              ? Colors.green\n                              : Colors.grey,\n                          borderRadius: AppStyle.radius12,\n                        ),\n                      ),\n                      AppStyle.hGap4,\n                      Text(\n                        getStatus(item.liveStatus.value),\n                        style: TextStyle(\n                          fontSize: 12,\n                          fontWeight: FontWeight.normal,\n                          color:\n                              item.liveStatus.value == 2 ? null : Colors.grey,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n      subtitle: Wrap(\n        runSpacing: 1.0,\n        children: [\n          Image.asset(\n            site.logo,\n            width: 20,\n          ),\n          AppStyle.hGap4,\n          Text(\n            site.name,\n            style: const TextStyle(\n              fontSize: 12,\n              color: Colors.grey,\n            ),\n            overflow: TextOverflow.ellipsis,\n          ),\n          if (playing)\n            Padding(\n              padding: AppStyle.edgeInsetsL8,\n              child: Text(\n                \"正在观看\",\n                style: TextStyle(\n                  fontSize: 12,\n                  color: Theme.of(context).colorScheme.primary,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n            )\n          else if (item.liveStatus.value == 2 && item.liveStartTime != null)\n            Padding(\n              padding: AppStyle.edgeInsetsL8,\n              child: Text(\n                '开播了${formatLiveDuration(item.liveStartTime)}',\n                style: const TextStyle(\n                  fontSize: 12,\n                  color: Colors.grey,\n                ),\n              ),\n            ),\n        ],\n      ),\n      trailing: playing\n          ? const SizedBox(\n              width: 64,\n              child: Center(\n                child: Icon(\n                  Icons.play_arrow,\n                ),\n              ),\n            )\n          : (onRemove == null\n              ? null\n              : IconButton(\n                  onPressed: () {\n                    onRemove?.call();\n                  },\n                  icon: const Icon(Remix.dislike_line),\n                )),\n      onTap: onTap,\n      onLongPress: onLongPress,\n    );\n  }\n\n  String getStatus(int status) {\n    if (status == 0) {\n      return \"读取中\";\n    } else if (status == 1) {\n      return \"未开播\";\n    } else {\n      return \"直播中\";\n    }\n  }\n\n  String formatLiveDuration(String? startTimeStampString) {\n    if (startTimeStampString == null ||\n        startTimeStampString.isEmpty ||\n        startTimeStampString == \"0\") {\n      return \"\";\n    }\n    try {\n      int startTimeStamp = int.parse(startTimeStampString);\n      int currentTimeStamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n      int durationInSeconds = currentTimeStamp - startTimeStamp;\n\n      int hours = durationInSeconds ~/ 3600;\n      int minutes = (durationInSeconds % 3600) ~/ 60;\n\n      String hourText = hours > 0 ? '$hours小时' : '';\n      String minuteText = minutes > 0 ? '$minutes分钟' : '';\n\n      if (hours == 0 && minutes == 0) {\n        return \"不足1分钟\";\n      }\n\n      return '$hourText$minuteText';\n    } catch (e) {\n      Log.logPrint('格式化开播时长出错: $e');\n      return \"--小时--分钟\";\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/keep_alive_wrapper.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass KeepAliveWrapper extends StatefulWidget {\n  final Widget child;\n\n  const KeepAliveWrapper({Key? key, required this.child}) : super(key: key);\n\n  @override\n  State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();\n}\n\nclass _KeepAliveWrapperState extends State<KeepAliveWrapper>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return widget.child;\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/live_room_card.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/sites.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/routes/app_navigation.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_app/widgets/shadow_card.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass LiveRoomCard extends StatelessWidget {\n  final Site site;\n  final LiveRoomItem item;\n  const LiveRoomCard(this.site, this.item, {Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ShadowCard(\n      onTap: () {\n        AppNavigator.toLiveRoomDetail(site: site, roomId: item.roomId);\n      },\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Stack(\n            children: [\n              ClipRRect(\n                borderRadius: const BorderRadius.only(\n                  topLeft: Radius.circular(8),\n                  topRight: Radius.circular(8),\n                ),\n                child: NetImage(\n                  item.cover,\n                  fit: BoxFit.cover,\n                  height: 110,\n                  width: double.infinity,\n                ),\n              ),\n              Positioned(\n                right: 0,\n                left: 0,\n                bottom: 0,\n                child: Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 4,\n                    vertical: 8,\n                  ),\n                  decoration: const BoxDecoration(\n                    gradient: LinearGradient(\n                      begin: Alignment.bottomCenter,\n                      end: Alignment.topCenter,\n                      colors: [\n                        Colors.black87,\n                        Colors.transparent,\n                      ],\n                    ),\n                  ),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.end,\n                    children: [\n                      const Icon(\n                        Remix.fire_fill,\n                        color: Colors.white,\n                        size: 14,\n                      ),\n                      AppStyle.hGap4,\n                      Text(\n                        Utils.onlineToString(item.online),\n                        style: const TextStyle(\n                          fontSize: 12,\n                          color: Colors.white,\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsA8.copyWith(bottom: 4),\n            child: Text(\n              item.title,\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          Padding(\n            padding: AppStyle.edgeInsetsH8.copyWith(bottom: 8),\n            child: Text(\n              item.userName,\n              maxLines: 1,\n              style: const TextStyle(\n                  height: 1.4, fontSize: 12, color: Colors.grey),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/net_image.dart",
    "content": "import 'package:extended_image/extended_image.dart';\nimport 'package:flutter/material.dart';\n\nclass NetImage extends StatelessWidget {\n  final String picUrl;\n  final double? width;\n  final double? height;\n  final BoxFit? fit;\n  final double borderRadius;\n  const NetImage(this.picUrl,\n      {this.width,\n      this.height,\n      this.fit = BoxFit.cover,\n      this.borderRadius = 0,\n      Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    if (picUrl.isEmpty) {\n      return Image.asset(\n        'assets/images/logo.png',\n        width: width,\n        height: height,\n      );\n    }\n    var pic = picUrl;\n    if (pic.startsWith(\"//\")) {\n      pic = 'https:$pic';\n    }\n    return ClipRRect(\n      borderRadius: BorderRadius.circular(borderRadius),\n      child: ExtendedImage.network(\n        pic,\n        fit: fit,\n        height: height,\n        width: width,\n        shape: BoxShape.rectangle,\n        borderRadius: BorderRadius.circular(borderRadius),\n        loadStateChanged: (e) {\n          if (e.extendedImageLoadState == LoadState.loading) {\n            return const Icon(\n              Icons.image,\n              color: Colors.grey,\n              size: 24,\n            );\n          }\n          if (e.extendedImageLoadState == LoadState.failed) {\n            return const Icon(\n              Icons.broken_image,\n              color: Colors.grey,\n              size: 24,\n            );\n          }\n          return null;\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/none_border_circular_textfield.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass NoneBorderCircularTextField extends StatelessWidget {\n  final TextEditingController editingController;\n  final String? hintText;\n  final String? helperText;\n  final String? labelText;\n  final String? errorText;\n  final Widget? prefixIcon;\n  final bool obscureText;\n  final VoidCallback? onEditingComplete;\n  final ValueChanged<String>? onChanged;\n  final VoidCallback? onTap;\n  final TextAlign textAlign;\n  final Widget? trailing;\n  final TextInputType? inputType;\n  final int? maxLines;\n  final bool autoFocus;\n  final FocusNode? focusNode;\n  final bool? enable;\n  final bool readOnly;\n\n  final bool needPadding;\n\n  const NoneBorderCircularTextField({\n    Key? key,\n    required this.editingController,\n    this.hintText,\n    this.helperText,\n    this.labelText,\n    this.errorText,\n    this.prefixIcon,\n    this.textAlign = TextAlign.start,\n    this.obscureText = false,\n    this.maxLines = 1,\n    this.onEditingComplete,\n    this.trailing,\n    this.autoFocus = false,\n    this.focusNode,\n    this.inputType,\n    this.onChanged,\n    this.onTap,\n    this.enable,\n    this.readOnly = false,\n    this.needPadding = true,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    TextField common = TextField(\n      enabled: enable,\n      readOnly: readOnly,\n      decoration: InputDecoration(\n        prefixIcon: prefixIcon,\n        hintText: hintText,\n        filled: true,\n        contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12),\n        suffix: trailing,\n        helperText: helperText,\n        helperMaxLines: 3,\n        border: const OutlineInputBorder(\n          borderSide: BorderSide.none,\n          borderRadius: BorderRadius.all(Radius.circular(8.0)),\n        ),\n        labelText: labelText,\n        errorText: errorText,\n        errorMaxLines: 3,\n      ),\n      textAlign: textAlign,\n      autofocus: autoFocus,\n      keyboardType: inputType,\n      maxLines: maxLines,\n      controller: editingController,\n      obscureText: obscureText,\n      onEditingComplete: onEditingComplete,\n      onChanged: onChanged,\n      onTap: onTap,\n      focusNode: focusNode,\n    );\n    if (needPadding) {\n      return Padding(\n        padding: const EdgeInsets.only(\n          top: 10,\n          bottom: 10,\n        ),\n        child: common,\n      );\n    } else {\n      return common;\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/page_grid_view.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/widgets/status/app_empty_widget.dart';\nimport 'package:simple_live_app/widgets/status/app_error_widget.dart';\nimport 'package:simple_live_app/widgets/status/app_loadding_widget.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\nimport 'package:get/get.dart';\n\nclass PageGridView extends StatelessWidget {\n  final BasePageController pageController;\n  final IndexedWidgetBuilder itemBuilder;\n  final EdgeInsets? padding;\n  final bool firstRefresh;\n  final Function()? onLoginSuccess;\n  final bool showPageLoadding;\n  final double crossAxisSpacing, mainAxisSpacing;\n  final int crossAxisCount;\n  final bool showPCRefreshButton;\n  const PageGridView({\n    required this.itemBuilder,\n    required this.pageController,\n    this.padding,\n    this.firstRefresh = false,\n    this.showPageLoadding = false,\n    this.onLoginSuccess,\n    this.crossAxisSpacing = 0.0,\n    this.mainAxisSpacing = 0.0,\n    this.showPCRefreshButton = true,\n    required this.crossAxisCount,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => Stack(\n        children: [\n          EasyRefresh(\n            header: MaterialHeader(\n              completeDuration: const Duration(milliseconds: 400),\n            ),\n            footer: MaterialFooter(\n              completeDuration: const Duration(milliseconds: 400),\n            ),\n            scrollController: pageController.scrollController,\n            controller: pageController.easyRefreshController,\n            firstRefresh: firstRefresh,\n            onLoad: pageController.loadData,\n            onRefresh: pageController.refreshData,\n            child: MasonryGridView.count(\n              padding: padding,\n              itemCount: pageController.list.length,\n              itemBuilder: itemBuilder,\n              crossAxisCount: crossAxisCount,\n              crossAxisSpacing: crossAxisSpacing,\n              mainAxisSpacing: mainAxisSpacing,\n            ),\n          ),\n          Positioned(\n            bottom: 0,\n            left: 0,\n            right: 0,\n            child: // 加载更多按钮\n                Visibility(\n              visible: (Platform.isWindows ||\n                      Platform.isLinux ||\n                      Platform.isMacOS) &&\n                  pageController.canLoadMore.value &&\n                  !pageController.pageLoadding.value &&\n                  !pageController.pageEmpty.value,\n              child: Center(\n                child: TextButton(\n                  onPressed: pageController.loadData,\n                  child: const Text(\"加载更多\"),\n                ),\n              ),\n            ),\n          ),\n          Positioned(\n            bottom: 12,\n            right: 12,\n            child: // 加载更多按钮\n                Visibility(\n              visible: (Platform.isWindows ||\n                      Platform.isLinux ||\n                      Platform.isMacOS) &&\n                  pageController.canLoadMore.value &&\n                  !pageController.pageLoadding.value &&\n                  !pageController.pageEmpty.value &&\n                  showPCRefreshButton,\n              child: Center(\n                child: IconButton(\n                  style: IconButton.styleFrom(\n                    backgroundColor: Get.theme.cardColor.withAlpha(200),\n                    elevation: 4,\n                  ),\n                  onPressed: () {\n                    pageController.refreshData();\n                  },\n                  icon: const Icon(Icons.refresh),\n                ),\n              ),\n            ),\n          ),\n          Offstage(\n            offstage: !pageController.pageEmpty.value,\n            child: AppEmptyWidget(\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n          Offstage(\n            offstage: !(showPageLoadding && pageController.pageLoadding.value),\n            child: const AppLoaddingWidget(),\n          ),\n          Offstage(\n            offstage: !pageController.pageError.value,\n            child: AppErrorWidget(\n              errorMsg: pageController.errorMsg.value,\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/page_list_view.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/controller/base_controller.dart';\nimport 'package:simple_live_app/widgets/status/app_empty_widget.dart';\nimport 'package:simple_live_app/widgets/status/app_error_widget.dart';\nimport 'package:simple_live_app/widgets/status/app_loadding_widget.dart';\n\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\nimport 'package:get/get.dart';\n\ntypedef IndexedWidgetBuilder = Widget Function(BuildContext context, int index);\n\nclass PageListView extends StatelessWidget {\n  final BasePageController pageController;\n  final IndexedWidgetBuilder itemBuilder;\n  final IndexedWidgetBuilder? separatorBuilder;\n  final EdgeInsets? padding;\n  final bool firstRefresh;\n  final Function()? onLoginSuccess;\n  final bool showPageLoadding;\n  final bool showPCRefreshButton;\n  const PageListView({\n    required this.itemBuilder,\n    required this.pageController,\n    this.padding,\n    this.firstRefresh = false,\n    this.showPageLoadding = false,\n    this.showPCRefreshButton = true,\n    this.separatorBuilder,\n    this.onLoginSuccess,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => Stack(\n        children: [\n          EasyRefresh(\n            header: MaterialHeader(\n              completeDuration: const Duration(milliseconds: 400),\n            ),\n            footer: MaterialFooter(\n              completeDuration: const Duration(milliseconds: 400),\n            ),\n            scrollController: pageController.scrollController,\n            controller: pageController.easyRefreshController,\n            firstRefresh: firstRefresh,\n            onLoad: pageController.loadData,\n            onRefresh: pageController.refreshData,\n            child: ListView.separated(\n              padding: padding,\n              itemCount: pageController.list.length,\n              itemBuilder: itemBuilder,\n              separatorBuilder:\n                  separatorBuilder ?? (context, i) => const SizedBox(),\n            ),\n          ),\n          Positioned(\n            bottom: 0,\n            left: 0,\n            right: 0,\n            child: // 加载更多按钮\n                Visibility(\n              visible: (Platform.isWindows ||\n                      Platform.isLinux ||\n                      Platform.isMacOS) &&\n                  pageController.canLoadMore.value &&\n                  !pageController.pageLoadding.value &&\n                  !pageController.pageEmpty.value,\n              child: Center(\n                child: TextButton(\n                  onPressed: pageController.loadData,\n                  child: const Text(\"加载更多\"),\n                ),\n              ),\n            ),\n          ),\n          Positioned(\n            bottom: 12,\n            right: 12,\n            child: // 加载更多按钮\n                Visibility(\n              visible: (Platform.isWindows ||\n                      Platform.isLinux ||\n                      Platform.isMacOS) &&\n                  pageController.canLoadMore.value &&\n                  !pageController.pageLoadding.value &&\n                  !pageController.pageEmpty.value &&\n                  showPCRefreshButton,\n              child: Center(\n                child: IconButton(\n                  style: IconButton.styleFrom(\n                    backgroundColor: Get.theme.cardColor.withAlpha(200),\n                    elevation: 4,\n                  ),\n                  onPressed: () {\n                    pageController.refreshData();\n                  },\n                  icon: const Icon(Icons.refresh),\n                ),\n              ),\n            ),\n          ),\n          Offstage(\n            offstage: !pageController.pageEmpty.value,\n            child: AppEmptyWidget(\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n          Offstage(\n            offstage: !(showPageLoadding && pageController.pageLoadding.value),\n            child: const AppLoaddingWidget(),\n          ),\n          Offstage(\n            offstage: !pageController.pageError.value,\n            child: AppErrorWidget(\n              errorMsg: pageController.errorMsg.value,\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/rectangular_indicator.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// 来自 https://github.com/adar2378/tab_indicator_styler\n\nclass RectangularIndicator extends Decoration {\n  /// topRight radius of the indicator, default to 5.\n  final double topRightRadius;\n\n  /// topLeft radius of the indicator, default to 5.\n  final double topLeftRadius;\n\n  /// bottomRight radius of the indicator, default to 0.\n  final double bottomRightRadius;\n\n  /// bottomLeft radius of the indicator, default to 0\n  final double bottomLeftRadius;\n\n  /// Color of the indicator, default set to [Colors.black]\n  final Color color;\n\n  /// Horizontal padding of the indicator, default set to 0\n  final double horizontalPadding;\n\n  /// Vertical padding of the indicator, default set to 0\n  final double verticalPadding;\n\n  /// [PagingStyle] determines if the indicator should be fill or stroke, default to fill\n  final PaintingStyle paintingStyle;\n\n  /// StrokeWidth, used for [PaintingStyle.stroke], default set to 0\n  final double strokeWidth;\n\n  const RectangularIndicator({\n    this.topRightRadius = 5,\n    this.topLeftRadius = 5,\n    this.bottomRightRadius = 0,\n    this.bottomLeftRadius = 0,\n    this.color = Colors.black,\n    this.horizontalPadding = 0,\n    this.verticalPadding = 0,\n    this.paintingStyle = PaintingStyle.fill,\n    this.strokeWidth = 2,\n  });\n  @override\n  MyCustomPainter createBoxPainter([VoidCallback? onChanged]) {\n    return MyCustomPainter(\n      this,\n      onChanged,\n      bottomLeftRadius: bottomLeftRadius,\n      bottomRightRadius: bottomRightRadius,\n      color: color,\n      horizontalPadding: horizontalPadding,\n      topLeftRadius: topLeftRadius,\n      topRightRadius: topRightRadius,\n      verticalPadding: verticalPadding,\n      paintingStyle: paintingStyle,\n      strokeWidth: strokeWidth,\n    );\n  }\n}\n\nclass MyCustomPainter extends BoxPainter {\n  final RectangularIndicator decoration;\n  final double topRightRadius;\n  final double topLeftRadius;\n  final double bottomRightRadius;\n  final double bottomLeftRadius;\n  final Color color;\n  final double horizontalPadding;\n  final double verticalPadding;\n  final PaintingStyle paintingStyle;\n  final double strokeWidth;\n\n  MyCustomPainter(\n    this.decoration,\n    VoidCallback? onChanged, {\n    required this.topRightRadius,\n    required this.topLeftRadius,\n    required this.bottomRightRadius,\n    required this.bottomLeftRadius,\n    required this.color,\n    required this.horizontalPadding,\n    required this.verticalPadding,\n    required this.paintingStyle,\n    required this.strokeWidth,\n  }) : super(onChanged);\n\n  @override\n  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {\n    assert(horizontalPadding >= 0);\n    assert(horizontalPadding < configuration.size!.width / 2,\n        \"Padding must be less than half of the size of the tab\");\n    assert(verticalPadding < configuration.size!.height / 2 &&\n        verticalPadding >= 0);\n    assert(strokeWidth >= 0 &&\n        strokeWidth < configuration.size!.width / 2 &&\n        strokeWidth < configuration.size!.height / 2);\n\n    //offset is the position from where the decoration should be drawn.\n    //configuration.size tells us about the height and width of the tab.\n    Size mysize = Size(configuration.size!.width - (horizontalPadding * 2),\n        configuration.size!.height - (2 * verticalPadding));\n\n    Offset myoffset =\n        Offset(offset.dx + (horizontalPadding), offset.dy + verticalPadding);\n    final Rect rect = myoffset & mysize;\n    final Paint paint = Paint();\n    paint.color = color;\n    paint.style = paintingStyle;\n    paint.strokeWidth = 3;\n    canvas.drawRRect(\n        RRect.fromRectAndCorners(\n          rect,\n          bottomRight: Radius.circular(bottomRightRadius),\n          bottomLeft: Radius.circular(bottomLeftRadius),\n          topLeft: Radius.circular(topLeftRadius),\n          topRight: Radius.circular(topRightRadius),\n        ),\n        paint);\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/settings/settings_action.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass SettingsAction extends StatelessWidget {\n  final String title;\n  final String? subtitle;\n  final Function()? onTap;\n  final String? value;\n  final Widget? leading;\n\n  const SettingsAction({\n    required this.title,\n    this.value,\n    this.onTap,\n    this.subtitle,\n    this.leading,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      // visualDensity: VisualDensity.compact,\n      leading: leading,\n      title: Text(\n        title,\n        style: Theme.of(context).textTheme.bodyLarge,\n      ),\n      shape: RoundedRectangleBorder(\n        borderRadius: AppStyle.radius8,\n      ),\n      contentPadding: AppStyle.edgeInsetsL16.copyWith(right: 8),\n      subtitle: subtitle == null\n          ? null\n          : Text(\n              subtitle!,\n              style: Get.textTheme.bodySmall!.copyWith(color: Colors.grey),\n            ),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          if (value != null)\n            Text(\n              value!,\n              style: Theme.of(context)\n                  .textTheme\n                  .bodyMedium!\n                  .copyWith(color: Colors.grey),\n            ),\n          AppStyle.hGap4,\n          const Icon(\n            Icons.chevron_right,\n            color: Colors.grey,\n          ),\n        ],\n      ),\n      onTap: onTap,\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/settings/settings_card.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass SettingsCard extends StatelessWidget {\n  final Widget child;\n  const SettingsCard({required this.child, Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      color: Theme.of(context).brightness == Brightness.dark\n          ? Colors.grey.withAlpha(50)\n          : Colors.white70,\n      shape: RoundedRectangleBorder(\n        borderRadius: AppStyle.radius8,\n        side: BorderSide(\n          color: Colors.grey.withAlpha(25),\n        ),\n      ),\n      child: Container(\n        decoration: BoxDecoration(\n          borderRadius: AppStyle.radius8,\n        ),\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/settings/settings_menu.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass SettingsMenu<T> extends StatelessWidget {\n  final String title;\n  final String? subtitle;\n  final Map<T, String> valueMap;\n  final T value;\n\n  final Function(T)? onChanged;\n  const SettingsMenu({\n    required this.title,\n    required this.value,\n    required this.valueMap,\n    this.subtitle,\n    this.onChanged,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      visualDensity: VisualDensity.compact,\n      title: Text(\n        title,\n        style: Theme.of(context).textTheme.bodyLarge,\n      ),\n      shape: RoundedRectangleBorder(\n        borderRadius: AppStyle.radius8,\n      ),\n      contentPadding: AppStyle.edgeInsetsL16.copyWith(right: 8),\n      subtitle: subtitle == null\n          ? null\n          : Text(\n              subtitle!,\n              style: Get.textTheme.bodySmall!.copyWith(color: Colors.grey),\n            ),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Text(\n            valueMap[value]!.tr,\n            style: Theme.of(context)\n                .textTheme\n                .bodyMedium!\n                .copyWith(color: Colors.grey),\n          ),\n          AppStyle.hGap4,\n          const Icon(\n            Icons.chevron_right,\n            color: Colors.grey,\n          ),\n        ],\n      ),\n      onTap: () => openMenu(context),\n    );\n  }\n\n  void openMenu(BuildContext context) {\n    showModalBottomSheet(\n      context: context,\n      showDragHandle: true,\n      useSafeArea: true, //useSafeArea似乎无效\n      builder: (_) => SafeArea(\n        top: false,\n        child: SingleChildScrollView(\n          child: RadioGroup(\n            groupValue: value,\n            onChanged: (e) {\n              Get.back();\n              onChanged?.call(e as T);\n            },\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: valueMap.keys\n                  .map(\n                    (e) => RadioListTile(\n                      value: e,\n                      title: Text(\n                        (valueMap[e]?.tr) ?? \"???\",\n                        style: Get.textTheme.bodyMedium,\n                      ),\n                    ),\n                  )\n                  .toList(),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/settings/settings_number.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass SettingsNumber extends StatelessWidget {\n  final String title;\n  final String? subtitle;\n  final String unit;\n  final int value;\n  final int step;\n  final int min;\n  final int max;\n  final String? displayValue;\n  final Function(int)? onChanged;\n  const SettingsNumber(\n      {required this.title,\n      required this.value,\n      required this.max,\n      this.subtitle,\n      this.onChanged,\n      this.step = 1,\n      this.min = 0,\n      this.unit = '',\n      this.displayValue,\n      Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      visualDensity: VisualDensity.compact,\n      title: Text(\n        title,\n        style: Get.textTheme.bodyLarge,\n      ),\n      shape: RoundedRectangleBorder(\n        borderRadius: AppStyle.radius8,\n      ),\n      subtitle: subtitle == null\n          ? null\n          : Text(\n              subtitle!,\n              style: Get.textTheme.bodySmall!.copyWith(color: Colors.grey),\n            ),\n      contentPadding: AppStyle.edgeInsetsL16.copyWith(right: 12),\n      trailing: Container(\n        decoration: BoxDecoration(\n          color: Colors.grey.withAlpha(25),\n          borderRadius: AppStyle.radius24,\n        ),\n        height: 36,\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            IconButton(\n              padding: AppStyle.edgeInsetsA4,\n              constraints: const BoxConstraints(\n                minHeight: 32,\n              ),\n              onPressed: () {\n                int newValue = value - step;\n                if (newValue < min) {\n                  newValue = min;\n                }\n                onChanged?.call(newValue);\n              },\n              icon: Icon(\n                Icons.remove,\n                color: Get.textTheme.bodyMedium!.color!.withAlpha(150),\n              ),\n            ),\n            Text(\n              displayValue ?? \"$value$unit\",\n              textAlign: TextAlign.center,\n              style: Theme.of(context)\n                  .textTheme\n                  .bodyMedium!\n                  .copyWith(color: Colors.grey),\n            ),\n            IconButton(\n              padding: AppStyle.edgeInsetsA4,\n              constraints: const BoxConstraints(\n                minHeight: 32,\n              ),\n              onPressed: () {\n                int newValue = value + step;\n                if (newValue > max) {\n                  newValue = max;\n                }\n                onChanged?.call(newValue);\n              },\n              icon: Icon(\n                Icons.add,\n                color: Get.textTheme.bodyMedium!.color!.withAlpha(150),\n              ),\n            ),\n          ],\n        ),\n      ),\n      onTap: () => openSilder(context),\n    );\n  }\n\n  void openSilder(BuildContext context) {\n    var newValue = value.obs;\n    showModalBottomSheet(\n      context: context,\n      showDragHandle: true,\n      useSafeArea: true, //useSafeArea似乎无效\n      builder: (_) => SafeArea(\n        top: false,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            Padding(\n              padding: AppStyle.edgeInsetsH16,\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  Text(\n                    title,\n                    style: Get.textTheme.titleMedium,\n                  ),\n                  Obx(\n                    () => Text(\n                      \"${newValue.value}$unit\",\n                      style: Get.textTheme.titleMedium,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            Obx(\n              () => Slider(\n                value: newValue.value.toDouble(),\n                min: min.toDouble(),\n                max: max.toDouble(),\n                onChanged: (e) {\n                  newValue.value = e.toInt();\n                },\n              ),\n            ),\n            Padding(\n              padding: AppStyle.edgeInsetsH16,\n              child: TextButton(\n                onPressed: () {\n                  onChanged?.call(newValue.value);\n                  Get.back();\n                },\n                child: const Text(\"确定\"),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/settings/settings_switch.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass SettingsSwitch extends StatelessWidget {\n  final bool value;\n  final String title;\n  final String? subtitle;\n  final Function(bool) onChanged;\n  const SettingsSwitch({\n    required this.value,\n    required this.title,\n    this.subtitle,\n    required this.onChanged,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return SwitchListTile(\n      title: Text(\n        title,\n        style: Theme.of(context).textTheme.bodyLarge,\n      ),\n      shape: RoundedRectangleBorder(\n        borderRadius: AppStyle.radius8,\n      ),\n      trackOutlineColor: const WidgetStatePropertyAll(Colors.transparent),\n      //visualDensity: VisualDensity.compact,\n      contentPadding: AppStyle.edgeInsetsL16.copyWith(right: 8),\n      subtitle: subtitle != null\n          ? Text(\n              subtitle!,\n              style: Theme.of(context)\n                  .textTheme\n                  .bodySmall!\n                  .copyWith(color: Colors.grey),\n            )\n          : null,\n      value: value,\n      onChanged: onChanged,\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/shadow_card.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass ShadowCard extends StatelessWidget {\n  final Widget child;\n  final double radius;\n  final Function()? onTap;\n  const ShadowCard({\n    required this.child,\n    this.radius = 8.0,\n    this.onTap,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(radius),\n        boxShadow: Get.isDarkMode\n            ? []\n            : [\n                BoxShadow(\n                  blurRadius: 4,\n                  color: Colors.grey.withAlpha(50),\n                )\n              ],\n      ),\n      child: Material(\n        color: Theme.of(context).cardColor,\n        borderRadius: BorderRadius.circular(radius),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(radius),\n          onTap: onTap,\n          child: Container(\n            decoration: BoxDecoration(\n              borderRadius: AppStyle.radius8,\n            ),\n            child: child,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/status/app_empty_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:lottie/lottie.dart';\n\nclass AppEmptyWidget extends StatelessWidget {\n  final Function()? onRefresh;\n  const AppEmptyWidget({this.onRefresh, Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: GestureDetector(\n        onTap: () {\n          onRefresh?.call();\n        },\n        child: Padding(\n          padding: AppStyle.edgeInsetsA12,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              LottieBuilder.asset(\n                'assets/lotties/empty.json',\n                width: 200,\n                height: 200,\n                repeat: false,\n              ),\n              const Text(\n                \"这里什么都没有\",\n                textAlign: TextAlign.center,\n                style: TextStyle(fontSize: 12, color: Colors.grey),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/status/app_error_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:lottie/lottie.dart';\n\nclass AppErrorWidget extends StatelessWidget {\n  final Function()? onRefresh;\n  final String errorMsg;\n  const AppErrorWidget({this.errorMsg = \"\", this.onRefresh, Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: GestureDetector(\n        onTap: () {\n          onRefresh?.call();\n        },\n        child: Padding(\n          padding: AppStyle.edgeInsetsA12,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              LottieBuilder.asset(\n                'assets/lotties/error.json',\n                width: 260,\n                repeat: false,\n              ),\n              Text(\n                \"$errorMsg\\r\\n点击刷新\",\n                textAlign: TextAlign.center,\n                style: const TextStyle(fontSize: 12, color: Colors.grey),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/status/app_loadding_widget.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_app/app/app_style.dart';\n\nclass AppLoaddingWidget extends StatelessWidget {\n  const AppLoaddingWidget({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: Container(\n        padding: AppStyle.edgeInsetsA12,\n        decoration: BoxDecoration(\n          shape: BoxShape.circle,\n          color: Theme.of(context).cardColor,\n          boxShadow: Get.isDarkMode\n              ? []\n              : [\n                  BoxShadow(\n                    blurRadius: 4,\n                    color: Colors.grey.withAlpha(50),\n                  )\n                ],\n        ),\n        child: const CupertinoActivityIndicator(\n          radius: 10,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_app/lib/widgets/superchat_card.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:simple_live_app/app/app_style.dart';\nimport 'package:simple_live_app/app/utils.dart';\nimport 'package:simple_live_app/widgets/net_image.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\n\nclass SuperChatCard extends StatefulWidget {\n  final LiveSuperChatMessage message;\n  final Function()? onExpire;\n  final int? customCountdown;\n  const SuperChatCard(\n    this.message, {\n    required this.onExpire,\n    this.customCountdown,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  State<SuperChatCard> createState() => _SuperChatCardState();\n}\n\nclass _SuperChatCardState extends State<SuperChatCard> {\n  late Timer timer;\n\n  int countdown = 0;\n\n  @override\n  void initState() {\n    var currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n    var endTime = widget.message.endTime.millisecondsSinceEpoch ~/ 1000;\n\n    countdown = endTime - currentTime;\n\n    timer = Timer.periodic(const Duration(seconds: 1), timerCallback);\n\n    super.initState();\n  }\n\n  void timerCallback(e) {\n    if (countdown <= 0) {\n      widget.onExpire?.call();\n      timer.cancel();\n      return;\n    }\n\n    setState(() {\n      countdown -= 1;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final displayCountdown = widget.customCountdown ?? countdown;\n    return ClipRRect(\n      borderRadius: AppStyle.radius8,\n      child: Container(\n        decoration: BoxDecoration(\n          color: Utils.convertHexColor(widget.message.backgroundColor),\n        ),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            Padding(\n              padding: AppStyle.edgeInsetsA8,\n              child: Row(\n                children: [\n                  NetImage(\n                    widget.message.face,\n                    width: 48,\n                    height: 48,\n                    borderRadius: 36,\n                  ),\n                  AppStyle.hGap12,\n                  Expanded(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: [\n                        Text(\n                          widget.message.userName,\n                          style: const TextStyle(\n                            color: AppColors.black333,\n                          ),\n                        ),\n                        Text(\n                          \"￥${widget.message.price}\",\n                          style: const TextStyle(\n                            fontSize: 12,\n                            color: Colors.grey,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  Text(\n                    \"$displayCountdown\",\n                    style: const TextStyle(\n                      fontSize: 14,\n                      color: Colors.grey,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            Container(\n              decoration: BoxDecoration(\n                color:\n                    Utils.convertHexColor(widget.message.backgroundBottomColor),\n              ),\n              padding: AppStyle.edgeInsetsA8,\n              child: Text(\n                widget.message.message,\n                style: const TextStyle(color: Colors.white),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  void dispose() {\n    timer.cancel();\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "simple_live_app/linux/.gitignore",
    "content": "flutter/ephemeral\n"
  },
  {
    "path": "simple_live_app/linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.13)\nproject(runner LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"simple_live_app\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"com.xycz.simple_live_app\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Load bundled libraries from the lib/ directory relative to the binary.\nset(CMAKE_INSTALL_RPATH \"$ORIGIN/lib\")\n\n# Root filesystem for cross-building.\nif(FLUTTER_TARGET_PLATFORM_SYSROOT)\n  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n# Define build configuration options.\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n  set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n    STRING \"Flutter build mode\" FORCE)\n  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n    \"Debug\" \"Profile\" \"Release\")\nendif()\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_14)\n  target_compile_options(${TARGET} PRIVATE -Wall -Werror)\n  target_compile_options(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:-O3>\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:NDEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n\n# Only the install-generated bundle's copy of the executable will launch\n# correctly, since the resources must in the right relative locations. To avoid\n# people trying to run the unbundled copy, put it in a subdirectory instead of\n# the default top-level location.\nset_target_properties(${BINARY_NAME}\n  PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/intermediates_do_not_run\"\n)\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# By default, \"installing\" just makes a relocatable bundle in the build\n# directory.\nset(BUILD_BUNDLE_DIR \"${PROJECT_BINARY_DIR}/bundle\")\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\n# Start with a clean build bundle directory every time.\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${BUILD_BUNDLE_DIR}/\\\")\n  \" COMPONENT Runtime)\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nforeach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})\n  install(FILES \"${bundled_library}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendforeach(bundled_library)\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/linux/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\nif(NOT CMAKE_BUILD_TYPE MATCHES \"Debug\")\n  install(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n"
  },
  {
    "path": "simple_live_app/linux/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.10)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\n\n# Serves the same purpose as list(TRANSFORM ... PREPEND ...),\n# which isn't available in 3.10.\nfunction(list_prepend LIST_NAME PREFIX)\n    set(NEW_LIST \"\")\n    foreach(element ${${LIST_NAME}})\n        list(APPEND NEW_LIST \"${PREFIX}${element}\")\n    endforeach(element)\n    set(${LIST_NAME} \"${NEW_LIST}\" PARENT_SCOPE)\nendfunction()\n\n# === Flutter Library ===\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\npkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)\npkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)\n\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/libflutter_linux_gtk.so\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/lib/libapp.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"fl_basic_message_channel.h\"\n  \"fl_binary_codec.h\"\n  \"fl_binary_messenger.h\"\n  \"fl_dart_project.h\"\n  \"fl_engine.h\"\n  \"fl_json_message_codec.h\"\n  \"fl_json_method_codec.h\"\n  \"fl_message_codec.h\"\n  \"fl_method_call.h\"\n  \"fl_method_channel.h\"\n  \"fl_method_codec.h\"\n  \"fl_method_response.h\"\n  \"fl_plugin_registrar.h\"\n  \"fl_plugin_registry.h\"\n  \"fl_standard_message_codec.h\"\n  \"fl_standard_method_codec.h\"\n  \"fl_string_codec.h\"\n  \"fl_value.h\"\n  \"fl_view.h\"\n  \"flutter_linux.h\"\n)\nlist_prepend(FLUTTER_LIBRARY_HEADERS \"${EPHEMERAL_DIR}/flutter_linux/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}\")\ntarget_link_libraries(flutter INTERFACE\n  PkgConfig::GTK\n  PkgConfig::GLIB\n  PkgConfig::GIO\n)\nadd_dependencies(flutter flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CMAKE_CURRENT_BINARY_DIR}/_phony_\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh\"\n      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n)\n"
  },
  {
    "path": "simple_live_app/linux/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <dynamic_color/dynamic_color_plugin.h>\n#include <media_kit_libs_linux/media_kit_libs_linux_plugin.h>\n#include <media_kit_video/media_kit_video_plugin.h>\n#include <screen_retriever_linux/screen_retriever_linux_plugin.h>\n#include <url_launcher_linux/url_launcher_plugin.h>\n#include <volume_controller/volume_controller_plugin.h>\n#include <window_manager/window_manager_plugin.h>\n\nvoid fl_register_plugins(FlPluginRegistry* registry) {\n  g_autoptr(FlPluginRegistrar) dynamic_color_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"DynamicColorPlugin\");\n  dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);\n  g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"MediaKitLibsLinuxPlugin\");\n  media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar);\n  g_autoptr(FlPluginRegistrar) media_kit_video_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"MediaKitVideoPlugin\");\n  media_kit_video_plugin_register_with_registrar(media_kit_video_registrar);\n  g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"ScreenRetrieverLinuxPlugin\");\n  screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar);\n  g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"UrlLauncherPlugin\");\n  url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);\n  g_autoptr(FlPluginRegistrar) volume_controller_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"VolumeControllerPlugin\");\n  volume_controller_plugin_register_with_registrar(volume_controller_registrar);\n  g_autoptr(FlPluginRegistrar) window_manager_registrar =\n      fl_plugin_registry_get_registrar_for_plugin(registry, \"WindowManagerPlugin\");\n  window_manager_plugin_register_with_registrar(window_manager_registrar);\n}\n"
  },
  {
    "path": "simple_live_app/linux/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter_linux/flutter_linux.h>\n\n// Registers Flutter plugins.\nvoid fl_register_plugins(FlPluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "simple_live_app/linux/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  dynamic_color\n  media_kit_libs_linux\n  media_kit_video\n  screen_retriever_linux\n  url_launcher_linux\n  volume_controller\n  window_manager\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "simple_live_app/linux/packaging/deb/make_config.yaml",
    "content": "display_name: Simple-Live\npackage_name: simple-live\nmaintainer:\n  name: xiaoyaocz\n  email: xiaoyaocz@52uwp.com\npriority: optional\nsection: x11\ninstalled_size: 24400\nessential: false\nicon: assets/logo.png\n\nkeywords:\n  - Simple Live\n\ngeneric_name: Simple-Live\n\ncategories:\n  - Media\n\nstartup_notify: true\n"
  },
  {
    "path": "simple_live_app/linux/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME}\n  \"main.cc\"\n  \"my_application.cc\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the application ID.\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\n\n# Add dependency libraries. Add any application-specific dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter)\ntarget_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)\n\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n"
  },
  {
    "path": "simple_live_app/linux/runner/main.cc",
    "content": "#include \"my_application.h\"\n\nint main(int argc, char** argv) {\n  g_autoptr(MyApplication) app = my_application_new();\n  return g_application_run(G_APPLICATION(app), argc, argv);\n}\n"
  },
  {
    "path": "simple_live_app/linux/runner/my_application.cc",
    "content": "#include \"my_application.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#ifdef GDK_WINDOWING_X11\n#include <gdk/gdkx.h>\n#endif\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char** dart_entrypoint_arguments;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\n// Called when first Flutter frame received.\nstatic void first_frame_cb(MyApplication* self, FlView* view) {\n  gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view)));\n}\n\n// Implements GApplication::activate.\nstatic void my_application_activate(GApplication* application) {\n  MyApplication* self = MY_APPLICATION(application);\n  GtkWindow* window =\n      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));\n\n  // Use a header bar when running in GNOME as this is the common style used\n  // by applications and is the setup most users will be using (e.g. Ubuntu\n  // desktop).\n  // If running on X and not using GNOME then just use a traditional title bar\n  // in case the window manager does more exotic layout, e.g. tiling.\n  // If running on Wayland assume the header bar will work (may need changing\n  // if future cases occur).\n  gboolean use_header_bar = TRUE;\n#ifdef GDK_WINDOWING_X11\n  GdkScreen* screen = gtk_window_get_screen(window);\n  if (GDK_IS_X11_SCREEN(screen)) {\n    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);\n    if (g_strcmp0(wm_name, \"GNOME Shell\") != 0) {\n      use_header_bar = FALSE;\n    }\n  }\n#endif\n  if (use_header_bar) {\n    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());\n    gtk_widget_show(GTK_WIDGET(header_bar));\n    gtk_header_bar_set_title(header_bar, \"simple_live_app\");\n    gtk_header_bar_set_show_close_button(header_bar, TRUE);\n    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));\n  } else {\n    gtk_window_set_title(window, \"simple_live_app\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(\n      project, self->dart_entrypoint_arguments);\n\n  FlView* view = fl_view_new(project);\n  GdkRGBA background_color;\n  // Background defaults to black, override it here if necessary, e.g. #00000000\n  // for transparent.\n  gdk_rgba_parse(&background_color, \"#000000\");\n  fl_view_set_background_color(view, &background_color);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  // Show the window when Flutter renders.\n  // Requires the view to be realized so we can start rendering.\n  g_signal_connect_swapped(view, \"first-frame\", G_CALLBACK(first_frame_cb),\n                           self);\n  gtk_widget_realize(GTK_WIDGET(view));\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\n\n  gtk_widget_grab_focus(GTK_WIDGET(view));\n}\n\n// Implements GApplication::local_command_line.\nstatic gboolean my_application_local_command_line(GApplication* application,\n                                                  gchar*** arguments,\n                                                  int* exit_status) {\n  MyApplication* self = MY_APPLICATION(application);\n  // Strip out the first argument as it is the binary name.\n  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);\n\n  g_autoptr(GError) error = nullptr;\n  if (!g_application_register(application, nullptr, &error)) {\n    g_warning(\"Failed to register: %s\", error->message);\n    *exit_status = 1;\n    return TRUE;\n  }\n\n  g_application_activate(application);\n  *exit_status = 0;\n\n  return TRUE;\n}\n\n// Implements GApplication::startup.\nstatic void my_application_startup(GApplication* application) {\n  // MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application startup.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->startup(application);\n}\n\n// Implements GApplication::shutdown.\nstatic void my_application_shutdown(GApplication* application) {\n  // MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application shutdown.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);\n}\n\n// Implements GObject::dispose.\nstatic void my_application_dispose(GObject* object) {\n  MyApplication* self = MY_APPLICATION(object);\n  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);\n  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);\n}\n\nstatic void my_application_class_init(MyApplicationClass* klass) {\n  G_APPLICATION_CLASS(klass)->activate = my_application_activate;\n  G_APPLICATION_CLASS(klass)->local_command_line =\n      my_application_local_command_line;\n  G_APPLICATION_CLASS(klass)->startup = my_application_startup;\n  G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;\n  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;\n}\n\nstatic void my_application_init(MyApplication* self) {}\n\nMyApplication* my_application_new() {\n  // Set the program name to the application ID, which helps various systems\n  // like GTK and desktop environments map this running application to its\n  // corresponding .desktop file. This ensures better integration by allowing\n  // the application to be recognized beyond its binary name.\n  g_set_prgname(APPLICATION_ID);\n\n  return MY_APPLICATION(g_object_new(my_application_get_type(),\n                                     \"application-id\", APPLICATION_ID, \"flags\",\n                                     G_APPLICATION_NON_UNIQUE, nullptr));\n}\n"
  },
  {
    "path": "simple_live_app/linux/runner/my_application.h",
    "content": "#ifndef FLUTTER_MY_APPLICATION_H_\n#define FLUTTER_MY_APPLICATION_H_\n\n#include <gtk/gtk.h>\n\nG_DECLARE_FINAL_TYPE(MyApplication,\n                     my_application,\n                     MY,\n                     APPLICATION,\n                     GtkApplication)\n\n/**\n * my_application_new:\n *\n * Creates a new Flutter-based application.\n *\n * Returns: a new #MyApplication.\n */\nMyApplication* my_application_new();\n\n#endif  // FLUTTER_MY_APPLICATION_H_\n"
  },
  {
    "path": "simple_live_app/macos/.gitignore",
    "content": "# Flutter-related\n**/Flutter/ephemeral/\n**/Pods/\n\n# Xcode-related\n**/dgph\n**/xcuserdata/\n"
  },
  {
    "path": "simple_live_app/macos/Flutter/Flutter-Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/macos/Flutter/Flutter-Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/macos/Flutter/GeneratedPluginRegistrant.swift",
    "content": "//\n//  Generated file. Do not edit.\n//\n\nimport FlutterMacOS\nimport Foundation\n\nimport connectivity_plus\nimport device_info_plus\nimport dynamic_color\nimport file_picker\nimport flutter_inappwebview_macos\nimport media_kit_libs_macos_video\nimport media_kit_video\nimport network_info_plus\nimport package_info_plus\nimport path_provider_foundation\nimport screen_brightness_macos\nimport screen_retriever_macos\nimport share_plus\nimport url_launcher_macos\nimport volume_controller\nimport wakelock_plus\nimport window_manager\n\nfunc RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {\n  ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: \"ConnectivityPlusPlugin\"))\n  DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: \"DeviceInfoPlusMacosPlugin\"))\n  DynamicColorPlugin.register(with: registry.registrar(forPlugin: \"DynamicColorPlugin\"))\n  FilePickerPlugin.register(with: registry.registrar(forPlugin: \"FilePickerPlugin\"))\n  InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: \"InAppWebViewFlutterPlugin\"))\n  MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: \"MediaKitLibsMacosVideoPlugin\"))\n  MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: \"MediaKitVideoPlugin\"))\n  NetworkInfoPlusPlugin.register(with: registry.registrar(forPlugin: \"NetworkInfoPlusPlugin\"))\n  FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: \"FPPPackageInfoPlusPlugin\"))\n  PathProviderPlugin.register(with: registry.registrar(forPlugin: \"PathProviderPlugin\"))\n  ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: \"ScreenBrightnessMacosPlugin\"))\n  ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: \"ScreenRetrieverMacosPlugin\"))\n  SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: \"SharePlusMacosPlugin\"))\n  UrlLauncherPlugin.register(with: registry.registrar(forPlugin: \"UrlLauncherPlugin\"))\n  VolumeControllerPlugin.register(with: registry.registrar(forPlugin: \"VolumeControllerPlugin\"))\n  WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: \"WakelockPlusMacosPlugin\"))\n  WindowManagerPlugin.register(with: registry.registrar(forPlugin: \"WindowManagerPlugin\"))\n}\n"
  },
  {
    "path": "simple_live_app/macos/Podfile",
    "content": "platform :osx, '10.14'\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', 'ephemeral', '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 Flutter-Generated.xcconfig, then run \\\"flutter pub get\\\"\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_macos_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))\n  target 'RunnerTests' do\n    inherit! :search_paths\n  end\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_macos_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "simple_live_app/macos/Runner/AppDelegate.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\n@NSApplicationMain\nclass AppDelegate: FlutterAppDelegate {\n  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {\n    return true\n  }\n}\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n    \"images\": [\n        {\n            \"size\": \"16x16\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-16.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"16x16\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-16@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"32x32\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-32.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"32x32\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-32@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"128x128\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-128.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"128x128\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-128@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"256x256\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-256.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"256x256\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-256@2x.png\",\n            \"scale\": \"2x\"\n        },\n        {\n            \"size\": \"512x512\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-512.png\",\n            \"scale\": \"1x\"\n        },\n        {\n            \"size\": \"512x512\",\n            \"idiom\": \"mac\",\n            \"filename\": \"icon-512@2x.png\",\n            \"scale\": \"2x\"\n        }\n    ],\n    \"info\": {\n        \"version\": 1,\n        \"author\": \"icon.wuruihong.com\"\n    }\n}"
  },
  {
    "path": "simple_live_app/macos/Runner/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"applicationMenu\" destination=\"uQy-DD-JDr\" id=\"XBo-yE-nKs\"/>\n                <outlet property=\"mainFlutterWindow\" destination=\"QvC-M9-y7g\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"APP_NAME\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"APP_NAME\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About APP_NAME\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide APP_NAME\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit APP_NAME\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"EPT-qC-fAb\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"rJ0-wn-3NY\"/>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"142\" y=\"-258\"/>\n        </menu>\n        <window title=\"APP_NAME\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\" customClass=\"MainFlutterWindow\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"335\" y=\"390\" width=\"800\" height=\"600\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1577\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"800\" height=\"600\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Configs/AppInfo.xcconfig",
    "content": "// Application-level settings for the Runner target.\n//\n// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the\n// future. If not, the values below would default to using the project name when this becomes a\n// 'flutter create' template.\n\n// The application's name. By default this is also the title of the Flutter window.\nPRODUCT_NAME = Simple Live\n\n// The application's bundle identifier\nPRODUCT_BUNDLE_IDENTIFIER = com.xycz.simpleLiveApp\n\n// The copyright displayed in application information\nPRODUCT_COPYRIGHT = Copyright © 2023 com.xycz. All rights reserved.\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Configs/Debug.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Debug.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Configs/Release.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Release.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Configs/Warnings.xcconfig",
    "content": "WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings\nGCC_WARN_UNDECLARED_SELECTOR = YES\nCLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES\nCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE\nCLANG_WARN__DUPLICATE_METHOD_MATCH = YES\nCLANG_WARN_PRAGMA_PACK = YES\nCLANG_WARN_STRICT_PROTOTYPES = YES\nCLANG_WARN_COMMA = YES\nGCC_WARN_STRICT_SELECTOR_MATCH = YES\nCLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES\nGCC_WARN_SHADOW = YES\nCLANG_WARN_UNREACHABLE_CODE = YES\n"
  },
  {
    "path": "simple_live_app/macos/Runner/DebugProfile.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>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.cs.allow-jit</key>\n\t<true/>\n\t<key>com.apple.security.network.server</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n    <true/>\n\t<key>com.apple.security.files.user-selected.read-write</key>\n  \t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/macos/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>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></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>$(PRODUCT_NAME)</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>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_COPYRIGHT)</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/macos/Runner/MainFlutterWindow.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\nclass MainFlutterWindow: NSWindow {\n  override func awakeFromNib() {\n    let flutterViewController = FlutterViewController()\n    let windowFrame = self.frame\n    self.contentViewController = flutterViewController\n    self.setFrame(windowFrame, display: true)\n\n    RegisterGeneratedPlugins(registry: flutterViewController)\n\n    super.awakeFromNib()\n  }\n}\n"
  },
  {
    "path": "simple_live_app/macos/Runner/Release.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>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n    <true/>\n\t<key>com.apple.security.files.user-selected.read-write</key>\n  \t<true/>\n\t<key>com.apple.security.network.server</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/macos/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC111E2044C6BF0003C045 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Flutter Assemble\";\n\t\t\tproductName = FLX;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };\n\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };\n\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };\n\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };\n\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };\n\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };\n\t\t33E8CA35C15B26E48DA4EBD7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4C1377411379D99120C8F83 /* Pods_Runner.framework */; };\n\t\t9E6C57AAF7AD9FA590476061 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEF14C9BF8504F57660D2A38 /* Pods_RunnerTests.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC10EC2044A3C60003C045;\n\t\t\tremoteInfo = Runner;\n\t\t};\n\t\t33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC111A2044C6BA0003C045;\n\t\t\tremoteInfo = FLX;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t33CC110E2044A8840003C045 /* Bundle Framework */ = {\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 = \"Bundle Framework\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t22F821424EC724046ABB4672 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = \"<group>\"; };\n\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = \"<group>\"; };\n\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = \"<group>\"; };\n\t\t33CC10ED2044A3C60003C045 /* simple_live_app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = simple_live_app.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = \"<group>\"; };\n\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = \"<group>\"; };\n\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = \"Flutter-Generated.xcconfig\"; path = \"ephemeral/Flutter-Generated.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = \"<group>\"; };\n\t\t33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = \"<group>\"; };\n\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = \"<group>\"; };\n\t\t63D7158B8577651B73F3032F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.debug.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7E3E460DBF561AAF73690196 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.profile.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tAEF14C9BF8504F57660D2A38 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB51A5741C0A7E288C9368C1A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tC7907028FBA71F2E559043FF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD4C1377411379D99120C8F83 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD9BBDE6BF6193671AE9960B0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.release.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t331C80D2294CF70F00263BE5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9E6C57AAF7AD9FA590476061 /* Pods_RunnerTests.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EA2044A3C60003C045 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33E8CA35C15B26E48DA4EBD7 /* 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\t24357D9109B54496E939BAD5 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t22F821424EC724046ABB4672 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\tC7907028FBA71F2E559043FF /* Pods-Runner.release.xcconfig */,\n\t\t\t\tB51A5741C0A7E288C9368C1A /* Pods-Runner.profile.xcconfig */,\n\t\t\t\t63D7158B8577651B73F3032F /* Pods-RunnerTests.debug.xcconfig */,\n\t\t\t\tD9BBDE6BF6193671AE9960B0 /* Pods-RunnerTests.release.xcconfig */,\n\t\t\t\t7E3E460DBF561AAF73690196 /* Pods-RunnerTests.profile.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t331C80D6294CF71000263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */,\n\t\t\t);\n\t\t\tpath = RunnerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33BA886A226E78AF003329D5 /* Configs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */,\n\t\t\t);\n\t\t\tpath = Configs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10E42044A3C60003C045 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33FAB671232836740065AC1E /* Runner */,\n\t\t\t\t33CEB47122A05771004F2AC0 /* Flutter */,\n\t\t\t\t331C80D6294CF71000263BE5 /* RunnerTests */,\n\t\t\t\t33CC10EE2044A3C60003C045 /* Products */,\n\t\t\t\tD73912EC22F37F3D000D13A0 /* Frameworks */,\n\t\t\t\t24357D9109B54496E939BAD5 /* Pods */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10EE2044A3C60003C045 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10ED2044A3C60003C045 /* simple_live_app.app */,\n\t\t\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC11242044D66E0003C045 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */,\n\t\t\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */,\n\t\t\t\t33CC10F72044A3C60003C045 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CEB47122A05771004F2AC0 /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,\n\t\t\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,\n\t\t\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,\n\t\t\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,\n\t\t\t);\n\t\t\tpath = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33FAB671232836740065AC1E /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */,\n\t\t\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,\n\t\t\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */,\n\t\t\t\t33E51914231749380026EE4D /* Release.entitlements */,\n\t\t\t\t33CC11242044D66E0003C045 /* Resources */,\n\t\t\t\t33BA886A226E78AF003329D5 /* Configs */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD73912EC22F37F3D000D13A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD4C1377411379D99120C8F83 /* Pods_Runner.framework */,\n\t\t\t\tAEF14C9BF8504F57660D2A38 /* Pods_RunnerTests.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\t331C80D4294CF70F00263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1C0ABA43D8228815BB859BFE /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t331C80D1294CF70F00263BE5 /* Sources */,\n\t\t\t\t331C80D2294CF70F00263BE5 /* Frameworks */,\n\t\t\t\t331C80D3294CF70F00263BE5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RunnerTests;\n\t\t\tproductName = RunnerTests;\n\t\t\tproductReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t33CC10EC2044A3C60003C045 /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t671FAACF9F58D03A0C709E83 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t33CC10E92044A3C60003C045 /* Sources */,\n\t\t\t\t33CC10EA2044A3C60003C045 /* Frameworks */,\n\t\t\t\t33CC10EB2044A3C60003C045 /* Resources */,\n\t\t\t\t33CC110E2044A8840003C045 /* Bundle Framework */,\n\t\t\t\t3399D490228B24CF009A79C7 /* ShellScript */,\n\t\t\t\tA261E453836422CA4D990339 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 33CC10ED2044A3C60003C045 /* simple_live_app.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t33CC10E52044A3C60003C045 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t331C80D4294CF70F00263BE5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.0;\n\t\t\t\t\t\tTestTargetID = 33CC10EC2044A3C60003C045;\n\t\t\t\t\t};\n\t\t\t\t\t33CC10EC2044A3C60003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.Sandbox = {\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\t33CC111A2044C6BA0003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 33CC10E42044A3C60003C045;\n\t\t\tproductRefGroup = 33CC10EE2044A3C60003C045 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t33CC10EC2044A3C60003C045 /* Runner */,\n\t\t\t\t331C80D4294CF70F00263BE5 /* RunnerTests */,\n\t\t\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t331C80D3294CF70F00263BE5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EB2044A3C60003C045 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,\n\t\t\t\t33CC10F62044A3C60003C045 /* MainMenu.xib 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\t1C0ABA43D8228815BB859BFE /* [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-RunnerTests-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\t3399D490228B24CF009A79C7 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\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);\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"echo \\\"$PRODUCT_NAME.app\\\" > \\\"$PROJECT_DIR\\\"/Flutter/ephemeral/.app_filename && \\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh embed\\n\";\n\t\t};\n\t\t33CC111E2044C6BF0003C045 /* ShellScript */ = {\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\tFlutter/ephemeral/FlutterInputs.xcfilelist,\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\tFlutter/ephemeral/tripwire,\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterOutputs.xcfilelist,\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire\";\n\t\t};\n\t\t671FAACF9F58D03A0C709E83 /* [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\tA261E453836422CA4D990339 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t331C80D1294CF70F00263BE5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10E92044A3C60003C045 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,\n\t\t\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,\n\t\t\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC10EC2044A3C60003C045 /* Runner */;\n\t\t\ttargetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;\n\t\t};\n\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;\n\t\t\ttargetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F52044A3C60003C045 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t331C80DB294CF71000263BE5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 63D7158B8577651B73F3032F /* Pods-RunnerTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.xycz.simpleLiveApp.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/simple_live_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/simple_live_app\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t331C80DC294CF71000263BE5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D9BBDE6BF6193671AE9960B0 /* Pods-RunnerTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.xycz.simpleLiveApp.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/simple_live_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/simple_live_app\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t331C80DD294CF71000263BE5 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7E3E460DBF561AAF73690196 /* Pods-RunnerTests.profile.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.xycz.simpleLiveApp.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/simple_live_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/simple_live_app\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CE9231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_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_DOCUMENTATION_COMMENTS = YES;\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_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_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\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 = gnu11;\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_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\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEA231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.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/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEB231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t33CC10F92044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_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_DOCUMENTATION_COMMENTS = YES;\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_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_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\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 = gnu11;\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_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\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FA2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_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_DOCUMENTATION_COMMENTS = YES;\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_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_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\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 = gnu11;\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_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\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC10FC2044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.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/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FD2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.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/Release.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC111C2044C6BA0003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC111D2044C6BA0003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t331C80DB294CF71000263BE5 /* Debug */,\n\t\t\t\t331C80DC294CF71000263BE5 /* Release */,\n\t\t\t\t331C80DD294CF71000263BE5 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10F92044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FA2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CE9231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10FC2044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FD2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CEA231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC111C2044C6BA0003C045 /* Debug */,\n\t\t\t\t33CC111D2044C6BA0003C045 /* Release */,\n\t\t\t\t338D0CEB231458BD00FA5F75 /* 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 = 33CC10E52044A3C60003C045 /* Project object */;\n}\n"
  },
  {
    "path": "simple_live_app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "simple_live_app/macos/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 = \"33CC10EC2044A3C60003C045\"\n               BuildableName = \"simple_live_app.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 = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"simple_live_app.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\"\n            parallelizable = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"331C80D4294CF70F00263BE5\"\n               BuildableName = \"RunnerTests.xctest\"\n               BlueprintName = \"RunnerTests\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\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 = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"simple_live_app.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 = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"simple_live_app.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": "simple_live_app/macos/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": "simple_live_app/macos/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": "simple_live_app/macos/RunnerTests/RunnerTests.swift",
    "content": "import FlutterMacOS\nimport Cocoa\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add code to the Runner application, consider adding tests here.\n    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.\n  }\n\n}\n"
  },
  {
    "path": "simple_live_app/macos/packaging/dmg/make_config.yaml",
    "content": "title: Simple Live\ncontents:\n  - x: 448\n    y: 344\n    type: link\n    path: \"/Applications\"\n  - x: 192\n    y: 344\n    type: file\n    path: Simple Live.app\n"
  },
  {
    "path": "simple_live_app/pubspec.yaml",
    "content": "name: simple_live_app\nversion: 1.11.4+11104\npublish_to: none\ndescription: \"Simple Live APP\"\nenvironment:\n  sdk: \">=3.0.5 <4.0.0\"\n\ndependencies:\n  simple_live_core:\n    path: ../simple_live_core\n  # 图标\n  cupertino_icons: ^1.0.8\n  remixicon: ^1.4.1 #Remix图标\n\n  # 框架、工具\n  get: ^4.7.3 #状态管理、路由管理、国际化\n  dio: ^5.9.0 #网络请求\n  hive: 2.2.3 #持久化存储\n  hive_flutter: 1.1.0 #持久化存储\n  logger: ^2.6.2 #日志\n  intl: ^0.20.2 #国际化\n  qr_flutter: ^4.1.0 #二维码生成\n  dynamic_color: ^1.8.1 #动态颜色\n  path: any\n  collection: any\n  udp: ^5.0.3 #UDP\n  uuid: ^4.5.2 #UUID\n  webdav_client: ^1.2.2 # WebDAV\n  archive: ^4.0.7 #文件压缩\n  crypto: ^3.0.7\n\n  #Widget\n  flutter_staggered_grid_view: ^0.7.0 #瀑布流/GridView\n  flutter_easyrefresh: 2.2.2 #下拉刷新、上拉加载\n  extended_image: ^10.0.1 #拓展Image,支持缓存\n  flutter_smart_dialog: ^4.9.8+9 #各种弹窗 Toast/Dialog/Popup\n  sticky_headers: ^0.3.0+2 #吸顶\n  lottie: ^3.3.2 #lottie动画\n  canvas_danmaku: ^0.2.7\n  # ns_danmaku: #弹幕\n  #   git:\n  #     url: https://github.com/xiaoyaocz/flutter_ns_danmaku.git\n  #     tag: v0.0.9\n\n  #系统交互\n  package_info_plus: ^9.0.0 #包信息\n  device_info_plus: ^12.2.0 #设备信息\n  url_launcher: ^6.3.2 #打开链接\n  share_plus: ^12.0.1 #分享\n  path_provider: ^2.1.5 #常用路径\n  cross_file: ^0.3.5 #跨平台文件\n  permission_handler: ^12.0.1 #权限处理\n  image_gallery_saver_plus: ^4.0.1 #图片保存到相册\n  screen_brightness: ^2.1.7 #亮度控制\n  auto_orientation_v2: ^2.3.6 #屏幕方向\n  wakelock_plus: ^1.4.0 #屏幕常亮\n  file_picker: ^10.3.7 #文件选择\n  window_manager: ^0.5.1 #窗口管理\n  floating: ^6.0.0 #PIP画中画\n  flutter_inappwebview: ^6.1.5 #WebView\n  connectivity_plus: ^7.0.0 #网络状态\n  qr_code_scanner_plus: ^2.0.14 #二维码扫描\n  volume_controller: ^3.4.0 #音量控制\n\n  # 网络相关\n  shelf: ^1.4.2\n  shelf_router: ^1.1.4\n  network_info_plus: ^7.0.0\n  signalr_netcore: ^1.4.4 #SignalR\n\n  # 视频播放\n  media_kit: ^1.2.2\n  media_kit_video: ^2.0.0\n  media_kit_libs_video: ^1.0.7\n\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n\n\ndev_dependencies:\n  flutter_lints: ^2.0.0\n  build_runner: ^2.3.3\n  hive_generator: ^2.0.0\n  flutter_launcher_icons: ^0.13.1\n  flutter_test:\n    sdk: flutter\n\nflutter_launcher_icons:\n  android: true\n  ios: true\n  image_path: \"assets/logo.png\"\n  min_sdk_android: 21\n  macos:\n    generate: true\n\nflutter:\n  uses-material-design: true\n  assets:\n    - assets/statement.txt\n    - assets/images/\n    - assets/icons/\n    - assets/lotties/\n"
  },
  {
    "path": "simple_live_app/test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility in the flutter_test package. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:simple_live_app/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(const MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  },
  {
    "path": "simple_live_app/windows/.gitignore",
    "content": "flutter/ephemeral/\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n"
  },
  {
    "path": "simple_live_app/windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(simple_live_app LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"simple_live_app\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(VERSION 3.14...3.25)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\")\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/windows/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n"
  },
  {
    "path": "simple_live_app/windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# Set fallback configurations for older versions of the flutter tool.\nif (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n  set(FLUTTER_TARGET_PLATFORM \"windows-x64\")\nendif()\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "simple_live_app/windows/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <connectivity_plus/connectivity_plus_windows_plugin.h>\n#include <dynamic_color/dynamic_color_plugin_c_api.h>\n#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>\n#include <media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h>\n#include <media_kit_video/media_kit_video_plugin_c_api.h>\n#include <permission_handler_windows/permission_handler_windows_plugin.h>\n#include <screen_brightness_windows/screen_brightness_windows_plugin.h>\n#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>\n#include <share_plus/share_plus_windows_plugin_c_api.h>\n#include <url_launcher_windows/url_launcher_windows.h>\n#include <volume_controller/volume_controller_plugin_c_api.h>\n#include <window_manager/window_manager_plugin.h>\n\nvoid RegisterPlugins(flutter::PluginRegistry* registry) {\n  ConnectivityPlusWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ConnectivityPlusWindowsPlugin\"));\n  DynamicColorPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"DynamicColorPluginCApi\"));\n  FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"FlutterInappwebviewWindowsPluginCApi\"));\n  MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitLibsWindowsVideoPluginCApi\"));\n  MediaKitVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitVideoPluginCApi\"));\n  PermissionHandlerWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"PermissionHandlerWindowsPlugin\"));\n  ScreenBrightnessWindowsPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ScreenBrightnessWindowsPlugin\"));\n  ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"ScreenRetrieverWindowsPluginCApi\"));\n  SharePlusWindowsPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"SharePlusWindowsPluginCApi\"));\n  UrlLauncherWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"UrlLauncherWindows\"));\n  VolumeControllerPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"VolumeControllerPluginCApi\"));\n  WindowManagerPluginRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"WindowManagerPlugin\"));\n}\n"
  },
  {
    "path": "simple_live_app/windows/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter/plugin_registry.h>\n\n// Registers Flutter plugins.\nvoid RegisterPlugins(flutter::PluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "simple_live_app/windows/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  connectivity_plus\n  dynamic_color\n  flutter_inappwebview_windows\n  media_kit_libs_windows_video\n  media_kit_video\n  permission_handler_windows\n  screen_brightness_windows\n  screen_retriever_windows\n  share_plus\n  url_launcher_windows\n  volume_controller\n  window_manager\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "simple_live_app/windows/packaging/msix/make_config.yaml",
    "content": "display_name: Simple Live\npublisher_display_name: xiaoyaocz\nidentity_name: com.xycz.simplelive\nlogo_path: assets/logo_400.png\ncapabilities: internetClient\nlanguages: zh-cn\ninstall_certificate: \"false\""
  },
  {
    "path": "simple_live_app/windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_link_libraries(${BINARY_NAME} PRIVATE \"dwmapi.lib\")\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "simple_live_app/windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"com.xycz\" \"\\0\"\n            VALUE \"FileDescription\", \"simple_live_app\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"simple_live_app\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2025 com.xycz. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"simple_live_app.exe\" \"\\0\"\n            VALUE \"ProductName\", \"simple_live_app\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "simple_live_app/windows/runner/flutter_window.cpp",
    "content": "#include \"flutter_window.h\"\n\n#include <optional>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nbool FlutterWindow::OnCreate() {\n  if (!Win32Window::OnCreate()) {\n    return false;\n  }\n\n  RECT frame = GetClientArea();\n\n  // The size here must match the window dimensions to avoid unnecessary surface\n  // creation / destruction in the startup path.\n  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n      frame.right - frame.left, frame.bottom - frame.top, project_);\n  // Ensure that basic setup of the controller was successful.\n  if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n    return false;\n  }\n  RegisterPlugins(flutter_controller_->engine());\n  SetChildContent(flutter_controller_->view()->GetNativeWindow());\n\n  flutter_controller_->engine()->SetNextFrameCallback([&]() {\n    this->Show();\n  });\n\n  // Flutter can complete the first frame before the \"show window\" callback is\n  // registered. The following call ensures a frame is pending to ensure the\n  // window is shown. It is a no-op if the first frame hasn't completed yet.\n  flutter_controller_->ForceRedraw();\n\n  return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n  if (flutter_controller_) {\n    std::optional<LRESULT> result =\n        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n    if (result) {\n      return *result;\n    }\n  }\n\n  switch (message) {\n    case WM_FONTCHANGE:\n      flutter_controller_->engine()->ReloadSystemFonts();\n      break;\n  }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}\n"
  },
  {
    "path": "simple_live_app/windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "simple_live_app/windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.Create(L\"simple_live_app\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "simple_live_app/windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "simple_live_app/windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "simple_live_app/windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  unsigned int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr)\n    -1; // remove the trailing null character\n  int input_length = (int)wcslen(utf16_string);\n  std::string utf8_string;\n  if (target_length == 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      input_length, utf8_string.data(), target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "simple_live_app/windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "simple_live_app/windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <dwmapi.h>\n#include <flutter_windows.h>\n\n#include \"resource.h\"\n\nnamespace {\n\n/// Window attribute that enables dark mode window decorations.\n///\n/// Redefined in case the developer's machine has a Windows SDK older than\n/// version 10.0.22000.0.\n/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute\n#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE\n#define DWMWA_USE_IMMERSIVE_DARK_MODE 20\n#endif\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n/// Registry key for app theme preference.\n///\n/// A value of 0 indicates apps should use dark mode. A non-zero or missing\n/// value indicates apps should use light mode.\nconstexpr const wchar_t kGetPreferredBrightnessRegKey[] =\n  L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\";\nconstexpr const wchar_t kGetPreferredBrightnessRegValue[] = L\"AppsUseLightTheme\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n  }\n  FreeLibrary(user32_module);\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registrar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::Create(const std::wstring& title,\n                         const Point& origin,\n                         const Size& size) {\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  UpdateTheme(window);\n\n  return OnCreate();\n}\n\nbool Win32Window::Show() {\n  return ShowWindow(window_handle_, SW_SHOWNORMAL);\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n\n    case WM_DWMCOLORIZATIONCOLORCHANGED:\n      UpdateTheme(hwnd);\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n\nvoid Win32Window::UpdateTheme(HWND const window) {\n  DWORD light_mode;\n  DWORD light_mode_size = sizeof(light_mode);\n  LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,\n                               kGetPreferredBrightnessRegValue,\n                               RRF_RT_REG_DWORD, nullptr, &light_mode,\n                               &light_mode_size);\n\n  if (result == ERROR_SUCCESS) {\n    BOOL enable_dark_mode = light_mode == 0;\n    DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,\n                          &enable_dark_mode, sizeof(enable_dark_mode));\n  }\n}\n"
  },
  {
    "path": "simple_live_app/windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates a win32 window with |title| that is positioned and sized using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size this function will scale the inputted width and height as\n  // as appropriate for the default monitor. The window is invisible until\n  // |Show| is called. Returns true if the window was created successfully.\n  bool Create(const std::wstring& title, const Point& origin, const Size& size);\n\n  // Show the current window. Returns true if the window was successfully shown.\n  bool Show();\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  // Update the window frame's theme to match the system theme.\n  static void UpdateTheme(HWND const window);\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  },
  {
    "path": "simple_live_console/.gitignore",
    "content": "# https://dart.dev/guides/libraries/private-files\n# Created by `dart pub`\n.dart_tool/\nbuild/\npubspec.lock"
  },
  {
    "path": "simple_live_console/.vscode/launch.json",
    "content": "{\n    // 使用 IntelliSense 了解相关属性。 \n    // 悬停以查看现有属性的描述。\n    // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Dart & Flutter\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"program\": \"bin/simple_live_console.dart\",\n            \"args\": [\n                \"-d\",\n                \"https://www.douyu.com/1126960\"\n            ]\n        }\n    ]\n}"
  },
  {
    "path": "simple_live_console/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "simple_live_console/README.md",
    "content": "# simple_live_console\n\n基于simple_live_core的控制台程序。\n\n输入直播间播放直链获取信息及播放地址：\n\n```\nsimple_live.exe -i [URL]\n```\n\n输入直播间链接获取弹幕：\n\n```\nsimple_live.exe -d [URL]\n```"
  },
  {
    "path": "simple_live_console/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "simple_live_console/bin/simple_live_console.dart",
    "content": "import 'dart:io';\n\nimport 'package:simple_live_core/simple_live_core.dart';\n\nvoid main(List<String> arguments) async {\n  CoreLog.enableLog = false;\n  if (arguments.isEmpty) {\n    printHelp();\n    return;\n  }\n\n  var action = arguments.first.toLowerCase().replaceAll(\"-\", \"\");\n  if (arguments.length < 2) {\n    print(\"错误的参数\");\n    printHelp();\n    return;\n  }\n  var url = arguments[1];\n  if (url.isEmpty) {\n    print(\"[URL]不能为空\");\n    printHelp();\n    return;\n  }\n  if (action == \"i\") {\n    await printInfo(url);\n  } else if (action == \"d\") {\n    printDanmaku(url);\n  } else if (action == \"h\") {\n    printHelp();\n  } else {\n    print(\"未知指令:$action\");\n    printHelp();\n  }\n}\n\nvoid printHelp() {\n  print(\"-i [URL] ：获取直播间信息及播放直链\");\n  print(\"-d [URL] ：持续输出直播间弹幕\");\n}\n\nFuture printInfo(String url) async {\n  var urlInfo = parseUrl(url);\n  LiveSite site = urlInfo.first;\n  var id = urlInfo.last;\n  var detail = await site.getRoomDetail(roomId: id);\n  print(\"来源：${site.name}\");\n  print(\"房间号：${detail.roomId}\");\n  print(\"房间标题：${detail.title}\");\n  print(\"直播用户：${detail.userName}\");\n  print(\"人气值：${detail.online}\");\n  print(\"状态：${(detail.status ? \"直播中\" : \"未开播\")}\");\n  if (detail.status) {\n    print(\"可用清晰度：\");\n    var quality = await site.getPlayQualites(detail: detail);\n\n    for (int i = 0; i < quality.length; i++) {\n      print(\"【${i + 1}】${quality[i].quality}\");\n    }\n    print(\"请输入【】内数字，获取对应清晰度的直链\");\n    var input = stdin.readLineSync() ?? \"\";\n    print(\"正在获取直链...\");\n    var index = int.tryParse(input) ?? 0;\n    if (index > 0) {\n      var url =\n          await site.getPlayUrls(detail: detail, quality: quality[index - 1]);\n      for (int i = 0; i < url.urls.length; i++) {\n        print(\"线路${i + 1}:\\r\\n${url.urls[i]}\");\n      }\n    }\n  }\n}\n\nFuture printDanmaku(String url) async {\n  var urlInfo = parseUrl(url);\n  LiveSite site = urlInfo.first;\n  var id = urlInfo.last;\n  var detail = await site.getRoomDetail(roomId: id);\n  print(\"来源：${site.name}\");\n  print(\"房间号：${detail.roomId}\");\n  print(\"房间标题：${detail.title}\");\n  print(\"直播用户：${detail.userName}\");\n  print(\"状态：${(detail.status ? \"直播中\" : \"未开播\")}\");\n  var danmaku = site.getDanmaku();\n  danmaku.onMessage = (LiveMessage e) {\n    if (e.type == LiveMessageType.online) {\n      print(\"-----人气值：${e.data}-----\");\n    } else if (e.type == LiveMessageType.chat) {\n      print(\"${e.userName}：${e.message}\");\n    }\n  };\n  danmaku.onClose = (String e) {\n    print(e);\n  };\n\n  print(\"【开始获取弹幕】\");\n  await danmaku.start(detail.danmakuData);\n  await Future(() {});\n}\n\nList parseUrl(String url) {\n  if (url.contains(\"bilibili.com\")) {\n    var id =\n        RegExp(r\"bilibili\\.com/([\\d|\\w]+)\").firstMatch(url)?.group(1) ?? \"\";\n    return [BiliBiliSite(), id];\n  }\n  if (url.contains(\"huya.com\")) {\n    var id = RegExp(r\"huya\\.com/([\\d|\\w]+)\").firstMatch(url)?.group(1) ?? \"\";\n    return [HuyaSite(), id];\n  }\n  if (url.contains(\"douyu.com\")) {\n    var id = RegExp(r\"douyu\\.com/([\\d|\\w]+)\").firstMatch(url)?.group(1) ?? \"\";\n    return [DouyuSite(), id];\n  }\n  if (url.contains(\"live.douyin.com\")) {\n    var id =\n        RegExp(r\"live\\.douyin\\.com/([\\d|\\w]+)\").firstMatch(url)?.group(1) ?? \"\";\n    return [DouyinSite(), id];\n  }\n  throw Exception(\"链接解析失败\");\n}\n"
  },
  {
    "path": "simple_live_console/pubspec.yaml",
    "content": "name: simple_live_console\ndescription: A sample command-line application.\nversion: 1.0.0\npublish_to: \"none\"\n# repository: https://github.com/my_org/my_repo\n\nenvironment:\n  sdk: '>=3.10.0'\n\ndependencies:\n  simple_live_core:\n    path: ../simple_live_core\n\ndev_dependencies:\n  lints: ^2.0.0\n  test: ^1.21.0\n"
  },
  {
    "path": "simple_live_console/test/all_live_console_test.dart",
    "content": "import 'package:test/test.dart';\n\nvoid main() {\n  test('calculate', () {});\n}\n"
  },
  {
    "path": "simple_live_core/.gitignore",
    "content": "# https://dart.dev/guides/libraries/private-files\n# Created by `dart pub`\n.dart_tool/\n\n# Avoid committing pubspec.lock for library packages; see\n# https://dart.dev/guides/libraries/private-files#pubspeclock.\npubspec.lock\n\n.fvm/"
  },
  {
    "path": "simple_live_core/.vscode/launch.json",
    "content": "{\n    // 使用 IntelliSense 了解相关属性。 \n    // 悬停以查看现有属性的描述。\n    // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"simple_live_core\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"program\": \"example/simple_live_core_example.dart\"\n        }\n    ]\n}"
  },
  {
    "path": "simple_live_core/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "simple_live_core/README.md",
    "content": "# simple_live_core\n\n项目核心库，实现获取各个网站的信息及弹幕。\n"
  },
  {
    "path": "simple_live_core/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "simple_live_core/example/simple_live_core_example.dart",
    "content": "void main() async {\n  print('Hello, World!');\n}\n"
  },
  {
    "path": "simple_live_core/lib/simple_live_core.dart",
    "content": "library simple_live_core;\n\nexport 'src/interface/live_site.dart';\nexport 'src/interface/live_danmaku.dart';\nexport 'src/huya_site.dart';\nexport 'src/bilibili_site.dart';\nexport 'src/douyu_site.dart';\nexport 'src/douyin_site.dart';\nexport 'src/common/core_log.dart';\nexport 'src/model/live_message.dart';\nexport 'src/danmaku/bilibili_danmaku.dart';\nexport 'src/danmaku/douyu_danmaku.dart';\nexport 'src/danmaku/huya_danmaku.dart';\nexport 'src/danmaku/douyin_danmaku.dart';\n\nexport 'src/model/live_category_result.dart';\nexport 'src/model/live_category.dart';\nexport 'src/model/live_play_quality.dart';\nexport 'src/model/live_room_detail.dart';\nexport 'src/model/live_room_item.dart';\nexport 'src/model/live_search_result.dart';\nexport 'src/model/live_anchor_item.dart';\nexport 'src/model/live_play_url.dart';\n"
  },
  {
    "path": "simple_live_core/lib/src/bilibili_site.dart",
    "content": "import 'dart:convert';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:simple_live_core/src/common/convert_helper.dart';\nimport 'package:simple_live_core/src/common/http_client.dart';\nimport 'package:simple_live_core/src/danmaku/bilibili_danmaku.dart';\nimport 'package:simple_live_core/src/interface/live_danmaku.dart';\nimport 'package:simple_live_core/src/interface/live_site.dart';\nimport 'package:simple_live_core/src/model/live_anchor_item.dart';\nimport 'package:simple_live_core/src/model/live_category.dart';\nimport 'package:simple_live_core/src/model/live_message.dart';\nimport 'package:simple_live_core/src/model/live_play_url.dart';\nimport 'package:simple_live_core/src/model/live_room_item.dart';\nimport 'package:simple_live_core/src/model/live_search_result.dart';\nimport 'package:simple_live_core/src/model/live_room_detail.dart';\nimport 'package:simple_live_core/src/model/live_play_quality.dart';\nimport 'package:simple_live_core/src/model/live_category_result.dart';\n\nclass BiliBiliSite implements LiveSite {\n  @override\n  String id = \"bilibili\";\n\n  @override\n  String name = \"哔哩哔哩直播\";\n\n  String cookie = \"\";\n  int userId = 0;\n\n  @override\n  LiveDanmaku getDanmaku() => BiliBiliDanmaku();\n\n  static const String kDefaultUserAgent =\n      \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\";\n  static const String kDefaultReferer = \"https://live.bilibili.com/\";\n\n  String buvid3 = \"\";\n  String buvid4 = \"\";\n  String accessId = \"\";\n  Future<Map<String, String>> getHeader() async {\n    if (buvid3.isEmpty) {\n      var buvidInfo = await getBuvid();\n      buvid3 = buvidInfo[\"b_3\"] ?? \"\";\n      buvid4 = buvidInfo[\"b_4\"] ?? \"\";\n    }\n    return cookie.isEmpty\n        ? {\n            \"user-agent\": kDefaultUserAgent,\n            \"referer\": kDefaultReferer,\n            \"cookie\": 'buvid3=$buvid3;buvid4=$buvid4;',\n          }\n        : {\n            \"cookie\": cookie.contains(\"buvid3\")\n                ? cookie\n                : \"$cookie;buvid3=$buvid3;buvid4=$buvid4;\",\n            \"user-agent\": kDefaultUserAgent,\n            \"referer\": kDefaultReferer,\n          };\n  }\n\n  @override\n  Future<List<LiveCategory>> getCategores() async {\n    List<LiveCategory> categories = [];\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/room/v1/Area/getList\",\n      queryParameters: {\n        \"need_entrance\": 1,\n        \"parent_id\": 0,\n      },\n      header: await getHeader(),\n    );\n    for (var item in result[\"data\"]) {\n      List<LiveSubCategory> subs = [];\n      for (var subItem in item[\"list\"]) {\n        var subCategory = LiveSubCategory(\n          id: subItem[\"id\"].toString(),\n          name: asT<String?>(subItem[\"name\"]) ?? \"\",\n          parentId: asT<String?>(subItem[\"parent_id\"]) ?? \"\",\n          pic: \"${asT<String?>(subItem[\"pic\"]) ?? \"\"}@100w.png\",\n        );\n        subs.add(subCategory);\n      }\n      var category = LiveCategory(\n        children: subs,\n        id: item[\"id\"].toString(),\n        name: asT<String?>(item[\"name\"]) ?? \"\",\n      );\n      categories.add(category);\n    }\n    return categories;\n  }\n\n  @override\n  Future<LiveCategoryResult> getCategoryRooms(LiveSubCategory category,\n      {int page = 1}) async {\n    const baseUrl =\n        \"https://api.live.bilibili.com/xlive/web-interface/v1/second/getList\";\n\n    var url =\n        \"$baseUrl?platform=web&parent_area_id=${category.parentId}&area_id=${category.id}&sort_type=&page=$page&w_webid=${await getAccessId()}\";\n\n    var queryParams = await getWbiSign(url);\n\n    var result = await HttpClient.instance.getJson(\n      baseUrl,\n      queryParameters: queryParams,\n      header: await getHeader(),\n    );\n\n    var hasMore = result[\"data\"][\"has_more\"] == 1;\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"list\"]) {\n      var roomItem = LiveRoomItem(\n        roomId: item[\"roomid\"].toString(),\n        title: item[\"title\"].toString(),\n        cover: \"${item[\"cover\"]}@400w.jpg\",\n        userName: item[\"uname\"].toString(),\n        online: int.tryParse(item[\"online\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<List<LivePlayQuality>> getPlayQualites(\n      {required LiveRoomDetail detail}) async {\n    List<LivePlayQuality> qualities = [];\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo\",\n      queryParameters: {\n        \"room_id\": detail.roomId,\n        \"protocol\": \"0,1\",\n        \"format\": \"0,1,2\",\n        \"codec\": \"0,1\",\n        \"platform\": \"web\",\n      },\n      header: await getHeader(),\n    );\n    var qualitiesMap = <int, String>{};\n    for (var item in result[\"data\"][\"playurl_info\"][\"playurl\"][\"g_qn_desc\"]) {\n      qualitiesMap[int.tryParse(item[\"qn\"].toString()) ?? 0] =\n          item[\"desc\"].toString();\n    }\n\n    for (var item in result[\"data\"][\"playurl_info\"][\"playurl\"][\"stream\"][0]\n        [\"format\"][0][\"codec\"][0][\"accept_qn\"]) {\n      var qualityItem = LivePlayQuality(\n        quality: qualitiesMap[item] ?? \"未知清晰度\",\n        data: item,\n      );\n      qualities.add(qualityItem);\n    }\n    return qualities;\n  }\n\n  @override\n  Future<LivePlayUrl> getPlayUrls(\n      {required LiveRoomDetail detail,\n      required LivePlayQuality quality}) async {\n    List<String> urls = [];\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo\",\n      queryParameters: {\n        \"room_id\": detail.roomId,\n        \"protocol\": \"0,1\",\n        \"format\": \"0,2\",\n        \"codec\": \"0\",\n        \"platform\": \"web\",\n        \"qn\": quality.data,\n      },\n      header: await getHeader(),\n    );\n    var streamList = result[\"data\"][\"playurl_info\"][\"playurl\"][\"stream\"];\n    for (var streamItem in streamList) {\n      var formatList = streamItem[\"format\"];\n      for (var formatItem in formatList) {\n        var codecList = formatItem[\"codec\"];\n        for (var codecItem in codecList) {\n          var urlList = codecItem[\"url_info\"];\n          var baseUrl = codecItem[\"base_url\"].toString();\n          for (var urlItem in urlList) {\n            urls.add(\n              \"${urlItem[\"host\"]}$baseUrl${urlItem[\"extra\"]}\",\n            );\n          }\n        }\n      }\n    }\n    // 对链接进行排序，包含mcdn的在后\n    urls.sort((a, b) {\n      if (a.contains(\"mcdn\")) {\n        return 1;\n      } else {\n        return -1;\n      }\n    });\n    return LivePlayUrl(\n      urls: urls,\n      headers: {\n        \"referer\": \"https://live.bilibili.com\",\n        \"user-agent\":\n            \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188\"\n      },\n    );\n  }\n\n  @override\n  Future<LiveCategoryResult> getRecommendRooms({int page = 1}) async {\n    const baseUrl =\n        \"https://api.live.bilibili.com/xlive/web-interface/v1/second/getListByArea\";\n    var url = \"$baseUrl?platform=web&sort=online&page_size=30&page=$page\";\n\n    var queryParams = await getWbiSign(url);\n\n    var result = await HttpClient.instance.getJson(\n      baseUrl,\n      queryParameters: queryParams,\n      header: await getHeader(),\n    );\n\n    var hasMore = (result[\"data\"][\"list\"] as List).isNotEmpty;\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"list\"]) {\n      var roomItem = LiveRoomItem(\n        roomId: item[\"roomid\"].toString(),\n        title: item[\"title\"].toString(),\n        cover: \"${item[\"cover\"]}@400w.jpg\",\n        userName: item[\"uname\"].toString(),\n        online: int.tryParse(item[\"online\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveRoomDetail> getRoomDetail({required String roomId}) async {\n    var roomInfo = await getRoomInfo(roomId: roomId);\n    var realRoomId = roomInfo[\"room_info\"][\"room_id\"].toString();\n\n    const danmuInfoBaseUrl =\n        \"https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo\";\n    var danmuInfoUrl = \"$danmuInfoBaseUrl?id=$realRoomId\";\n    var queryParams = await getWbiSign(danmuInfoUrl);\n    var roomDanmakuResult = await HttpClient.instance.getJson(\n      danmuInfoBaseUrl,\n      queryParameters: queryParams,\n      header: await getHeader(),\n    );\n    List<String> serverHosts = (roomDanmakuResult[\"data\"][\"host_list\"] as List)\n        .map<String>((e) => e[\"host\"].toString())\n        .toList();\n\n    //var buvid = await getBuvid();\n    // 从 roomInfo 中提取 live_start_time\n    String? liveStartTime =\n        roomInfo[\"room_info\"]?[\"live_start_time\"]?.toString();\n\n    // 计算开播时长并打印到控制台 (参考斗鱼的实现)\n    if (liveStartTime != null &&\n        liveStartTime.isNotEmpty &&\n        liveStartTime != \"0\") {\n      // 检查是否为0，0可能表示未开播或无此信息\n      try {\n        int startTimeStamp = int.parse(liveStartTime);\n        int currentTimeStamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n        int durationInSeconds = currentTimeStamp - startTimeStamp;\n\n        int hours = durationInSeconds ~/ 3600;\n        int minutes = (durationInSeconds % 3600) ~/ 60;\n        int seconds = durationInSeconds % 60;\n\n        String formattedDuration =\n            '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}';\n        print('Bilibili直播间 $roomId 开播时长: $formattedDuration');\n      } catch (e) {\n        print('计算 Bilibili 开播时长出错: $e');\n      }\n    }\n\n    return LiveRoomDetail(\n      roomId: realRoomId,\n      title: roomInfo[\"room_info\"][\"title\"].toString(),\n      cover: roomInfo[\"room_info\"][\"cover\"].toString(),\n      userName: roomInfo[\"anchor_info\"][\"base_info\"][\"uname\"].toString(),\n      userAvatar: \"${roomInfo[\"anchor_info\"][\"base_info\"][\"face\"]}@100w.jpg\",\n      online: asT<int?>(roomInfo[\"room_info\"][\"online\"]) ?? 0,\n      status: (asT<int?>(roomInfo[\"room_info\"][\"live_status\"]) ?? 0) == 1,\n      url: \"https://live.bilibili.com/$roomId\",\n      introduction: roomInfo[\"room_info\"][\"description\"].toString(),\n      notice: \"\",\n      danmakuData: BiliBiliDanmakuArgs(\n        roomId: int.tryParse(realRoomId) ?? 0,\n        uid: userId,\n        token: roomDanmakuResult[\"data\"][\"token\"].toString(),\n        serverHost: serverHosts.isNotEmpty\n            ? serverHosts.first\n            : \"broadcastlv.chat.bilibili.com\",\n        buvid: buvid3,\n        cookie: cookie,\n      ),\n      showTime: liveStartTime, // 将 liveStartTime 赋值给 showTime 字段\n    );\n  }\n\n  Future<Map<String, dynamic>> getRoomInfo({required String roomId}) async {\n    var url =\n        \"https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=$roomId\";\n    var queryParams = await getWbiSign(url);\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom\",\n      queryParameters: queryParams,\n      header: await getHeader(),\n    );\n    print(\"【B站接口返回】roomId=$roomId, result=$result\");\n    return result[\"data\"];\n  }\n\n  @override\n  Future<LiveSearchRoomResult> searchRooms(String keyword,\n      {int page = 1}) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://api.bilibili.com/x/web-interface/search/type?context=&search_type=live&cover_type=user_cover\",\n      queryParameters: {\n        \"order\": \"\",\n        \"keyword\": keyword,\n        \"category_id\": \"\",\n        \"__refresh__\": \"\",\n        \"_extra\": \"\",\n        \"highlight\": 0,\n        \"single_column\": 0,\n        \"page\": page\n      },\n      header: await getHeader(),\n    );\n\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"result\"][\"live_room\"] ?? []) {\n      var title = item[\"title\"].toString();\n      //移除title中的<em></em>标签\n      title = title.replaceAll(RegExp(r\"<.*?em.*?>\"), \"\");\n      var roomItem = LiveRoomItem(\n        roomId: item[\"roomid\"].toString(),\n        title: title,\n        cover: \"https:${item[\"cover\"]}@400w.jpg\",\n        userName: item[\"uname\"].toString(),\n        online: int.tryParse(item[\"online\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    return LiveSearchRoomResult(hasMore: items.length >= 40, items: items);\n  }\n\n  @override\n  Future<LiveSearchAnchorResult> searchAnchors(String keyword,\n      {int page = 1}) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://api.bilibili.com/x/web-interface/search/type?context=&search_type=live_user&cover_type=user_cover\",\n      queryParameters: {\n        \"order\": \"\",\n        \"keyword\": keyword,\n        \"category_id\": \"\",\n        \"__refresh__\": \"\",\n        \"_extra\": \"\",\n        \"highlight\": 0,\n        \"single_column\": 0,\n        \"page\": page\n      },\n      header: await getHeader(),\n    );\n\n    var items = <LiveAnchorItem>[];\n    for (var item in result[\"data\"][\"result\"] ?? []) {\n      var uname = item[\"uname\"].toString();\n      //移除title中的<em></em>标签\n      uname = uname.replaceAll(RegExp(r\"<.*?em.*?>\"), \"\");\n      var anchorItem = LiveAnchorItem(\n        roomId: item[\"roomid\"].toString(),\n        avatar: \"https:${item[\"uface\"]}@400w.jpg\",\n        userName: uname,\n        liveStatus: item[\"is_live\"],\n      );\n      items.add(anchorItem);\n    }\n    return LiveSearchAnchorResult(hasMore: items.length >= 40, items: items);\n  }\n\n  @override\n  Future<bool> getLiveStatus({required String roomId}) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/room/v1/Room/get_info\",\n      queryParameters: {\n        \"room_id\": roomId,\n      },\n      header: await getHeader(),\n    );\n    return (asT<int?>(result[\"data\"][\"live_status\"]) ?? 0) == 1;\n  }\n\n  @override\n  Future<List<LiveSuperChatMessage>> getSuperChatMessage(\n      {required String roomId}) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://api.live.bilibili.com/av/v1/SuperChat/getMessageList\",\n      queryParameters: {\n        \"room_id\": roomId,\n      },\n      header: await getHeader(),\n    );\n    List<LiveSuperChatMessage> ls = [];\n    for (var item in result[\"data\"]?[\"list\"] ?? []) {\n      var message = LiveSuperChatMessage(\n        backgroundBottomColor: item[\"background_bottom_color\"].toString(),\n        backgroundColor: item[\"background_color\"].toString(),\n        endTime: DateTime.fromMillisecondsSinceEpoch(\n          item[\"end_time\"] * 1000,\n        ),\n        face: \"${item[\"user_info\"][\"face\"]}@200w.jpg\",\n        message: item[\"message\"].toString(),\n        price: item[\"price\"],\n        startTime: DateTime.fromMillisecondsSinceEpoch(\n          item[\"start_time\"] * 1000,\n        ),\n        userName: item[\"user_info\"][\"uname\"].toString(),\n      );\n      ls.add(message);\n    }\n    return ls;\n  }\n\n  /// 获取 buvid3 和 buvid4\n  /// 返回buvid3和buvid4\n  /// ``` json\n  /// {\n  ///   \"b_3\": \"buvid3\",\n  ///   \"b_4\": \"buvid4\",\n  /// }\n  /// ```\n  Future<Map> getBuvid() async {\n    try {\n      if (cookie.contains(\"buvid3\")) {\n        return {\n          \"b_3\": RegExp(r\"buvid3=(.*?);\").firstMatch(cookie)?.group(1) ?? \"\",\n          \"b_4\": RegExp(r\"buvid4=(.*?);\").firstMatch(cookie)?.group(1) ?? \"\",\n        };\n      }\n\n      var result = await HttpClient.instance.getJson(\n        \"https://api.bilibili.com/x/frontend/finger/spi\",\n        queryParameters: {},\n        header: {\n          \"user-agent\": kDefaultUserAgent,\n          \"referer\": kDefaultReferer,\n          \"cookie\": cookie,\n        },\n      );\n      return result[\"data\"];\n    } catch (e) {\n      return {\n        \"b_3\": \"\",\n        \"b_4\": \"\",\n      };\n    }\n  }\n\n  static String kImgKey = '';\n  static String kSubKey = '';\n  static const List<int> mixinKeyEncTab = [\n    46,\n    47,\n    18,\n    2,\n    53,\n    8,\n    23,\n    32,\n    15,\n    50,\n    10,\n    31,\n    58,\n    3,\n    45,\n    35,\n    27,\n    43,\n    5,\n    49,\n    33,\n    9,\n    42,\n    19,\n    29,\n    28,\n    14,\n    39,\n    12,\n    38,\n    41,\n    13,\n    37,\n    48,\n    7,\n    16,\n    24,\n    55,\n    40,\n    61,\n    26,\n    17,\n    0,\n    1,\n    60,\n    51,\n    30,\n    4,\n    22,\n    25,\n    54,\n    21,\n    56,\n    59,\n    6,\n    63,\n    57,\n    62,\n    11,\n    36,\n    20,\n    34,\n    44,\n    52\n  ];\n  Future<(String, String)> getWbiKeys() async {\n    if (kImgKey.isNotEmpty && kSubKey.isNotEmpty) {\n      return (kImgKey, kSubKey);\n    }\n    // 获取最新的 img_key 和 sub_key\n    var resp = await HttpClient.instance.getJson(\n      'https://api.bilibili.com/x/web-interface/nav',\n      header: await getHeader(),\n    );\n\n    var imgUrl = resp[\"data\"][\"wbi_img\"][\"img_url\"].toString();\n    var subUrl = resp[\"data\"][\"wbi_img\"][\"sub_url\"].toString();\n    var imgKey = imgUrl.substring(imgUrl.lastIndexOf('/') + 1).split('.').first;\n    var subKey = subUrl.substring(subUrl.lastIndexOf('/') + 1).split('.').first;\n\n    kImgKey = imgKey;\n    kSubKey = subKey;\n\n    return (imgKey, subKey);\n  }\n\n  String getMixinKey(String origin) {\n    // 对 imgKey 和 subKey 进行字符顺序打乱编码\n    return mixinKeyEncTab.fold(\"\", (s, i) => s + origin[i]).substring(0, 32);\n  }\n\n  Future<Map<String, String>> getWbiSign(String url) async {\n    var (imgKey, subKey) = await getWbiKeys();\n\n    // 为请求参数进行 wbi 签名\n    var mixinKey = getMixinKey(imgKey + subKey);\n    var currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n\n    var queryParams = Map<String, String>.from(Uri.parse(url).queryParameters);\n\n    queryParams[\"wts\"] = currentTime.toString(); // 添加 wts 字段\n\n    //按照 key 重排参数\n    Map<String, String> map = {};\n    var sortedKeys = queryParams.keys.toList()..sort();\n    for (var key in sortedKeys) {\n      var value = queryParams[key]!;\n      // 过滤 value 中的 \"!'()*\" 字符\n      map[key] = value\n          .toString()\n          .split('')\n          .where((c) => \"!'()*\".contains(c) == false)\n          .join('');\n    }\n\n    var query = map.keys\n        .map((key) => \"$key=${Uri.encodeQueryComponent(map[key]!)}\")\n        .join(\"&\");\n    var wbiSign = md5.convert(utf8.encode(\"$query$mixinKey\")).toString();\n    queryParams[\"w_rid\"] = wbiSign;\n    return queryParams;\n  }\n\n  Future<String> getAccessId() async {\n    if (accessId.isNotEmpty) {\n      return accessId;\n    }\n\n    // 获取 access_id\n    var resp = await HttpClient.instance.getText(\n      \"https://live.bilibili.com/lol\",\n      queryParameters: {},\n      header: await getHeader(),\n    );\n    var id = RegExp(r'\"access_id\":\"(.*?)\"')\n        .firstMatch(resp)\n        ?.group(1)\n        ?.replaceAll(\"\\\\\", \"\");\n    accessId = id ?? \"\";\n    return accessId;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/binary_writer.dart",
    "content": "import 'dart:typed_data';\n\nclass BinaryWriter {\n  List<int> buffer;\n  int position = 0;\n  BinaryWriter(this.buffer);\n  int get length => buffer.length;\n\n  void writeBytes(List<int> list) {\n    buffer.addAll(list);\n    position += list.length;\n  }\n\n  void writeInt(int value, int len, {Endian endian = Endian.big}) {\n    var b = Uint8List(len).buffer;\n    var bytes = ByteData.view(b);\n    if (len == 1) {\n      //写入byte\n      bytes.setUint8(0, value.toUnsigned(8));\n    }\n    if (len == 2) {\n      bytes.setInt16(0, value, endian);\n    }\n    if (len == 4) {\n      bytes.setInt32(0, value, endian);\n    }\n    if (len == 8) {\n      bytes.setInt64(0, value, endian);\n    }\n\n    buffer.addAll(bytes.buffer.asUint8List());\n    position += len;\n  }\n\n  void writeDouble(double value, int len, {Endian endian = Endian.big}) {\n    var b = Uint8List(len).buffer;\n    var bytes = ByteData.view(b);\n\n    if (len == 4) {\n      bytes.setFloat32(0, value, endian);\n    }\n    if (len == 8) {\n      bytes.setFloat64(0, value, endian);\n    }\n\n    buffer.addAll(bytes.buffer.asUint8List());\n    position += len;\n  }\n}\n\nclass BinaryReader {\n  Uint8List buffer;\n  int position = 0;\n  BinaryReader(this.buffer);\n  int get length => buffer.length;\n\n  /// 从当前流中读取下一个字节，并使流的当前位置提升 1 个字节\n  /// 返回下一个字节(0-255)\n  int read() {\n    var byte = buffer[position];\n    position += 1;\n    return byte;\n  }\n\n  /// 从当前流中读取指定长度的字节整数，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// len=1为int8,2为int16,4为int32,8为int64。dart中统一为int类型\n  /// 返回整数\n  int readInt(int len, {Endian endian = Endian.big}) {\n    var result = 0;\n    // if (len == 1) {\n    //   result = buffer[position];\n    //   position += len;\n    //   return result;\n    // }\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    var byteBuffer = bytes.buffer;\n    var data = ByteData.view(byteBuffer);\n    if (len == 1) {\n      result = data.getUint8(0);\n    }\n    if (len == 2) {\n      result = data.getInt16(0, endian);\n    }\n    if (len == 4) {\n      result = data.getInt32(0, endian);\n    }\n    if (len == 8) {\n      result = data.getInt64(0, endian);\n    }\n    position += len;\n    return result;\n  }\n\n  /// 读取字节\n  /// int长度=1\n  int readByte({Endian endian = Endian.big}) {\n    return readInt(1, endian: endian);\n  }\n\n  /// 读取\n  /// int长度=2\n  int readShort({Endian endian = Endian.big}) {\n    return readInt(2, endian: endian);\n  }\n\n  /// 读取字节\n  /// int长度=4\n  int readInt32({Endian endian = Endian.big}) {\n    return readInt(4, endian: endian);\n  }\n\n  /// 读取字节\n  /// int长度=8\n  int readLong({Endian endian = Endian.big}) {\n    return readInt(8, endian: endian);\n  }\n\n  /// 从当前流中读取指定长度的字节数组，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// 返回字节数组\n  Uint8List readBytes(int len) {\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    position += len;\n    return bytes;\n  }\n\n  /// 从当前流中读取指定长度的字节浮点数，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// len=4为float,8为double。dart中统一为double类型\n  /// 返回浮点数\n  double readFloat(int len, {Endian endian = Endian.big}) {\n    var result = 0.0;\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    var byteBuffer = bytes.buffer;\n    var data = ByteData.view(byteBuffer);\n    if (len == 4) {\n      result = data.getFloat32(0, endian);\n    }\n    if (len == 8) {\n      result = data.getFloat64(0, endian);\n    }\n    position += len;\n    return result;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/convert_helper.dart",
    "content": "T? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/core_error.dart",
    "content": "class CoreError extends Error {\n  /// 错误码\n  final int statusCode;\n\n  /// 错误信息\n  final String message;\n\n  CoreError(\n    this.message, {\n    this.statusCode = 0,\n  });\n  @override\n  String toString() {\n    if (statusCode != 0) {\n      return statusCodeToString(statusCode);\n    }\n\n    return message;\n  }\n\n  String statusCodeToString(int statusCode) {\n    switch (statusCode) {\n      case 400:\n        return \"错误的请求(400)\";\n      case 401:\n        return \"无权限访问资源(401)\";\n      case 403:\n        return \"无权限访问资源(403)\";\n      case 404:\n        return \"服务器找不到请求的资源(404)\";\n      case 500:\n        return \"服务器出现错误(500)\";\n      case 502:\n        return \"服务器出现错误(502)\";\n      case 503:\n        return \"服务器出现错误(503)\";\n      default:\n        return \"连接服务器失败，请稍后再试($statusCode)\";\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/core_log.dart",
    "content": "import 'package:logger/logger.dart';\n\nenum RequestLogType {\n  /// 输出所有请求信息\n  /// 包括请求的URL，请求的参数，请求的头，请求的体，响应的头，响应的内容，耗时\n  all,\n\n  /// 简洁的输出\n  /// 仅输出请求的URL和响应的状态码\n  short,\n\n  /// 不输出请求信息\n  none,\n}\n\nclass CoreLog {\n  /// 是否启用日志\n  static bool enableLog = true;\n\n  /// 请求日志模式\n  static RequestLogType requestLogType = RequestLogType.all;\n\n  static Function(Level, String)? onPrintLog;\n  static Logger logger = Logger(\n    printer: PrettyPrinter(\n      methodCount: 0,\n      errorMethodCount: 8,\n      lineLength: 120,\n      colors: true,\n      printEmojis: true,\n    ),\n  );\n\n  static void d(String message) {\n    if (!enableLog) {\n      return;\n    }\n    onPrintLog?.call(Level.debug, message);\n    if (onPrintLog == null) {\n      logger.d(\"${DateTime.now().toString()}\\n$message\");\n    }\n  }\n\n  static void i(String message) {\n    if (!enableLog) {\n      return;\n    }\n    onPrintLog?.call(Level.info, message);\n    if (onPrintLog == null) {\n      logger.i(\"${DateTime.now().toString()}\\n$message\");\n    }\n  }\n\n  static void e(String message, StackTrace stackTrace) {\n    if (!enableLog) {\n      return;\n    }\n    onPrintLog?.call(Level.error, message);\n    if (onPrintLog == null) {\n      logger.e(\"${DateTime.now().toString()}\\n$message\",\n          stackTrace: stackTrace);\n    }\n  }\n\n  static void error(e) {\n    if (!enableLog) {\n      return;\n    }\n    onPrintLog?.call(Level.error, e.toString());\n    if (onPrintLog == null) {\n      logger.e(\n        \"${DateTime.now().toString()}\\n${e.toString()}\",\n        error: e,\n        stackTrace: (e is Error) ? e.stackTrace : StackTrace.current,\n      );\n    }\n  }\n\n  static void w(String message) {\n    if (!enableLog) {\n      return;\n    }\n    onPrintLog?.call(Level.warning, message);\n    if (onPrintLog == null) {\n      logger.w(\"${DateTime.now().toString()}\\n$message\");\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/custom_interceptor.dart",
    "content": "import 'package:dio/dio.dart';\n\nimport 'core_log.dart';\n\nclass CustomInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    options.extra[\"ts\"] = DateTime.now().millisecondsSinceEpoch;\n    if (CoreLog.requestLogType == RequestLogType.all) {\n      CoreLog.i(\n        '''[HTTP Request] [${options.method}]\nRequest URL：${options.uri}\nRequest Query：${options.queryParameters}\nRequest Data：${options.data}\nRequest Headers：${options.headers}''',\n      );\n    } else if (CoreLog.requestLogType == RequestLogType.short) {\n      CoreLog.i(\"[HTTP Request] [${options.method}] ${options.uri}\");\n    }\n\n    super.onRequest(options, handler);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    var time =\n        DateTime.now().millisecondsSinceEpoch - err.requestOptions.extra[\"ts\"];\n    if (CoreLog.requestLogType == RequestLogType.all) {\n      CoreLog.e('''[HTTP Error] [${err.type}] [Time:${time}ms]\n${err.message}\n\nRequest Method：${err.requestOptions.method}\nResponse Code：${err.response?.statusCode}\nRequest URL：${err.requestOptions.uri}\nRequest Query：${err.requestOptions.queryParameters}\nRequest Data：${err.requestOptions.data}\nRequest Headers：${err.requestOptions.headers}\nResponse Headers：${err.response?.headers.map}\nResponse Data：${err.response?.data}''', err.stackTrace);\n    } else {\n      CoreLog.e(\n        \"[HTTP Error] [${err.type}] [Time:${time}ms]\\n[${err.response?.statusCode}] ${err.requestOptions.uri}\",\n        err.stackTrace,\n      );\n    }\n\n    super.onError(err, handler);\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    var time = DateTime.now().millisecondsSinceEpoch -\n        response.requestOptions.extra[\"ts\"];\n    if (CoreLog.requestLogType == RequestLogType.all) {\n      CoreLog.i(\n        '''[HTTP Response] [time:${time}ms]\nRequest Method：${response.requestOptions.method}\nRequest Code：${response.statusCode}\nRequest URL：${response.requestOptions.uri}\nRequest Query：${response.requestOptions.queryParameters}\nRequest Data：${response.requestOptions.data}\nRequest Headers：${response.requestOptions.headers}\nResponse Headers：${response.headers.map}\nResponse Data：${response.data}''',\n      );\n    } else if (CoreLog.requestLogType == RequestLogType.short) {\n      CoreLog.i(\n        \"[HTTP Response] [time:${time}ms] [${response.statusCode}] ${response.requestOptions.uri}\",\n      );\n    }\n    super.onResponse(response, handler);\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/http_client.dart",
    "content": "import 'package:simple_live_core/src/common/core_error.dart';\nimport 'package:dio/dio.dart';\n\nimport 'custom_interceptor.dart';\n\nclass HttpClient {\n  static HttpClient? _httpUtil;\n\n  static HttpClient get instance {\n    _httpUtil ??= HttpClient();\n    return _httpUtil!;\n  }\n\n  late Dio dio;\n  HttpClient() {\n    dio = Dio(\n      BaseOptions(\n        connectTimeout: Duration(seconds: 20),\n        receiveTimeout: Duration(seconds: 20),\n        sendTimeout: Duration(seconds: 20),\n      ),\n    );\n    dio.interceptors.add(CustomInterceptor());\n  }\n\n  /// Get请求，返回String\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<String> getText(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.plain,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw CoreError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw CoreError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Get请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<dynamic> getJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw CoreError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw CoreError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Post请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [data] 内容\n  /// * [cancel] 任务取消Token\n  Future<dynamic> postJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    dynamic data,\n    Map<String, dynamic>? header,\n    bool formUrlEncoded = false,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      data ??= {};\n      var result = await dio.post(\n        url,\n        queryParameters: queryParameters,\n        data: data,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n          contentType:\n              formUrlEncoded ? Headers.formUrlEncodedContentType : null,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw CoreError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw CoreError(\"发送POST请求失败\");\n      }\n    }\n  }\n\n  /// Head请求，返回Response\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<Response> head(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.head(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          headers: header,\n          receiveDataWhenStatusError: true,\n        ),\n        cancelToken: cancel,\n      );\n      return result;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        //throw CoreError(e.message, statusCode: e.response?.statusCode ?? 0);\n        return e.response!;\n      } else {\n        throw CoreError(\"发送HEAD请求失败\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/common/web_socket_util.dart",
    "content": "import 'dart:async';\n\nimport 'package:web_socket_channel/io.dart';\n\nenum SocketStatus {\n  connected,\n  failed,\n  closed,\n}\n\nclass WebScoketUtils {\n  SocketStatus status = SocketStatus.closed;\n\n  /// 链接\n  final String url;\n\n  /// 备用链接\n  final String? backupUrl;\n\n  /// 心跳时间\n  final int heartBeatTime;\n\n  /// 接收到信息\n  final Function(dynamic)? onMessage;\n\n  /// 连接关闭\n  final Function(String msg)? onClose;\n\n  /// 尝试重连\n  final Function()? onReconnect;\n\n  /// 准备就绪\n  final Function()? onReady;\n\n  /// 心跳\n  final Function()? onHeartBeat;\n\n  /// 请求头\n  Map<String, dynamic>? headers;\n  WebScoketUtils({\n    required this.url,\n    required this.heartBeatTime,\n    this.onMessage,\n    this.onClose,\n    this.onReconnect,\n    this.onReady,\n    this.onHeartBeat,\n    this.headers,\n    this.backupUrl,\n  });\n  IOWebSocketChannel? webSocket;\n  Timer? heartBeatTimer;\n\n  /// 重连次数\n  int reconnectTime = 0;\n  Timer? reconnectTimer;\n\n  /// 最大重连次数\n  int maxReconnectTime = 5;\n\n  StreamSubscription<dynamic>? streamSubscription;\n\n  void connect({bool retry = false}) async {\n    close();\n    try {\n      var wsurl = url;\n      if (backupUrl != null && backupUrl!.isNotEmpty && retry) {\n        wsurl = backupUrl!;\n      }\n      webSocket = IOWebSocketChannel.connect(\n        wsurl,\n        connectTimeout: Duration(seconds: 10),\n        headers: headers,\n      );\n\n      await webSocket?.ready;\n      ready();\n    } catch (e) {\n      if (!retry) {\n        connect(retry: true);\n        return;\n      }\n      onError(e, e);\n    }\n  }\n\n  /// 连接完成\n  void ready() {\n    status = SocketStatus.connected;\n\n    streamSubscription = webSocket?.stream.listen(\n      (data) => receiveMessage(data),\n      onError: (e, s) => onError(e, s),\n      onDone: onDone,\n    );\n\n    onReady?.call();\n    initHeartBeat();\n  }\n\n  void initHeartBeat() {\n    heartBeatTimer = Timer.periodic(\n      Duration(milliseconds: heartBeatTime),\n      (timer) {\n        onHeartBeat?.call();\n      },\n    );\n  }\n\n  void receiveMessage(dynamic data) {\n    //接受到一条信息才算重连成功\n    reconnectTime = 0;\n    onMessage?.call(data);\n  }\n\n  void onError(e, s) {\n    status = SocketStatus.failed;\n    onClose?.call(e.toString());\n  }\n\n  void onDone() {\n    if (status == SocketStatus.closed) {\n      return;\n    }\n    onReconnect?.call();\n    reconnect();\n  }\n\n  void sendMessage(dynamic message) {\n    if (status == SocketStatus.connected) {\n      webSocket?.sink.add(message);\n    }\n  }\n\n  void close() {\n    status = SocketStatus.closed;\n\n    streamSubscription?.cancel();\n\n    reconnectTimer?.cancel();\n    reconnectTimer = null;\n\n    webSocket?.sink.close();\n\n    heartBeatTimer?.cancel();\n    heartBeatTimer = null;\n  }\n\n  void reconnect() {\n    status = SocketStatus.closed;\n    if (reconnectTime < maxReconnectTime) {\n      reconnectTime++;\n      reconnectTimer ??= Timer.periodic(Duration(seconds: 5), (timer) {\n        connect();\n      });\n    } else {\n      onClose?.call(\"重连超过最大次数，与服务器断开连接\");\n      reconnectTimer?.cancel();\n      reconnectTimer = null;\n      close();\n      return;\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/bilibili_danmaku.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:brotli/brotli.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/convert_helper.dart';\nimport 'package:simple_live_core/src/common/web_socket_util.dart';\n\nimport '../common/binary_writer.dart';\n\nclass BiliBiliDanmakuArgs {\n  final int roomId;\n  final String token;\n  final String buvid;\n  final String serverHost;\n  final int uid;\n  final String cookie;\n  BiliBiliDanmakuArgs({\n    required this.roomId,\n    required this.token,\n    required this.serverHost,\n    required this.buvid,\n    required this.uid,\n    required this.cookie,\n  });\n  @override\n  String toString() {\n    return json.encode({\n      \"roomId\": roomId,\n      \"token\": token,\n      \"serverHost\": serverHost,\n      \"buvid\": buvid,\n      \"uid\": uid,\n      \"cookie\": cookie,\n    });\n  }\n}\n\nclass BiliBiliDanmaku implements LiveDanmaku {\n  @override\n  int heartbeatTime = 60 * 1000;\n\n  @override\n  Function(LiveMessage msg)? onMessage;\n  @override\n  Function(String msg)? onClose;\n  @override\n  Function()? onReady;\n\n  //String serverUrl = \"wss://broadcastlv.chat.bilibili.com/sub\";\n\n  WebScoketUtils? webScoketUtils;\n  late BiliBiliDanmakuArgs danmakuArgs;\n  @override\n  Future start(dynamic args) async {\n    danmakuArgs = args as BiliBiliDanmakuArgs;\n    webScoketUtils = WebScoketUtils(\n      url: \"wss://${args.serverHost}/sub\",\n      heartBeatTime: heartbeatTime,\n      headers: args.cookie.isEmpty\n          ? null\n          : {\n              \"cookie\": args.cookie,\n            },\n      onMessage: (e) {\n        decodeMessage(e);\n      },\n      onReady: () {\n        onReady?.call();\n        joinRoom(danmakuArgs);\n      },\n      onHeartBeat: () {\n        heartbeat();\n      },\n      onReconnect: () {\n        onClose?.call(\"与服务器断开连接，正在尝试重连\");\n      },\n      onClose: (e) {\n        onClose?.call(\"服务器连接失败$e\");\n      },\n    );\n    webScoketUtils?.connect();\n  }\n\n  void joinRoom(BiliBiliDanmakuArgs args) {\n    var joinData = encodeData(\n      json.encode({\n        \"uid\": args.uid,\n        \"roomid\": args.roomId,\n        \"protover\": 3,\n        \"buvid\": args.buvid,\n        \"platform\": \"web\",\n        \"type\": 2,\n        \"key\": args.token,\n      }),\n      7,\n    );\n    webScoketUtils?.sendMessage(joinData);\n  }\n\n  @override\n  void heartbeat() {\n    webScoketUtils?.sendMessage(encodeData(\n      \"\",\n      2,\n    ));\n  }\n\n  @override\n  Future stop() async {\n    onMessage = null;\n    onClose = null;\n    webScoketUtils?.close();\n  }\n\n  List<int> encodeData(String msg, int action) {\n    var data = utf8.encode(msg);\n    //头部长度固定16\n    var length = data.length + 16;\n    var buffer = Uint8List(length);\n\n    var writer = BinaryWriter([]);\n\n    //数据包长度\n    writer.writeInt(buffer.length, 4);\n    //数据包头部长度,固定16\n    writer.writeInt(16, 2);\n\n    //协议版本，0=JSON,1=Int32,2=Buffer\n    writer.writeInt(0, 2);\n\n    //操作类型\n    writer.writeInt(action, 4);\n\n    //数据包头部长度,固定1\n\n    writer.writeInt(1, 4);\n\n    writer.writeBytes(data);\n\n    return writer.buffer;\n  }\n\n  void decodeMessage(List<int> data) {\n    try {\n      //协议版本。0为JSON，可以直接解析；1为房间人气值,Body为4位Int32；2为压缩过Buffer，需要解压再处理\n      int protocolVersion = readInt(data, 6, 2);\n      //操作类型。3=心跳回应，内容为房间人气值；5=通知，弹幕、广播等全部信息；8=进房回应，空\n      int operation = readInt(data, 8, 4);\n      //内容\n      var body = data.skip(16).toList();\n      if (operation == 3) {\n        var online = readInt(body, 0, 4);\n\n        onMessage?.call(\n          LiveMessage(\n            type: LiveMessageType.online,\n            data: online,\n            color: LiveMessageColor.white,\n            message: \"\",\n            userName: \"\",\n          ),\n        );\n      } else if (operation == 5) {\n        if (protocolVersion == 2) {\n          body = zlib.decode(body);\n        } else if (protocolVersion == 3) {\n          body = brotli.decode(body);\n        }\n\n        var text = utf8.decode(body, allowMalformed: true);\n\n        var group =\n            text.split(RegExp(r\"[\\x00-\\x1f]+\", unicode: true, multiLine: true));\n        for (var item\n            in group.where((x) => x.length > 2 && x.startsWith('{'))) {\n          parseMessage(item);\n        }\n      }\n    } catch (e) {\n      CoreLog.error(e);\n    }\n  }\n\n  void parseMessage(String jsonMessage) {\n    try {\n      var obj = json.decode(jsonMessage);\n      var cmd = obj[\"cmd\"].toString();\n      if (cmd.contains(\"DANMU_MSG\")) {\n        if (obj[\"info\"] != null && obj[\"info\"].length != 0) {\n          var message = obj[\"info\"][1].toString();\n          var color = asT<int?>(obj[\"info\"][0][3]) ?? 0;\n          if (obj[\"info\"][2] != null && obj[\"info\"][2].length != 0) {\n            var username = obj[\"info\"][2][1].toString();\n            var liveMsg = LiveMessage(\n              type: LiveMessageType.chat,\n              userName: username,\n              message: message,\n              color: color == 0\n                  ? LiveMessageColor.white\n                  : LiveMessageColor.numberToColor(color),\n            );\n            onMessage?.call(liveMsg);\n          }\n        }\n      } else if (cmd == \"SUPER_CHAT_MESSAGE\") {\n        if (obj[\"data\"] == null) {\n          return;\n        }\n        LiveSuperChatMessage sc = LiveSuperChatMessage(\n          backgroundBottomColor:\n              obj[\"data\"][\"background_bottom_color\"].toString(),\n          backgroundColor: obj[\"data\"][\"background_color\"].toString(),\n          endTime: DateTime.fromMillisecondsSinceEpoch(\n            obj[\"data\"][\"end_time\"] * 1000,\n          ),\n          face: \"${obj[\"data\"][\"user_info\"][\"face\"]}@200w.jpg\",\n          message: obj[\"data\"][\"message\"].toString(),\n          price: obj[\"data\"][\"price\"],\n          startTime: DateTime.fromMillisecondsSinceEpoch(\n            obj[\"data\"][\"start_time\"] * 1000,\n          ),\n          userName: obj[\"data\"][\"user_info\"][\"uname\"].toString(),\n        );\n        var liveMsg = LiveMessage(\n          type: LiveMessageType.superChat,\n          userName: \"SUPER_CHAT_MESSAGE\",\n          message: \"SUPER_CHAT_MESSAGE\",\n          color: LiveMessageColor.white,\n          data: sc,\n        );\n        onMessage?.call(liveMsg);\n      }\n    } catch (e) {\n      CoreLog.error(e);\n    }\n  }\n\n  int readInt(List<int> buffer, int start, int len) {\n    var bytes =\n        Uint8List.fromList(buffer.getRange(start, start + len).toList());\n    var byteBuffer = bytes.buffer;\n    var data = ByteData.view(byteBuffer);\n    var result = 0;\n\n    if (len == 1) {\n      result = data.getUint8(0);\n    }\n    if (len == 2) {\n      result = data.getInt16(0, Endian.big);\n    }\n    if (len == 4) {\n      result = data.getInt32(0, Endian.big);\n    }\n    if (len == 8) {\n      result = data.getInt64(0, Endian.big);\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/douyin_danmaku.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/web_socket_util.dart';\nimport 'package:simple_live_core/src/scripts/douyin_sign.dart';\n\nimport 'proto/douyin.pb.dart';\n\nclass DouyinDanmakuArgs {\n  final String webRid;\n  final String roomId;\n  final String userId;\n  final String cookie;\n  DouyinDanmakuArgs({\n    required this.webRid,\n    required this.roomId,\n    required this.userId,\n    required this.cookie,\n  });\n  @override\n  String toString() {\n    return json.encode({\n      \"webRid\": webRid,\n      \"roomId\": roomId,\n      \"userId\": userId,\n      \"cookie\": cookie,\n    });\n  }\n}\n\nclass DouyinDanmaku implements LiveDanmaku {\n  @override\n  int heartbeatTime = 10 * 1000;\n\n  @override\n  Function(LiveMessage msg)? onMessage;\n  @override\n  Function(String msg)? onClose;\n  @override\n  Function()? onReady;\n  String serverUrl = \"wss://webcast3-ws-web-lq.douyin.com/webcast/im/push/v2/\";\n  late DouyinDanmakuArgs danmakuArgs;\n  WebScoketUtils? webScoketUtils;\n\n  @override\n  Future start(dynamic args) async {\n    danmakuArgs = args as DouyinDanmakuArgs;\n    var ts = DateTime.now().millisecondsSinceEpoch;\n    var uri = Uri.parse(serverUrl).replace(\n      scheme: \"wss\",\n      queryParameters: {\n        \"app_name\": \"douyin_web\",\n        \"version_code\": \"180800\",\n        \"webcast_sdk_version\": \"1.3.0\",\n        \"update_version_code\": \"1.3.0\",\n        \"compress\": \"gzip\",\n        // \"internal_ext\":\n        //     \"internal_src:dim|wss_push_room_id:${danmakuArgs.roomId}|wss_push_did:${danmakuArgs.userId}|dim_log_id:20230626152702E8F63662383A350588E1|fetch_time:1687764422114|seq:1|wss_info:0-1687764422114-0-0|wrds_kvs:WebcastRoomRankMessage-1687764036509597990_InputPanelComponentSyncData-1687736682345173033_WebcastRoomStatsMessage-1687764414427812578\",\n        \"cursor\": \"h-1_t-${ts}_r-1_d-1_u-1\",\n        \"host\": \"https://live.douyin.com\",\n        \"aid\": \"6383\",\n        \"live_id\": \"1\",\n        \"did_rule\": \"3\",\n        \"debug\": \"false\",\n        \"maxCacheMessageNumber\": \"20\",\n        \"endpoint\": \"live_pc\",\n        \"support_wrds\": \"1\",\n        \"im_path\": \"/webcast/im/fetch/\",\n        \"user_unique_id\": danmakuArgs.userId,\n        \"device_platform\": \"web\",\n        \"cookie_enabled\": \"true\",\n        \"screen_width\": \"1920\",\n        \"screen_height\": \"1080\",\n        \"browser_language\": \"zh-CN\",\n        \"browser_platform\": \"Win32\",\n        \"browser_name\": \"Mozilla\",\n        \"browser_version\": DouyinSite.kDefaultUserAgent.replaceAll(\n          \"Mozilla/\",\n          \"\",\n        ),\n        \"browser_online\": \"true\",\n        \"tz_name\": \"Asia/Shanghai\",\n        \"identity\": \"audience\",\n        \"room_id\": danmakuArgs.roomId,\n        \"heartbeatDuration\": \"0\",\n        //\"signature\": \"00000000\"\n      },\n    );\n\n    var sign = DouyinSign.getSignature(danmakuArgs.roomId, danmakuArgs.userId);\n\n    var url = \"$uri&signature=$sign\";\n    var backupUrl = url.replaceAll(\"webcast3-ws-web-lq\", \"webcast5-ws-web-lf\");\n    print(url);\n    webScoketUtils = WebScoketUtils(\n      url: url,\n      backupUrl: backupUrl,\n      headers: {\n        \"User-Agnet\": DouyinSite.kDefaultUserAgent,\n        \"Cookie\": danmakuArgs.cookie,\n        \"Origin\": \"https://live.douyin.com\",\n      },\n      heartBeatTime: heartbeatTime,\n      onMessage: (e) {\n        decodeMessage(e);\n      },\n      onReady: () {\n        onReady?.call();\n        joinRoom(args);\n      },\n      onHeartBeat: () {\n        heartbeat();\n      },\n      onReconnect: () {\n        onClose?.call(\"与服务器断开连接，正在尝试重连\");\n      },\n      onClose: (e) {\n        onClose?.call(\"服务器连接失败$e\");\n      },\n    );\n    webScoketUtils?.connect();\n  }\n\n  @override\n  void heartbeat() {\n    var obj = PushFrame();\n    obj.payloadType = 'hb';\n    webScoketUtils?.sendMessage(obj.writeToBuffer());\n  }\n\n  void decodeMessage(args) {\n    // CoreLog.i(args.toString());\n\n    var wssPackage = PushFrame.fromBuffer(args);\n\n    var logId = wssPackage.logId;\n    var decompressed = gzip.decode(wssPackage.payload);\n    var payloadPackage = Response.fromBuffer(decompressed);\n    if (payloadPackage.needAck) {\n      sendAck(logId, payloadPackage.internalExt);\n      //return;\n    }\n    for (var msg in payloadPackage.messagesList) {\n      if (msg.method == 'WebcastChatMessage') {\n        unPackWebcastChatMessage(msg.payload);\n      } else if (msg.method == 'WebcastRoomUserSeqMessage') {\n        unPackWebcastRoomUserSeqMessage(msg.payload);\n      }\n    }\n  }\n\n  void unPackWebcastChatMessage(List<int> payload) {\n    var chatMessage = ChatMessage.fromBuffer(payload);\n    onMessage?.call(\n      LiveMessage(\n        type: LiveMessageType.chat,\n        color: LiveMessageColor.white,\n        //暂不知道具体怎么转换颜色\n        // color: chatMessage.common.fullScreenTextColor.\n        //     ? LiveMessageColor.white\n        //     : LiveMessageColor.numberToColor(color),\n        message: chatMessage.content,\n        userName: chatMessage.user.nickName,\n      ),\n    );\n  }\n\n  void unPackWebcastRoomUserSeqMessage(List<int> payload) {\n    var roomUserSeqMessage = RoomUserSeqMessage.fromBuffer(payload);\n\n    onMessage?.call(\n      LiveMessage(\n        type: LiveMessageType.online,\n        data: roomUserSeqMessage.totalUser.toInt(),\n        color: LiveMessageColor.white,\n        message: \"\",\n        userName: \"\",\n      ),\n    );\n  }\n\n  void sendAck(var logId, String internalExt) {\n    var obj = PushFrame();\n    obj.payloadType = 'ack';\n    obj.logId = logId;\n    obj.payloadType = internalExt;\n    webScoketUtils?.sendMessage(obj.writeToBuffer());\n  }\n\n  void joinRoom(args) {\n    var obj = PushFrame();\n    obj.payloadType = 'hb';\n    webScoketUtils?.sendMessage(obj.writeToBuffer());\n  }\n\n  @override\n  Future stop() async {\n    onMessage = null;\n    onClose = null;\n    webScoketUtils?.close();\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/douyu_danmaku.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/web_socket_util.dart';\n\nimport '../common/binary_writer.dart';\n\nclass DouyuDanmaku implements LiveDanmaku {\n  @override\n  int heartbeatTime = 45 * 1000;\n\n  @override\n  Function(LiveMessage msg)? onMessage;\n  @override\n  Function(String msg)? onClose;\n  @override\n  Function()? onReady;\n  String serverUrl = \"wss://danmuproxy.douyu.com:8506\";\n\n  WebScoketUtils? webScoketUtils;\n\n  @override\n  Future start(dynamic args) async {\n    webScoketUtils = WebScoketUtils(\n      url: serverUrl,\n      heartBeatTime: heartbeatTime,\n      onMessage: (e) {\n        decodeMessage(e);\n      },\n      onReady: () {\n        onReady?.call();\n        joinRoom(args);\n      },\n      onHeartBeat: () {\n        heartbeat();\n      },\n      onReconnect: () {\n        onClose?.call(\"与服务器断开连接，正在尝试重连\");\n      },\n      onClose: (e) {\n        onClose?.call(\"服务器连接失败$e\");\n      },\n    );\n    webScoketUtils?.connect();\n  }\n\n  void joinRoom(roomId) {\n    webScoketUtils\n        ?.sendMessage(serializeDouyu(\"type@=loginreq/roomid@=$roomId/\"));\n    webScoketUtils?.sendMessage(\n        serializeDouyu(\"type@=joingroup/rid@=$roomId/gid@=-9999/\"));\n  }\n\n  @override\n  void heartbeat() {\n    var data = serializeDouyu(\"type@=mrkl/\");\n    webScoketUtils?.sendMessage(data);\n  }\n\n  @override\n  Future stop() async {\n    onMessage = null;\n    onClose = null;\n    webScoketUtils?.close();\n  }\n\n  void decodeMessage(List<int> data) {\n    try {\n      String? result = deserializeDouyu(data);\n      if (result == null) {\n        return;\n      }\n      var jsonData = sttToJObject(result);\n\n      var type = jsonData[\"type\"]?.toString();\n      //斗鱼好像不会返回人气值\n      if (type == \"chatmsg\") {\n        // 屏蔽阴间弹幕\n        if (jsonData[\"dms\"] == null) {\n          return;\n        }\n        var col = int.tryParse(jsonData[\"col\"].toString()) ?? 0;\n        var liveMsg = LiveMessage(\n          type: LiveMessageType.chat,\n          userName: jsonData[\"nn\"].toString(),\n          message: jsonData[\"txt\"].toString(),\n          color: getColor(col),\n        );\n\n        onMessage?.call(liveMsg);\n      }\n    } catch (e) {\n      CoreLog.error(e);\n    }\n  }\n\n  List<int> serializeDouyu(String body) {\n    try {\n      const int clientSendToServer = 689;\n      const int encrypted = 0;\n      const int reserved = 0;\n\n      List<int> buffer = utf8.encode(body);\n\n      var writer = BinaryWriter([]);\n      writer.writeInt(4 + 4 + body.length + 1, 4, endian: Endian.little);\n      writer.writeInt(4 + 4 + body.length + 1, 4, endian: Endian.little);\n      writer.writeInt(clientSendToServer, 2, endian: Endian.little);\n      writer.writeInt(encrypted, 1, endian: Endian.little);\n      writer.writeInt(reserved, 1, endian: Endian.little);\n      writer.writeBytes(buffer);\n      writer.writeInt(0, 1, endian: Endian.little);\n      return writer.buffer;\n    } catch (e) {\n      CoreLog.error(e);\n      return [];\n    }\n  }\n\n  String? deserializeDouyu(List<int> buffer) {\n    try {\n      var reader = BinaryReader(Uint8List.fromList(buffer));\n      int fullMsgLength =\n          reader.readInt32(endian: Endian.little); //fullMsgLength\n      reader.readInt32(endian: Endian.little); //fullMsgLength2\n      int bodyLength = fullMsgLength - 9;\n      reader.readShort(endian: Endian.little); //packType\n      reader.readByte(endian: Endian.little); //encrypted\n      reader.readByte(endian: Endian.little); //reserved\n\n      var bytes = reader.readBytes(bodyLength);\n\n      reader.readByte(endian: Endian.little); //固定为0\n      return utf8.decode(bytes);\n    } catch (e) {\n      CoreLog.error(e);\n      return null;\n    }\n  }\n\n  //辣鸡STT\n  dynamic sttToJObject(String str) {\n    if (str.contains(\"//\")) {\n      var result = [];\n      for (var field in str.split(\"//\")) {\n        if (field.isEmpty) {\n          continue;\n        }\n        result.add(sttToJObject(field));\n      }\n      return result;\n    }\n    if (str.contains(\"@=\")) {\n      var result = {};\n      for (var field in str.split('/')) {\n        if (field.isEmpty) {\n          continue;\n        }\n        var tokens = field.split(\"@=\");\n        var k = tokens[0];\n        var v = unscapeSlashAt(tokens[1]);\n        result[k] = sttToJObject(v);\n      }\n      return result;\n    } else if (str.contains(\"@A=\")) {\n      return sttToJObject(unscapeSlashAt(str));\n    } else {\n      return unscapeSlashAt(str);\n    }\n  }\n\n  String unscapeSlashAt(String str) {\n    return str.replaceAll(\"@S\", \"/\").replaceAll(\"@A\", \"@\");\n  }\n\n  LiveMessageColor getColor(int type) {\n    switch (type) {\n      case 1:\n        return LiveMessageColor(255, 0, 0);\n      case 2:\n        return LiveMessageColor(30, 135, 240);\n      case 3:\n        return LiveMessageColor(122, 200, 75);\n      case 4:\n        return LiveMessageColor(255, 127, 0);\n      case 5:\n        return LiveMessageColor(155, 57, 244);\n      case 6:\n        return LiveMessageColor(255, 105, 180);\n      default:\n        return LiveMessageColor.white;\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/huya_danmaku.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/web_socket_util.dart';\nimport 'package:simple_live_core/src/model/tars/huya_danmaku.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\n\nclass HuyaDanmakuArgs {\n  final int ayyuid;\n  final int topSid;\n  final int subSid;\n  HuyaDanmakuArgs({\n    required this.ayyuid,\n    required this.topSid,\n    required this.subSid,\n  });\n  @override\n  String toString() {\n    return json.encode({\n      \"ayyuid\": ayyuid,\n      \"topSid\": topSid,\n      \"subSid\": subSid,\n    });\n  }\n}\n\nclass HuyaDanmaku implements LiveDanmaku {\n  @override\n  int heartbeatTime = 60 * 1000;\n\n  @override\n  Function(LiveMessage msg)? onMessage;\n  @override\n  Function(String msg)? onClose;\n  @override\n  Function()? onReady;\n  String serverUrl = \"wss://cdnws.api.huya.com\";\n\n  WebScoketUtils? webScoketUtils;\n\n  final heartbeatData = base64.decode(\"ABQdAAwsNgBM\");\n\n  late HuyaDanmakuArgs danmakuArgs;\n\n  @override\n  Future start(dynamic args) async {\n    danmakuArgs = args as HuyaDanmakuArgs;\n    webScoketUtils = WebScoketUtils(\n      url: serverUrl,\n      heartBeatTime: heartbeatTime,\n      onMessage: (e) {\n        decodeMessage(e);\n      },\n      onReady: () {\n        onReady?.call();\n        joinRoom();\n      },\n      onHeartBeat: () {\n        heartbeat();\n      },\n      onReconnect: () {\n        onClose?.call(\"与服务器断开连接，正在尝试重连\");\n      },\n      onClose: (e) {\n        onClose?.call(\"服务器连接失败$e\");\n      },\n    );\n    webScoketUtils?.connect();\n  }\n\n  void joinRoom() {\n    var joinData =\n        getJoinData(danmakuArgs.ayyuid, danmakuArgs.topSid, danmakuArgs.topSid);\n    webScoketUtils?.sendMessage(joinData);\n  }\n\n  List<int> getJoinData(int ayyuid, int tid, int sid) {\n    try {\n      var oos = TarsOutputStream();\n      oos.write(ayyuid, 0);\n      oos.write(true, 1);\n      oos.write(\"\", 2);\n      oos.write(\"\", 3);\n      oos.write(tid, 4);\n      oos.write(sid, 5);\n      oos.write(0, 6);\n      oos.write(0, 7);\n\n      var wscmd = TarsOutputStream();\n      wscmd.write(1, 0);\n      wscmd.write(oos.toUint8List(), 1);\n      return wscmd.toUint8List();\n    } catch (e) {\n      CoreLog.error(e);\n      return [];\n    }\n  }\n\n  @override\n  void heartbeat() {\n    webScoketUtils?.sendMessage(heartbeatData);\n  }\n\n  @override\n  Future stop() async {\n    onMessage = null;\n    onClose = null;\n    webScoketUtils?.close();\n  }\n\n  void decodeMessage(List<int> data) {\n    try {\n      var stream = TarsInputStream(Uint8List.fromList(data));\n      var type = stream.read(0, 0, false);\n      if (type == 7) {\n        stream = TarsInputStream(stream.readBytes(1, false));\n        HYPushMessage wSPushMessage = HYPushMessage();\n        wSPushMessage.readFrom(stream);\n        if (wSPushMessage.uri == 1400) {\n          HYMessage messageNotice = HYMessage();\n          messageNotice\n              .readFrom(TarsInputStream(Uint8List.fromList(wSPushMessage.msg)));\n          var uname = messageNotice.userInfo.nickName;\n          var content = messageNotice.content;\n\n          var color = messageNotice.bulletFormat.fontColor;\n\n          onMessage?.call(\n            LiveMessage(\n              type: LiveMessageType.chat,\n              color: color <= 0\n                  ? LiveMessageColor.white\n                  : LiveMessageColor.numberToColor(color),\n              message: content,\n              userName: uname,\n            ),\n          );\n        } else if (wSPushMessage.uri == 8006) {\n          int online = 0;\n          var s = TarsInputStream(Uint8List.fromList(wSPushMessage.msg));\n          online = s.read(online, 0, false);\n          onMessage?.call(\n            LiveMessage(\n              type: LiveMessageType.online,\n              data: online,\n              color: LiveMessageColor.white,\n              message: \"\",\n              userName: \"\",\n            ),\n          );\n        }\n      }\n    } catch (e) {\n      CoreLog.error(e);\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/proto/douyin.pb.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: douyin.proto\n//\n// @dart = 2.12\n\n// ignore_for_file: annotate_overrides, camel_case_types\n// ignore_for_file: constant_identifier_names, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_final_fields\n// ignore_for_file: unnecessary_import, unnecessary_this, unused_import\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'douyin.pbenum.dart';\n\nexport 'douyin.pbenum.dart';\n\nclass Response extends $pb.GeneratedMessage {\n  factory Response() => create();\n  Response._() : super();\n  factory Response.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Response.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..pc<Message>(1, _omitFieldNames ? '' : 'messagesList', $pb.PbFieldType.PM, protoName: 'messagesList', subBuilder: Message.create)\n    ..aOS(2, _omitFieldNames ? '' : 'cursor')\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'fetchInterval', $pb.PbFieldType.OU6, protoName: 'fetchInterval', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'now', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(5, _omitFieldNames ? '' : 'internalExt', protoName: 'internalExt')\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'fetchType', $pb.PbFieldType.OU3, protoName: 'fetchType')\n    ..m<$core.String, $core.String>(7, _omitFieldNames ? '' : 'routeParams', protoName: 'routeParams', entryClassName: 'Response.RouteParamsEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('douyin'))\n    ..a<$fixnum.Int64>(8, _omitFieldNames ? '' : 'heartbeatDuration', $pb.PbFieldType.OU6, protoName: 'heartbeatDuration', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(9, _omitFieldNames ? '' : 'needAck', protoName: 'needAck')\n    ..aOS(10, _omitFieldNames ? '' : 'pushServer', protoName: 'pushServer')\n    ..aOS(11, _omitFieldNames ? '' : 'liveCursor', protoName: 'liveCursor')\n    ..aOB(12, _omitFieldNames ? '' : 'historyNoMore', protoName: 'historyNoMore')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Response clone() => Response()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Response copyWith(void Function(Response) updates) => super.copyWith((message) => updates(message as Response)) as Response;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Response create() => Response._();\n  Response createEmptyInstance() => create();\n  static $pb.PbList<Response> createRepeated() => $pb.PbList<Response>();\n  @$core.pragma('dart2js:noInline')\n  static Response getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Response>(create);\n  static Response? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.List<Message> get messagesList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get cursor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cursor($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCursor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCursor() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fetchInterval => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fetchInterval($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasFetchInterval() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFetchInterval() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get now => $_getI64(3);\n  @$pb.TagNumber(4)\n  set now($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasNow() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNow() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get internalExt => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set internalExt($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasInternalExt() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearInternalExt() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get fetchType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set fetchType($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasFetchType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFetchType() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.Map<$core.String, $core.String> get routeParams => $_getMap(6);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get heartbeatDuration => $_getI64(7);\n  @$pb.TagNumber(8)\n  set heartbeatDuration($fixnum.Int64 v) { $_setInt64(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasHeartbeatDuration() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHeartbeatDuration() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get needAck => $_getBF(8);\n  @$pb.TagNumber(9)\n  set needAck($core.bool v) { $_setBool(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasNeedAck() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNeedAck() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get pushServer => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set pushServer($core.String v) { $_setString(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasPushServer() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPushServer() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get liveCursor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set liveCursor($core.String v) { $_setString(10, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasLiveCursor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearLiveCursor() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get historyNoMore => $_getBF(11);\n  @$pb.TagNumber(12)\n  set historyNoMore($core.bool v) { $_setBool(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasHistoryNoMore() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearHistoryNoMore() => clearField(12);\n}\n\nclass Message extends $pb.GeneratedMessage {\n  factory Message() => create();\n  Message._() : super();\n  factory Message.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Message.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Message', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'method')\n    ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'payload', $pb.PbFieldType.OY)\n    ..aInt64(3, _omitFieldNames ? '' : 'msgId', protoName: 'msgId')\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'msgType', $pb.PbFieldType.O3, protoName: 'msgType')\n    ..aInt64(5, _omitFieldNames ? '' : 'offset')\n    ..aOB(6, _omitFieldNames ? '' : 'needWrdsStore', protoName: 'needWrdsStore')\n    ..aInt64(7, _omitFieldNames ? '' : 'wrdsVersion', protoName: 'wrdsVersion')\n    ..aOS(8, _omitFieldNames ? '' : 'wrdsSubKey', protoName: 'wrdsSubKey')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Message clone() => Message()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Message copyWith(void Function(Message) updates) => super.copyWith((message) => updates(message as Message)) as Message;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Message create() => Message._();\n  Message createEmptyInstance() => create();\n  static $pb.PbList<Message> createRepeated() => $pb.PbList<Message>();\n  @$core.pragma('dart2js:noInline')\n  static Message getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Message>(create);\n  static Message? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get method => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set method($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasMethod() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMethod() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.List<$core.int> get payload => $_getN(1);\n  @$pb.TagNumber(2)\n  set payload($core.List<$core.int> v) { $_setBytes(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasPayload() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPayload() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get msgId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set msgId($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasMsgId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsgId() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get msgType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set msgType($core.int v) { $_setSignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasMsgType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMsgType() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get offset => $_getI64(4);\n  @$pb.TagNumber(5)\n  set offset($fixnum.Int64 v) { $_setInt64(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasOffset() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOffset() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get needWrdsStore => $_getBF(5);\n  @$pb.TagNumber(6)\n  set needWrdsStore($core.bool v) { $_setBool(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasNeedWrdsStore() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNeedWrdsStore() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get wrdsVersion => $_getI64(6);\n  @$pb.TagNumber(7)\n  set wrdsVersion($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasWrdsVersion() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearWrdsVersion() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get wrdsSubKey => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set wrdsSubKey($core.String v) { $_setString(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasWrdsSubKey() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearWrdsSubKey() => clearField(8);\n}\n\nclass ChatMessage extends $pb.GeneratedMessage {\n  factory ChatMessage() => create();\n  ChatMessage._() : super();\n  factory ChatMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ChatMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ChatMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOS(3, _omitFieldNames ? '' : 'content')\n    ..aOB(4, _omitFieldNames ? '' : 'visibleToSender', protoName: 'visibleToSender')\n    ..aOM<Image>(5, _omitFieldNames ? '' : 'backgroundImage', protoName: 'backgroundImage', subBuilder: Image.create)\n    ..aOS(6, _omitFieldNames ? '' : 'fullScreenTextColor', protoName: 'fullScreenTextColor')\n    ..aOM<Image>(7, _omitFieldNames ? '' : 'backgroundImageV2', protoName: 'backgroundImageV2', subBuilder: Image.create)\n    ..aOM<PublicAreaCommon>(8, _omitFieldNames ? '' : 'publicAreaCommon', protoName: 'publicAreaCommon', subBuilder: PublicAreaCommon.create)\n    ..aOM<Image>(9, _omitFieldNames ? '' : 'giftImage', protoName: 'giftImage', subBuilder: Image.create)\n    ..a<$fixnum.Int64>(11, _omitFieldNames ? '' : 'agreeMsgId', $pb.PbFieldType.OU6, protoName: 'agreeMsgId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$core.int>(12, _omitFieldNames ? '' : 'priorityLevel', $pb.PbFieldType.OU3, protoName: 'priorityLevel')\n    ..aOM<LandscapeAreaCommon>(13, _omitFieldNames ? '' : 'landscapeAreaCommon', protoName: 'landscapeAreaCommon', subBuilder: LandscapeAreaCommon.create)\n    ..a<$fixnum.Int64>(15, _omitFieldNames ? '' : 'eventTime', $pb.PbFieldType.OU6, protoName: 'eventTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(16, _omitFieldNames ? '' : 'sendReview', protoName: 'sendReview')\n    ..aOB(17, _omitFieldNames ? '' : 'fromIntercom', protoName: 'fromIntercom')\n    ..aOB(18, _omitFieldNames ? '' : 'intercomHideUserCard', protoName: 'intercomHideUserCard')\n    ..aOS(20, _omitFieldNames ? '' : 'chatBy', protoName: 'chatBy')\n    ..a<$core.int>(21, _omitFieldNames ? '' : 'individualChatPriority', $pb.PbFieldType.OU3, protoName: 'individualChatPriority')\n    ..aOM<Text>(22, _omitFieldNames ? '' : 'rtfContent', protoName: 'rtfContent', subBuilder: Text.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ChatMessage clone() => ChatMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ChatMessage copyWith(void Function(ChatMessage) updates) => super.copyWith((message) => updates(message as ChatMessage)) as ChatMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChatMessage create() => ChatMessage._();\n  ChatMessage createEmptyInstance() => create();\n  static $pb.PbList<ChatMessage> createRepeated() => $pb.PbList<ChatMessage>();\n  @$core.pragma('dart2js:noInline')\n  static ChatMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ChatMessage>(create);\n  static ChatMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get content => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set content($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearContent() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get visibleToSender => $_getBF(3);\n  @$pb.TagNumber(4)\n  set visibleToSender($core.bool v) { $_setBool(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasVisibleToSender() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVisibleToSender() => clearField(4);\n\n  @$pb.TagNumber(5)\n  Image get backgroundImage => $_getN(4);\n  @$pb.TagNumber(5)\n  set backgroundImage(Image v) { setField(5, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasBackgroundImage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBackgroundImage() => clearField(5);\n  @$pb.TagNumber(5)\n  Image ensureBackgroundImage() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get fullScreenTextColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set fullScreenTextColor($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasFullScreenTextColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFullScreenTextColor() => clearField(6);\n\n  @$pb.TagNumber(7)\n  Image get backgroundImageV2 => $_getN(6);\n  @$pb.TagNumber(7)\n  set backgroundImageV2(Image v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasBackgroundImageV2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBackgroundImageV2() => clearField(7);\n  @$pb.TagNumber(7)\n  Image ensureBackgroundImageV2() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  PublicAreaCommon get publicAreaCommon => $_getN(7);\n  @$pb.TagNumber(8)\n  set publicAreaCommon(PublicAreaCommon v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasPublicAreaCommon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPublicAreaCommon() => clearField(8);\n  @$pb.TagNumber(8)\n  PublicAreaCommon ensurePublicAreaCommon() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Image get giftImage => $_getN(8);\n  @$pb.TagNumber(9)\n  set giftImage(Image v) { setField(9, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasGiftImage() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearGiftImage() => clearField(9);\n  @$pb.TagNumber(9)\n  Image ensureGiftImage() => $_ensure(8);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get agreeMsgId => $_getI64(9);\n  @$pb.TagNumber(11)\n  set agreeMsgId($fixnum.Int64 v) { $_setInt64(9, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasAgreeMsgId() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearAgreeMsgId() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get priorityLevel => $_getIZ(10);\n  @$pb.TagNumber(12)\n  set priorityLevel($core.int v) { $_setUnsignedInt32(10, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasPriorityLevel() => $_has(10);\n  @$pb.TagNumber(12)\n  void clearPriorityLevel() => clearField(12);\n\n  @$pb.TagNumber(13)\n  LandscapeAreaCommon get landscapeAreaCommon => $_getN(11);\n  @$pb.TagNumber(13)\n  set landscapeAreaCommon(LandscapeAreaCommon v) { setField(13, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasLandscapeAreaCommon() => $_has(11);\n  @$pb.TagNumber(13)\n  void clearLandscapeAreaCommon() => clearField(13);\n  @$pb.TagNumber(13)\n  LandscapeAreaCommon ensureLandscapeAreaCommon() => $_ensure(11);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get eventTime => $_getI64(12);\n  @$pb.TagNumber(15)\n  set eventTime($fixnum.Int64 v) { $_setInt64(12, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasEventTime() => $_has(12);\n  @$pb.TagNumber(15)\n  void clearEventTime() => clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.bool get sendReview => $_getBF(13);\n  @$pb.TagNumber(16)\n  set sendReview($core.bool v) { $_setBool(13, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasSendReview() => $_has(13);\n  @$pb.TagNumber(16)\n  void clearSendReview() => clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.bool get fromIntercom => $_getBF(14);\n  @$pb.TagNumber(17)\n  set fromIntercom($core.bool v) { $_setBool(14, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasFromIntercom() => $_has(14);\n  @$pb.TagNumber(17)\n  void clearFromIntercom() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.bool get intercomHideUserCard => $_getBF(15);\n  @$pb.TagNumber(18)\n  set intercomHideUserCard($core.bool v) { $_setBool(15, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasIntercomHideUserCard() => $_has(15);\n  @$pb.TagNumber(18)\n  void clearIntercomHideUserCard() => clearField(18);\n\n  @$pb.TagNumber(20)\n  $core.String get chatBy => $_getSZ(16);\n  @$pb.TagNumber(20)\n  set chatBy($core.String v) { $_setString(16, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasChatBy() => $_has(16);\n  @$pb.TagNumber(20)\n  void clearChatBy() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.int get individualChatPriority => $_getIZ(17);\n  @$pb.TagNumber(21)\n  set individualChatPriority($core.int v) { $_setUnsignedInt32(17, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasIndividualChatPriority() => $_has(17);\n  @$pb.TagNumber(21)\n  void clearIndividualChatPriority() => clearField(21);\n\n  @$pb.TagNumber(22)\n  Text get rtfContent => $_getN(18);\n  @$pb.TagNumber(22)\n  set rtfContent(Text v) { setField(22, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasRtfContent() => $_has(18);\n  @$pb.TagNumber(22)\n  void clearRtfContent() => clearField(22);\n  @$pb.TagNumber(22)\n  Text ensureRtfContent() => $_ensure(18);\n}\n\nclass LandscapeAreaCommon extends $pb.GeneratedMessage {\n  factory LandscapeAreaCommon() => create();\n  LandscapeAreaCommon._() : super();\n  factory LandscapeAreaCommon.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory LandscapeAreaCommon.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LandscapeAreaCommon', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'showHead', protoName: 'showHead')\n    ..aOB(2, _omitFieldNames ? '' : 'showNickname', protoName: 'showNickname')\n    ..aOB(3, _omitFieldNames ? '' : 'showFontColor', protoName: 'showFontColor')\n    ..pPS(4, _omitFieldNames ? '' : 'colorValueList', protoName: 'colorValueList')\n    ..pc<CommentTypeTag>(5, _omitFieldNames ? '' : 'commentTypeTagsList', $pb.PbFieldType.KE, protoName: 'commentTypeTagsList', valueOf: CommentTypeTag.valueOf, enumValues: CommentTypeTag.values, defaultEnumValue: CommentTypeTag.COMMENTTYPETAGUNKNOWN)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  LandscapeAreaCommon clone() => LandscapeAreaCommon()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  LandscapeAreaCommon copyWith(void Function(LandscapeAreaCommon) updates) => super.copyWith((message) => updates(message as LandscapeAreaCommon)) as LandscapeAreaCommon;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LandscapeAreaCommon create() => LandscapeAreaCommon._();\n  LandscapeAreaCommon createEmptyInstance() => create();\n  static $pb.PbList<LandscapeAreaCommon> createRepeated() => $pb.PbList<LandscapeAreaCommon>();\n  @$core.pragma('dart2js:noInline')\n  static LandscapeAreaCommon getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LandscapeAreaCommon>(create);\n  static LandscapeAreaCommon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get showHead => $_getBF(0);\n  @$pb.TagNumber(1)\n  set showHead($core.bool v) { $_setBool(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasShowHead() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowHead() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get showNickname => $_getBF(1);\n  @$pb.TagNumber(2)\n  set showNickname($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasShowNickname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowNickname() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get showFontColor => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showFontColor($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasShowFontColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowFontColor() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.List<$core.String> get colorValueList => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $core.List<CommentTypeTag> get commentTypeTagsList => $_getList(4);\n}\n\nclass RoomUserSeqMessage extends $pb.GeneratedMessage {\n  factory RoomUserSeqMessage() => create();\n  RoomUserSeqMessage._() : super();\n  factory RoomUserSeqMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory RoomUserSeqMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RoomUserSeqMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..pc<RoomUserSeqMessageContributor>(2, _omitFieldNames ? '' : 'ranksList', $pb.PbFieldType.PM, protoName: 'ranksList', subBuilder: RoomUserSeqMessageContributor.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'total')\n    ..aOS(4, _omitFieldNames ? '' : 'popStr', protoName: 'popStr')\n    ..pc<RoomUserSeqMessageContributor>(5, _omitFieldNames ? '' : 'seatsList', $pb.PbFieldType.PM, protoName: 'seatsList', subBuilder: RoomUserSeqMessageContributor.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'popularity')\n    ..aInt64(7, _omitFieldNames ? '' : 'totalUser', protoName: 'totalUser')\n    ..aOS(8, _omitFieldNames ? '' : 'totalUserStr', protoName: 'totalUserStr')\n    ..aOS(9, _omitFieldNames ? '' : 'totalStr', protoName: 'totalStr')\n    ..aOS(10, _omitFieldNames ? '' : 'onlineUserForAnchor', protoName: 'onlineUserForAnchor')\n    ..aOS(11, _omitFieldNames ? '' : 'totalPvForAnchor', protoName: 'totalPvForAnchor')\n    ..aOS(12, _omitFieldNames ? '' : 'upRightStatsStr', protoName: 'upRightStatsStr')\n    ..aOS(13, _omitFieldNames ? '' : 'upRightStatsStrComplete', protoName: 'upRightStatsStrComplete')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  RoomUserSeqMessage clone() => RoomUserSeqMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  RoomUserSeqMessage copyWith(void Function(RoomUserSeqMessage) updates) => super.copyWith((message) => updates(message as RoomUserSeqMessage)) as RoomUserSeqMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RoomUserSeqMessage create() => RoomUserSeqMessage._();\n  RoomUserSeqMessage createEmptyInstance() => create();\n  static $pb.PbList<RoomUserSeqMessage> createRepeated() => $pb.PbList<RoomUserSeqMessage>();\n  @$core.pragma('dart2js:noInline')\n  static RoomUserSeqMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RoomUserSeqMessage>(create);\n  static RoomUserSeqMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.List<RoomUserSeqMessageContributor> get ranksList => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get total => $_getI64(2);\n  @$pb.TagNumber(3)\n  set total($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasTotal() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTotal() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get popStr => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set popStr($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasPopStr() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPopStr() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.List<RoomUserSeqMessageContributor> get seatsList => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get popularity => $_getI64(5);\n  @$pb.TagNumber(6)\n  set popularity($fixnum.Int64 v) { $_setInt64(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasPopularity() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPopularity() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get totalUser => $_getI64(6);\n  @$pb.TagNumber(7)\n  set totalUser($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasTotalUser() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTotalUser() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get totalUserStr => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set totalUserStr($core.String v) { $_setString(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasTotalUserStr() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTotalUserStr() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get totalStr => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set totalStr($core.String v) { $_setString(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasTotalStr() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTotalStr() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get onlineUserForAnchor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set onlineUserForAnchor($core.String v) { $_setString(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasOnlineUserForAnchor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOnlineUserForAnchor() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get totalPvForAnchor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set totalPvForAnchor($core.String v) { $_setString(10, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasTotalPvForAnchor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTotalPvForAnchor() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get upRightStatsStr => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set upRightStatsStr($core.String v) { $_setString(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasUpRightStatsStr() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUpRightStatsStr() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get upRightStatsStrComplete => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set upRightStatsStrComplete($core.String v) { $_setString(12, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasUpRightStatsStrComplete() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearUpRightStatsStrComplete() => clearField(13);\n}\n\nclass CommonTextMessage extends $pb.GeneratedMessage {\n  factory CommonTextMessage() => create();\n  CommonTextMessage._() : super();\n  factory CommonTextMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory CommonTextMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CommonTextMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOS(3, _omitFieldNames ? '' : 'scene')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  CommonTextMessage clone() => CommonTextMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  CommonTextMessage copyWith(void Function(CommonTextMessage) updates) => super.copyWith((message) => updates(message as CommonTextMessage)) as CommonTextMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommonTextMessage create() => CommonTextMessage._();\n  CommonTextMessage createEmptyInstance() => create();\n  static $pb.PbList<CommonTextMessage> createRepeated() => $pb.PbList<CommonTextMessage>();\n  @$core.pragma('dart2js:noInline')\n  static CommonTextMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CommonTextMessage>(create);\n  static CommonTextMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get scene => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set scene($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasScene() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearScene() => clearField(3);\n}\n\nclass UpdateFanTicketMessage extends $pb.GeneratedMessage {\n  factory UpdateFanTicketMessage() => create();\n  UpdateFanTicketMessage._() : super();\n  factory UpdateFanTicketMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory UpdateFanTicketMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateFanTicketMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOS(2, _omitFieldNames ? '' : 'roomFanTicketCountText', protoName: 'roomFanTicketCountText')\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'roomFanTicketCount', $pb.PbFieldType.OU6, protoName: 'roomFanTicketCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(4, _omitFieldNames ? '' : 'forceUpdate', protoName: 'forceUpdate')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  UpdateFanTicketMessage clone() => UpdateFanTicketMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  UpdateFanTicketMessage copyWith(void Function(UpdateFanTicketMessage) updates) => super.copyWith((message) => updates(message as UpdateFanTicketMessage)) as UpdateFanTicketMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateFanTicketMessage create() => UpdateFanTicketMessage._();\n  UpdateFanTicketMessage createEmptyInstance() => create();\n  static $pb.PbList<UpdateFanTicketMessage> createRepeated() => $pb.PbList<UpdateFanTicketMessage>();\n  @$core.pragma('dart2js:noInline')\n  static UpdateFanTicketMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateFanTicketMessage>(create);\n  static UpdateFanTicketMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get roomFanTicketCountText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set roomFanTicketCountText($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasRoomFanTicketCountText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRoomFanTicketCountText() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get roomFanTicketCount => $_getI64(2);\n  @$pb.TagNumber(3)\n  set roomFanTicketCount($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasRoomFanTicketCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRoomFanTicketCount() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get forceUpdate => $_getBF(3);\n  @$pb.TagNumber(4)\n  set forceUpdate($core.bool v) { $_setBool(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasForceUpdate() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceUpdate() => clearField(4);\n}\n\nclass RoomUserSeqMessageContributor extends $pb.GeneratedMessage {\n  factory RoomUserSeqMessageContributor() => create();\n  RoomUserSeqMessageContributor._() : super();\n  factory RoomUserSeqMessageContributor.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory RoomUserSeqMessageContributor.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'RoomUserSeqMessageContributor', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'score', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'rank', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'delta', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(5, _omitFieldNames ? '' : 'isHidden', protoName: 'isHidden')\n    ..aOS(6, _omitFieldNames ? '' : 'scoreDescription', protoName: 'scoreDescription')\n    ..aOS(7, _omitFieldNames ? '' : 'exactlyScore', protoName: 'exactlyScore')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  RoomUserSeqMessageContributor clone() => RoomUserSeqMessageContributor()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  RoomUserSeqMessageContributor copyWith(void Function(RoomUserSeqMessageContributor) updates) => super.copyWith((message) => updates(message as RoomUserSeqMessageContributor)) as RoomUserSeqMessageContributor;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RoomUserSeqMessageContributor create() => RoomUserSeqMessageContributor._();\n  RoomUserSeqMessageContributor createEmptyInstance() => create();\n  static $pb.PbList<RoomUserSeqMessageContributor> createRepeated() => $pb.PbList<RoomUserSeqMessageContributor>();\n  @$core.pragma('dart2js:noInline')\n  static RoomUserSeqMessageContributor getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RoomUserSeqMessageContributor>(create);\n  static RoomUserSeqMessageContributor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get score => $_getI64(0);\n  @$pb.TagNumber(1)\n  set score($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasScore() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearScore() => clearField(1);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rank => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rank($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasRank() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRank() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get delta => $_getI64(3);\n  @$pb.TagNumber(4)\n  set delta($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasDelta() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDelta() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isHidden => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isHidden($core.bool v) { $_setBool(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasIsHidden() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsHidden() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get scoreDescription => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set scoreDescription($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasScoreDescription() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearScoreDescription() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get exactlyScore => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set exactlyScore($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasExactlyScore() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExactlyScore() => clearField(7);\n}\n\nclass GiftMessage extends $pb.GeneratedMessage {\n  factory GiftMessage() => create();\n  GiftMessage._() : super();\n  factory GiftMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory GiftMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GiftMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'giftId', $pb.PbFieldType.OU6, protoName: 'giftId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'fanTicketCount', $pb.PbFieldType.OU6, protoName: 'fanTicketCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'groupCount', $pb.PbFieldType.OU6, protoName: 'groupCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(5, _omitFieldNames ? '' : 'repeatCount', $pb.PbFieldType.OU6, protoName: 'repeatCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(6, _omitFieldNames ? '' : 'comboCount', $pb.PbFieldType.OU6, protoName: 'comboCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<User>(7, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOM<User>(8, _omitFieldNames ? '' : 'toUser', protoName: 'toUser', subBuilder: User.create)\n    ..a<$core.int>(9, _omitFieldNames ? '' : 'repeatEnd', $pb.PbFieldType.OU3, protoName: 'repeatEnd')\n    ..aOM<TextEffect>(10, _omitFieldNames ? '' : 'textEffect', protoName: 'textEffect', subBuilder: TextEffect.create)\n    ..a<$fixnum.Int64>(11, _omitFieldNames ? '' : 'groupId', $pb.PbFieldType.OU6, protoName: 'groupId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(12, _omitFieldNames ? '' : 'incomeTaskgifts', $pb.PbFieldType.OU6, protoName: 'incomeTaskgifts', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(13, _omitFieldNames ? '' : 'roomFanTicketCount', $pb.PbFieldType.OU6, protoName: 'roomFanTicketCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<GiftIMPriority>(14, _omitFieldNames ? '' : 'priority', subBuilder: GiftIMPriority.create)\n    ..aOM<GiftStruct>(15, _omitFieldNames ? '' : 'gift', subBuilder: GiftStruct.create)\n    ..aOS(16, _omitFieldNames ? '' : 'logId', protoName: 'logId')\n    ..a<$fixnum.Int64>(17, _omitFieldNames ? '' : 'sendType', $pb.PbFieldType.OU6, protoName: 'sendType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<PublicAreaCommon>(18, _omitFieldNames ? '' : 'publicAreaCommon', protoName: 'publicAreaCommon', subBuilder: PublicAreaCommon.create)\n    ..aOM<Text>(19, _omitFieldNames ? '' : 'trayDisplayText', protoName: 'trayDisplayText', subBuilder: Text.create)\n    ..a<$fixnum.Int64>(20, _omitFieldNames ? '' : 'bannedDisplayEffects', $pb.PbFieldType.OU6, protoName: 'bannedDisplayEffects', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(25, _omitFieldNames ? '' : 'displayForSelf', protoName: 'displayForSelf')\n    ..aOS(26, _omitFieldNames ? '' : 'interactGiftInfo', protoName: 'interactGiftInfo')\n    ..aOS(27, _omitFieldNames ? '' : 'diyItemInfo', protoName: 'diyItemInfo')\n    ..p<$fixnum.Int64>(28, _omitFieldNames ? '' : 'minAssetSetList', $pb.PbFieldType.KU6, protoName: 'minAssetSetList')\n    ..a<$fixnum.Int64>(29, _omitFieldNames ? '' : 'totalCount', $pb.PbFieldType.OU6, protoName: 'totalCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$core.int>(30, _omitFieldNames ? '' : 'clientGiftSource', $pb.PbFieldType.OU3, protoName: 'clientGiftSource')\n    ..p<$fixnum.Int64>(32, _omitFieldNames ? '' : 'toUserIdsList', $pb.PbFieldType.KU6, protoName: 'toUserIdsList')\n    ..a<$fixnum.Int64>(33, _omitFieldNames ? '' : 'sendTime', $pb.PbFieldType.OU6, protoName: 'sendTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(34, _omitFieldNames ? '' : 'forceDisplayEffects', $pb.PbFieldType.OU6, protoName: 'forceDisplayEffects', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(35, _omitFieldNames ? '' : 'traceId', protoName: 'traceId')\n    ..a<$fixnum.Int64>(36, _omitFieldNames ? '' : 'effectDisplayTs', $pb.PbFieldType.OU6, protoName: 'effectDisplayTs', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  GiftMessage clone() => GiftMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  GiftMessage copyWith(void Function(GiftMessage) updates) => super.copyWith((message) => updates(message as GiftMessage)) as GiftMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GiftMessage create() => GiftMessage._();\n  GiftMessage createEmptyInstance() => create();\n  static $pb.PbList<GiftMessage> createRepeated() => $pb.PbList<GiftMessage>();\n  @$core.pragma('dart2js:noInline')\n  static GiftMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GiftMessage>(create);\n  static GiftMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get giftId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set giftId($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasGiftId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGiftId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fanTicketCount => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fanTicketCount($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasFanTicketCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFanTicketCount() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get groupCount => $_getI64(3);\n  @$pb.TagNumber(4)\n  set groupCount($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasGroupCount() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGroupCount() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get repeatCount => $_getI64(4);\n  @$pb.TagNumber(5)\n  set repeatCount($fixnum.Int64 v) { $_setInt64(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasRepeatCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRepeatCount() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get comboCount => $_getI64(5);\n  @$pb.TagNumber(6)\n  set comboCount($fixnum.Int64 v) { $_setInt64(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasComboCount() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearComboCount() => clearField(6);\n\n  @$pb.TagNumber(7)\n  User get user => $_getN(6);\n  @$pb.TagNumber(7)\n  set user(User v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasUser() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUser() => clearField(7);\n  @$pb.TagNumber(7)\n  User ensureUser() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  User get toUser => $_getN(7);\n  @$pb.TagNumber(8)\n  set toUser(User v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasToUser() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearToUser() => clearField(8);\n  @$pb.TagNumber(8)\n  User ensureToUser() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.int get repeatEnd => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set repeatEnd($core.int v) { $_setUnsignedInt32(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasRepeatEnd() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRepeatEnd() => clearField(9);\n\n  @$pb.TagNumber(10)\n  TextEffect get textEffect => $_getN(9);\n  @$pb.TagNumber(10)\n  set textEffect(TextEffect v) { setField(10, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasTextEffect() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTextEffect() => clearField(10);\n  @$pb.TagNumber(10)\n  TextEffect ensureTextEffect() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get groupId => $_getI64(10);\n  @$pb.TagNumber(11)\n  set groupId($fixnum.Int64 v) { $_setInt64(10, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasGroupId() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearGroupId() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get incomeTaskgifts => $_getI64(11);\n  @$pb.TagNumber(12)\n  set incomeTaskgifts($fixnum.Int64 v) { $_setInt64(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasIncomeTaskgifts() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearIncomeTaskgifts() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get roomFanTicketCount => $_getI64(12);\n  @$pb.TagNumber(13)\n  set roomFanTicketCount($fixnum.Int64 v) { $_setInt64(12, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasRoomFanTicketCount() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRoomFanTicketCount() => clearField(13);\n\n  @$pb.TagNumber(14)\n  GiftIMPriority get priority => $_getN(13);\n  @$pb.TagNumber(14)\n  set priority(GiftIMPriority v) { setField(14, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasPriority() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearPriority() => clearField(14);\n  @$pb.TagNumber(14)\n  GiftIMPriority ensurePriority() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  GiftStruct get gift => $_getN(14);\n  @$pb.TagNumber(15)\n  set gift(GiftStruct v) { setField(15, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasGift() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearGift() => clearField(15);\n  @$pb.TagNumber(15)\n  GiftStruct ensureGift() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $core.String get logId => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set logId($core.String v) { $_setString(15, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasLogId() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLogId() => clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get sendType => $_getI64(16);\n  @$pb.TagNumber(17)\n  set sendType($fixnum.Int64 v) { $_setInt64(16, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasSendType() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSendType() => clearField(17);\n\n  @$pb.TagNumber(18)\n  PublicAreaCommon get publicAreaCommon => $_getN(17);\n  @$pb.TagNumber(18)\n  set publicAreaCommon(PublicAreaCommon v) { setField(18, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasPublicAreaCommon() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPublicAreaCommon() => clearField(18);\n  @$pb.TagNumber(18)\n  PublicAreaCommon ensurePublicAreaCommon() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  Text get trayDisplayText => $_getN(18);\n  @$pb.TagNumber(19)\n  set trayDisplayText(Text v) { setField(19, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasTrayDisplayText() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearTrayDisplayText() => clearField(19);\n  @$pb.TagNumber(19)\n  Text ensureTrayDisplayText() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get bannedDisplayEffects => $_getI64(19);\n  @$pb.TagNumber(20)\n  set bannedDisplayEffects($fixnum.Int64 v) { $_setInt64(19, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasBannedDisplayEffects() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearBannedDisplayEffects() => clearField(20);\n\n  @$pb.TagNumber(25)\n  $core.bool get displayForSelf => $_getBF(20);\n  @$pb.TagNumber(25)\n  set displayForSelf($core.bool v) { $_setBool(20, v); }\n  @$pb.TagNumber(25)\n  $core.bool hasDisplayForSelf() => $_has(20);\n  @$pb.TagNumber(25)\n  void clearDisplayForSelf() => clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get interactGiftInfo => $_getSZ(21);\n  @$pb.TagNumber(26)\n  set interactGiftInfo($core.String v) { $_setString(21, v); }\n  @$pb.TagNumber(26)\n  $core.bool hasInteractGiftInfo() => $_has(21);\n  @$pb.TagNumber(26)\n  void clearInteractGiftInfo() => clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.String get diyItemInfo => $_getSZ(22);\n  @$pb.TagNumber(27)\n  set diyItemInfo($core.String v) { $_setString(22, v); }\n  @$pb.TagNumber(27)\n  $core.bool hasDiyItemInfo() => $_has(22);\n  @$pb.TagNumber(27)\n  void clearDiyItemInfo() => clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.List<$fixnum.Int64> get minAssetSetList => $_getList(23);\n\n  @$pb.TagNumber(29)\n  $fixnum.Int64 get totalCount => $_getI64(24);\n  @$pb.TagNumber(29)\n  set totalCount($fixnum.Int64 v) { $_setInt64(24, v); }\n  @$pb.TagNumber(29)\n  $core.bool hasTotalCount() => $_has(24);\n  @$pb.TagNumber(29)\n  void clearTotalCount() => clearField(29);\n\n  @$pb.TagNumber(30)\n  $core.int get clientGiftSource => $_getIZ(25);\n  @$pb.TagNumber(30)\n  set clientGiftSource($core.int v) { $_setUnsignedInt32(25, v); }\n  @$pb.TagNumber(30)\n  $core.bool hasClientGiftSource() => $_has(25);\n  @$pb.TagNumber(30)\n  void clearClientGiftSource() => clearField(30);\n\n  @$pb.TagNumber(32)\n  $core.List<$fixnum.Int64> get toUserIdsList => $_getList(26);\n\n  @$pb.TagNumber(33)\n  $fixnum.Int64 get sendTime => $_getI64(27);\n  @$pb.TagNumber(33)\n  set sendTime($fixnum.Int64 v) { $_setInt64(27, v); }\n  @$pb.TagNumber(33)\n  $core.bool hasSendTime() => $_has(27);\n  @$pb.TagNumber(33)\n  void clearSendTime() => clearField(33);\n\n  @$pb.TagNumber(34)\n  $fixnum.Int64 get forceDisplayEffects => $_getI64(28);\n  @$pb.TagNumber(34)\n  set forceDisplayEffects($fixnum.Int64 v) { $_setInt64(28, v); }\n  @$pb.TagNumber(34)\n  $core.bool hasForceDisplayEffects() => $_has(28);\n  @$pb.TagNumber(34)\n  void clearForceDisplayEffects() => clearField(34);\n\n  @$pb.TagNumber(35)\n  $core.String get traceId => $_getSZ(29);\n  @$pb.TagNumber(35)\n  set traceId($core.String v) { $_setString(29, v); }\n  @$pb.TagNumber(35)\n  $core.bool hasTraceId() => $_has(29);\n  @$pb.TagNumber(35)\n  void clearTraceId() => clearField(35);\n\n  @$pb.TagNumber(36)\n  $fixnum.Int64 get effectDisplayTs => $_getI64(30);\n  @$pb.TagNumber(36)\n  set effectDisplayTs($fixnum.Int64 v) { $_setInt64(30, v); }\n  @$pb.TagNumber(36)\n  $core.bool hasEffectDisplayTs() => $_has(30);\n  @$pb.TagNumber(36)\n  void clearEffectDisplayTs() => clearField(36);\n}\n\nclass GiftStruct extends $pb.GeneratedMessage {\n  factory GiftStruct() => create();\n  GiftStruct._() : super();\n  factory GiftStruct.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory GiftStruct.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GiftStruct', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Image>(1, _omitFieldNames ? '' : 'image', subBuilder: Image.create)\n    ..aOS(2, _omitFieldNames ? '' : 'describe')\n    ..aOB(3, _omitFieldNames ? '' : 'notify')\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'duration', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(5, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(7, _omitFieldNames ? '' : 'forLinkmic', protoName: 'forLinkmic')\n    ..aOB(8, _omitFieldNames ? '' : 'doodle')\n    ..aOB(9, _omitFieldNames ? '' : 'forFansclub', protoName: 'forFansclub')\n    ..aOB(10, _omitFieldNames ? '' : 'combo')\n    ..a<$core.int>(11, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OU3)\n    ..a<$core.int>(12, _omitFieldNames ? '' : 'diamondCount', $pb.PbFieldType.OU3, protoName: 'diamondCount')\n    ..aOB(13, _omitFieldNames ? '' : 'isDisplayedOnPanel', protoName: 'isDisplayedOnPanel')\n    ..a<$fixnum.Int64>(14, _omitFieldNames ? '' : 'primaryEffectId', $pb.PbFieldType.OU6, protoName: 'primaryEffectId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<Image>(15, _omitFieldNames ? '' : 'giftLabelIcon', protoName: 'giftLabelIcon', subBuilder: Image.create)\n    ..aOS(16, _omitFieldNames ? '' : 'name')\n    ..aOS(17, _omitFieldNames ? '' : 'region')\n    ..aOS(18, _omitFieldNames ? '' : 'manual')\n    ..aOB(19, _omitFieldNames ? '' : 'forCustom', protoName: 'forCustom')\n    ..aOM<Image>(21, _omitFieldNames ? '' : 'icon', subBuilder: Image.create)\n    ..a<$core.int>(22, _omitFieldNames ? '' : 'actionType', $pb.PbFieldType.OU3, protoName: 'actionType')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  GiftStruct clone() => GiftStruct()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  GiftStruct copyWith(void Function(GiftStruct) updates) => super.copyWith((message) => updates(message as GiftStruct)) as GiftStruct;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GiftStruct create() => GiftStruct._();\n  GiftStruct createEmptyInstance() => create();\n  static $pb.PbList<GiftStruct> createRepeated() => $pb.PbList<GiftStruct>();\n  @$core.pragma('dart2js:noInline')\n  static GiftStruct getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GiftStruct>(create);\n  static GiftStruct? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Image get image => $_getN(0);\n  @$pb.TagNumber(1)\n  set image(Image v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImage() => clearField(1);\n  @$pb.TagNumber(1)\n  Image ensureImage() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get describe => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set describe($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDescribe() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescribe() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get notify => $_getBF(2);\n  @$pb.TagNumber(3)\n  set notify($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasNotify() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNotify() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get duration => $_getI64(3);\n  @$pb.TagNumber(4)\n  set duration($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasDuration() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDuration() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get id => $_getI64(4);\n  @$pb.TagNumber(5)\n  set id($fixnum.Int64 v) { $_setInt64(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearId() => clearField(5);\n\n  @$pb.TagNumber(7)\n  $core.bool get forLinkmic => $_getBF(5);\n  @$pb.TagNumber(7)\n  set forLinkmic($core.bool v) { $_setBool(5, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasForLinkmic() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearForLinkmic() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get doodle => $_getBF(6);\n  @$pb.TagNumber(8)\n  set doodle($core.bool v) { $_setBool(6, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasDoodle() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearDoodle() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get forFansclub => $_getBF(7);\n  @$pb.TagNumber(9)\n  set forFansclub($core.bool v) { $_setBool(7, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasForFansclub() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearForFansclub() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get combo => $_getBF(8);\n  @$pb.TagNumber(10)\n  set combo($core.bool v) { $_setBool(8, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasCombo() => $_has(8);\n  @$pb.TagNumber(10)\n  void clearCombo() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get type => $_getIZ(9);\n  @$pb.TagNumber(11)\n  set type($core.int v) { $_setUnsignedInt32(9, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasType() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearType() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get diamondCount => $_getIZ(10);\n  @$pb.TagNumber(12)\n  set diamondCount($core.int v) { $_setUnsignedInt32(10, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasDiamondCount() => $_has(10);\n  @$pb.TagNumber(12)\n  void clearDiamondCount() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get isDisplayedOnPanel => $_getBF(11);\n  @$pb.TagNumber(13)\n  set isDisplayedOnPanel($core.bool v) { $_setBool(11, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasIsDisplayedOnPanel() => $_has(11);\n  @$pb.TagNumber(13)\n  void clearIsDisplayedOnPanel() => clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get primaryEffectId => $_getI64(12);\n  @$pb.TagNumber(14)\n  set primaryEffectId($fixnum.Int64 v) { $_setInt64(12, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasPrimaryEffectId() => $_has(12);\n  @$pb.TagNumber(14)\n  void clearPrimaryEffectId() => clearField(14);\n\n  @$pb.TagNumber(15)\n  Image get giftLabelIcon => $_getN(13);\n  @$pb.TagNumber(15)\n  set giftLabelIcon(Image v) { setField(15, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasGiftLabelIcon() => $_has(13);\n  @$pb.TagNumber(15)\n  void clearGiftLabelIcon() => clearField(15);\n  @$pb.TagNumber(15)\n  Image ensureGiftLabelIcon() => $_ensure(13);\n\n  @$pb.TagNumber(16)\n  $core.String get name => $_getSZ(14);\n  @$pb.TagNumber(16)\n  set name($core.String v) { $_setString(14, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasName() => $_has(14);\n  @$pb.TagNumber(16)\n  void clearName() => clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get region => $_getSZ(15);\n  @$pb.TagNumber(17)\n  set region($core.String v) { $_setString(15, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasRegion() => $_has(15);\n  @$pb.TagNumber(17)\n  void clearRegion() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get manual => $_getSZ(16);\n  @$pb.TagNumber(18)\n  set manual($core.String v) { $_setString(16, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasManual() => $_has(16);\n  @$pb.TagNumber(18)\n  void clearManual() => clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.bool get forCustom => $_getBF(17);\n  @$pb.TagNumber(19)\n  set forCustom($core.bool v) { $_setBool(17, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasForCustom() => $_has(17);\n  @$pb.TagNumber(19)\n  void clearForCustom() => clearField(19);\n\n  @$pb.TagNumber(21)\n  Image get icon => $_getN(18);\n  @$pb.TagNumber(21)\n  set icon(Image v) { setField(21, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasIcon() => $_has(18);\n  @$pb.TagNumber(21)\n  void clearIcon() => clearField(21);\n  @$pb.TagNumber(21)\n  Image ensureIcon() => $_ensure(18);\n\n  @$pb.TagNumber(22)\n  $core.int get actionType => $_getIZ(19);\n  @$pb.TagNumber(22)\n  set actionType($core.int v) { $_setUnsignedInt32(19, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasActionType() => $_has(19);\n  @$pb.TagNumber(22)\n  void clearActionType() => clearField(22);\n}\n\nclass GiftIMPriority extends $pb.GeneratedMessage {\n  factory GiftIMPriority() => create();\n  GiftIMPriority._() : super();\n  factory GiftIMPriority.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory GiftIMPriority.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'GiftIMPriority', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'queueSizesList', $pb.PbFieldType.KU6, protoName: 'queueSizesList')\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'selfQueuePriority', $pb.PbFieldType.OU6, protoName: 'selfQueuePriority', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'priority', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  GiftIMPriority clone() => GiftIMPriority()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  GiftIMPriority copyWith(void Function(GiftIMPriority) updates) => super.copyWith((message) => updates(message as GiftIMPriority)) as GiftIMPriority;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GiftIMPriority create() => GiftIMPriority._();\n  GiftIMPriority createEmptyInstance() => create();\n  static $pb.PbList<GiftIMPriority> createRepeated() => $pb.PbList<GiftIMPriority>();\n  @$core.pragma('dart2js:noInline')\n  static GiftIMPriority getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GiftIMPriority>(create);\n  static GiftIMPriority? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.List<$fixnum.Int64> get queueSizesList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get selfQueuePriority => $_getI64(1);\n  @$pb.TagNumber(2)\n  set selfQueuePriority($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasSelfQueuePriority() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelfQueuePriority() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get priority => $_getI64(2);\n  @$pb.TagNumber(3)\n  set priority($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasPriority() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPriority() => clearField(3);\n}\n\nclass TextEffect extends $pb.GeneratedMessage {\n  factory TextEffect() => create();\n  TextEffect._() : super();\n  factory TextEffect.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextEffect.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextEffect', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<TextEffectDetail>(1, _omitFieldNames ? '' : 'portrait', subBuilder: TextEffectDetail.create)\n    ..aOM<TextEffectDetail>(2, _omitFieldNames ? '' : 'landscape', subBuilder: TextEffectDetail.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextEffect clone() => TextEffect()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextEffect copyWith(void Function(TextEffect) updates) => super.copyWith((message) => updates(message as TextEffect)) as TextEffect;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextEffect create() => TextEffect._();\n  TextEffect createEmptyInstance() => create();\n  static $pb.PbList<TextEffect> createRepeated() => $pb.PbList<TextEffect>();\n  @$core.pragma('dart2js:noInline')\n  static TextEffect getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextEffect>(create);\n  static TextEffect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TextEffectDetail get portrait => $_getN(0);\n  @$pb.TagNumber(1)\n  set portrait(TextEffectDetail v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasPortrait() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPortrait() => clearField(1);\n  @$pb.TagNumber(1)\n  TextEffectDetail ensurePortrait() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  TextEffectDetail get landscape => $_getN(1);\n  @$pb.TagNumber(2)\n  set landscape(TextEffectDetail v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasLandscape() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLandscape() => clearField(2);\n  @$pb.TagNumber(2)\n  TextEffectDetail ensureLandscape() => $_ensure(1);\n}\n\nclass TextEffectDetail extends $pb.GeneratedMessage {\n  factory TextEffectDetail() => create();\n  TextEffectDetail._() : super();\n  factory TextEffectDetail.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextEffectDetail.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextEffectDetail', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Text>(1, _omitFieldNames ? '' : 'text', subBuilder: Text.create)\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'textFontSize', $pb.PbFieldType.OU3, protoName: 'textFontSize')\n    ..aOM<Image>(3, _omitFieldNames ? '' : 'background', subBuilder: Image.create)\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'start', $pb.PbFieldType.OU3)\n    ..a<$core.int>(5, _omitFieldNames ? '' : 'duration', $pb.PbFieldType.OU3)\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'x', $pb.PbFieldType.OU3)\n    ..a<$core.int>(7, _omitFieldNames ? '' : 'y', $pb.PbFieldType.OU3)\n    ..a<$core.int>(8, _omitFieldNames ? '' : 'width', $pb.PbFieldType.OU3)\n    ..a<$core.int>(9, _omitFieldNames ? '' : 'height', $pb.PbFieldType.OU3)\n    ..a<$core.int>(10, _omitFieldNames ? '' : 'shadowDx', $pb.PbFieldType.OU3, protoName: 'shadowDx')\n    ..a<$core.int>(11, _omitFieldNames ? '' : 'shadowDy', $pb.PbFieldType.OU3, protoName: 'shadowDy')\n    ..a<$core.int>(12, _omitFieldNames ? '' : 'shadowRadius', $pb.PbFieldType.OU3, protoName: 'shadowRadius')\n    ..aOS(13, _omitFieldNames ? '' : 'shadowColor', protoName: 'shadowColor')\n    ..aOS(14, _omitFieldNames ? '' : 'strokeColor', protoName: 'strokeColor')\n    ..a<$core.int>(15, _omitFieldNames ? '' : 'strokeWidth', $pb.PbFieldType.OU3, protoName: 'strokeWidth')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextEffectDetail clone() => TextEffectDetail()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextEffectDetail copyWith(void Function(TextEffectDetail) updates) => super.copyWith((message) => updates(message as TextEffectDetail)) as TextEffectDetail;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextEffectDetail create() => TextEffectDetail._();\n  TextEffectDetail createEmptyInstance() => create();\n  static $pb.PbList<TextEffectDetail> createRepeated() => $pb.PbList<TextEffectDetail>();\n  @$core.pragma('dart2js:noInline')\n  static TextEffectDetail getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextEffectDetail>(create);\n  static TextEffectDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Text get text => $_getN(0);\n  @$pb.TagNumber(1)\n  set text(Text v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => clearField(1);\n  @$pb.TagNumber(1)\n  Text ensureText() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get textFontSize => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set textFontSize($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasTextFontSize() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextFontSize() => clearField(2);\n\n  @$pb.TagNumber(3)\n  Image get background => $_getN(2);\n  @$pb.TagNumber(3)\n  set background(Image v) { setField(3, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasBackground() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBackground() => clearField(3);\n  @$pb.TagNumber(3)\n  Image ensureBackground() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get start => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set start($core.int v) { $_setUnsignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasStart() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStart() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get duration => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set duration($core.int v) { $_setUnsignedInt32(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasDuration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDuration() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get x => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set x($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasX() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearX() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get y => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set y($core.int v) { $_setUnsignedInt32(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasY() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearY() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get width => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set width($core.int v) { $_setUnsignedInt32(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasWidth() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearWidth() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get height => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set height($core.int v) { $_setUnsignedInt32(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasHeight() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHeight() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get shadowDx => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set shadowDx($core.int v) { $_setUnsignedInt32(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasShadowDx() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearShadowDx() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get shadowDy => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set shadowDy($core.int v) { $_setUnsignedInt32(10, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasShadowDy() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearShadowDy() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get shadowRadius => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set shadowRadius($core.int v) { $_setUnsignedInt32(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasShadowRadius() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearShadowRadius() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get shadowColor => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set shadowColor($core.String v) { $_setString(12, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasShadowColor() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearShadowColor() => clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get strokeColor => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set strokeColor($core.String v) { $_setString(13, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasStrokeColor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearStrokeColor() => clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get strokeWidth => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set strokeWidth($core.int v) { $_setUnsignedInt32(14, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasStrokeWidth() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearStrokeWidth() => clearField(15);\n}\n\nclass MemberMessage extends $pb.GeneratedMessage {\n  factory MemberMessage() => create();\n  MemberMessage._() : super();\n  factory MemberMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory MemberMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'MemberMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'memberCount', $pb.PbFieldType.OU6, protoName: 'memberCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<User>(4, _omitFieldNames ? '' : 'operator', subBuilder: User.create)\n    ..aOB(5, _omitFieldNames ? '' : 'isSetToAdmin', protoName: 'isSetToAdmin')\n    ..aOB(6, _omitFieldNames ? '' : 'isTopUser', protoName: 'isTopUser')\n    ..a<$fixnum.Int64>(7, _omitFieldNames ? '' : 'rankScore', $pb.PbFieldType.OU6, protoName: 'rankScore', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(8, _omitFieldNames ? '' : 'topUserNo', $pb.PbFieldType.OU6, protoName: 'topUserNo', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(9, _omitFieldNames ? '' : 'enterType', $pb.PbFieldType.OU6, protoName: 'enterType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(10, _omitFieldNames ? '' : 'action', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(11, _omitFieldNames ? '' : 'actionDescription', protoName: 'actionDescription')\n    ..a<$fixnum.Int64>(12, _omitFieldNames ? '' : 'userId', $pb.PbFieldType.OU6, protoName: 'userId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<EffectConfig>(13, _omitFieldNames ? '' : 'effectConfig', protoName: 'effectConfig', subBuilder: EffectConfig.create)\n    ..aOS(14, _omitFieldNames ? '' : 'popStr', protoName: 'popStr')\n    ..aOM<EffectConfig>(15, _omitFieldNames ? '' : 'enterEffectConfig', protoName: 'enterEffectConfig', subBuilder: EffectConfig.create)\n    ..aOM<Image>(16, _omitFieldNames ? '' : 'backgroundImage', protoName: 'backgroundImage', subBuilder: Image.create)\n    ..aOM<Image>(17, _omitFieldNames ? '' : 'backgroundImageV2', protoName: 'backgroundImageV2', subBuilder: Image.create)\n    ..aOM<Text>(18, _omitFieldNames ? '' : 'anchorDisplayText', protoName: 'anchorDisplayText', subBuilder: Text.create)\n    ..aOM<PublicAreaCommon>(19, _omitFieldNames ? '' : 'publicAreaCommon', protoName: 'publicAreaCommon', subBuilder: PublicAreaCommon.create)\n    ..a<$fixnum.Int64>(20, _omitFieldNames ? '' : 'userEnterTipType', $pb.PbFieldType.OU6, protoName: 'userEnterTipType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(21, _omitFieldNames ? '' : 'anchorEnterTipType', $pb.PbFieldType.OU6, protoName: 'anchorEnterTipType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  MemberMessage clone() => MemberMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  MemberMessage copyWith(void Function(MemberMessage) updates) => super.copyWith((message) => updates(message as MemberMessage)) as MemberMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberMessage create() => MemberMessage._();\n  MemberMessage createEmptyInstance() => create();\n  static $pb.PbList<MemberMessage> createRepeated() => $pb.PbList<MemberMessage>();\n  @$core.pragma('dart2js:noInline')\n  static MemberMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MemberMessage>(create);\n  static MemberMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get memberCount => $_getI64(2);\n  @$pb.TagNumber(3)\n  set memberCount($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasMemberCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMemberCount() => clearField(3);\n\n  @$pb.TagNumber(4)\n  User get operator => $_getN(3);\n  @$pb.TagNumber(4)\n  set operator(User v) { setField(4, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasOperator() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOperator() => clearField(4);\n  @$pb.TagNumber(4)\n  User ensureOperator() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.bool get isSetToAdmin => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isSetToAdmin($core.bool v) { $_setBool(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasIsSetToAdmin() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsSetToAdmin() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isTopUser => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isTopUser($core.bool v) { $_setBool(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasIsTopUser() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsTopUser() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get rankScore => $_getI64(6);\n  @$pb.TagNumber(7)\n  set rankScore($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasRankScore() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRankScore() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get topUserNo => $_getI64(7);\n  @$pb.TagNumber(8)\n  set topUserNo($fixnum.Int64 v) { $_setInt64(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasTopUserNo() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTopUserNo() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get enterType => $_getI64(8);\n  @$pb.TagNumber(9)\n  set enterType($fixnum.Int64 v) { $_setInt64(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasEnterType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearEnterType() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get action => $_getI64(9);\n  @$pb.TagNumber(10)\n  set action($fixnum.Int64 v) { $_setInt64(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasAction() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAction() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get actionDescription => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set actionDescription($core.String v) { $_setString(10, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasActionDescription() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearActionDescription() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get userId => $_getI64(11);\n  @$pb.TagNumber(12)\n  set userId($fixnum.Int64 v) { $_setInt64(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasUserId() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUserId() => clearField(12);\n\n  @$pb.TagNumber(13)\n  EffectConfig get effectConfig => $_getN(12);\n  @$pb.TagNumber(13)\n  set effectConfig(EffectConfig v) { setField(13, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasEffectConfig() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearEffectConfig() => clearField(13);\n  @$pb.TagNumber(13)\n  EffectConfig ensureEffectConfig() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.String get popStr => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set popStr($core.String v) { $_setString(13, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasPopStr() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearPopStr() => clearField(14);\n\n  @$pb.TagNumber(15)\n  EffectConfig get enterEffectConfig => $_getN(14);\n  @$pb.TagNumber(15)\n  set enterEffectConfig(EffectConfig v) { setField(15, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasEnterEffectConfig() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearEnterEffectConfig() => clearField(15);\n  @$pb.TagNumber(15)\n  EffectConfig ensureEnterEffectConfig() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  Image get backgroundImage => $_getN(15);\n  @$pb.TagNumber(16)\n  set backgroundImage(Image v) { setField(16, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasBackgroundImage() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearBackgroundImage() => clearField(16);\n  @$pb.TagNumber(16)\n  Image ensureBackgroundImage() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  Image get backgroundImageV2 => $_getN(16);\n  @$pb.TagNumber(17)\n  set backgroundImageV2(Image v) { setField(17, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasBackgroundImageV2() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearBackgroundImageV2() => clearField(17);\n  @$pb.TagNumber(17)\n  Image ensureBackgroundImageV2() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  Text get anchorDisplayText => $_getN(17);\n  @$pb.TagNumber(18)\n  set anchorDisplayText(Text v) { setField(18, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasAnchorDisplayText() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearAnchorDisplayText() => clearField(18);\n  @$pb.TagNumber(18)\n  Text ensureAnchorDisplayText() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  PublicAreaCommon get publicAreaCommon => $_getN(18);\n  @$pb.TagNumber(19)\n  set publicAreaCommon(PublicAreaCommon v) { setField(19, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasPublicAreaCommon() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearPublicAreaCommon() => clearField(19);\n  @$pb.TagNumber(19)\n  PublicAreaCommon ensurePublicAreaCommon() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get userEnterTipType => $_getI64(19);\n  @$pb.TagNumber(20)\n  set userEnterTipType($fixnum.Int64 v) { $_setInt64(19, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasUserEnterTipType() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearUserEnterTipType() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $fixnum.Int64 get anchorEnterTipType => $_getI64(20);\n  @$pb.TagNumber(21)\n  set anchorEnterTipType($fixnum.Int64 v) { $_setInt64(20, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasAnchorEnterTipType() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearAnchorEnterTipType() => clearField(21);\n}\n\nclass PublicAreaCommon extends $pb.GeneratedMessage {\n  factory PublicAreaCommon() => create();\n  PublicAreaCommon._() : super();\n  factory PublicAreaCommon.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory PublicAreaCommon.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PublicAreaCommon', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Image>(1, _omitFieldNames ? '' : 'userLabel', protoName: 'userLabel', subBuilder: Image.create)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'userConsumeInRoom', $pb.PbFieldType.OU6, protoName: 'userConsumeInRoom', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'userSendGiftCntInRoom', $pb.PbFieldType.OU6, protoName: 'userSendGiftCntInRoom', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  PublicAreaCommon clone() => PublicAreaCommon()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  PublicAreaCommon copyWith(void Function(PublicAreaCommon) updates) => super.copyWith((message) => updates(message as PublicAreaCommon)) as PublicAreaCommon;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PublicAreaCommon create() => PublicAreaCommon._();\n  PublicAreaCommon createEmptyInstance() => create();\n  static $pb.PbList<PublicAreaCommon> createRepeated() => $pb.PbList<PublicAreaCommon>();\n  @$core.pragma('dart2js:noInline')\n  static PublicAreaCommon getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PublicAreaCommon>(create);\n  static PublicAreaCommon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Image get userLabel => $_getN(0);\n  @$pb.TagNumber(1)\n  set userLabel(Image v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasUserLabel() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserLabel() => clearField(1);\n  @$pb.TagNumber(1)\n  Image ensureUserLabel() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get userConsumeInRoom => $_getI64(1);\n  @$pb.TagNumber(2)\n  set userConsumeInRoom($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUserConsumeInRoom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUserConsumeInRoom() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get userSendGiftCntInRoom => $_getI64(2);\n  @$pb.TagNumber(3)\n  set userSendGiftCntInRoom($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasUserSendGiftCntInRoom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUserSendGiftCntInRoom() => clearField(3);\n}\n\nclass EffectConfig extends $pb.GeneratedMessage {\n  factory EffectConfig() => create();\n  EffectConfig._() : super();\n  factory EffectConfig.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory EffectConfig.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'EffectConfig', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<Image>(2, _omitFieldNames ? '' : 'icon', subBuilder: Image.create)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'avatarPos', $pb.PbFieldType.OU6, protoName: 'avatarPos', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<Text>(4, _omitFieldNames ? '' : 'text', subBuilder: Text.create)\n    ..aOM<Image>(5, _omitFieldNames ? '' : 'textIcon', protoName: 'textIcon', subBuilder: Image.create)\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'stayTime', $pb.PbFieldType.OU3, protoName: 'stayTime')\n    ..a<$fixnum.Int64>(7, _omitFieldNames ? '' : 'animAssetId', $pb.PbFieldType.OU6, protoName: 'animAssetId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<Image>(8, _omitFieldNames ? '' : 'badge', subBuilder: Image.create)\n    ..p<$fixnum.Int64>(9, _omitFieldNames ? '' : 'flexSettingArrayList', $pb.PbFieldType.KU6, protoName: 'flexSettingArrayList')\n    ..aOM<Image>(10, _omitFieldNames ? '' : 'textIconOverlay', protoName: 'textIconOverlay', subBuilder: Image.create)\n    ..aOM<Image>(11, _omitFieldNames ? '' : 'animatedBadge', protoName: 'animatedBadge', subBuilder: Image.create)\n    ..aOB(12, _omitFieldNames ? '' : 'hasSweepLight', protoName: 'hasSweepLight')\n    ..p<$fixnum.Int64>(13, _omitFieldNames ? '' : 'textFlexSettingArrayList', $pb.PbFieldType.KU6, protoName: 'textFlexSettingArrayList')\n    ..a<$fixnum.Int64>(14, _omitFieldNames ? '' : 'centerAnimAssetId', $pb.PbFieldType.OU6, protoName: 'centerAnimAssetId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<Image>(15, _omitFieldNames ? '' : 'dynamicImage', protoName: 'dynamicImage', subBuilder: Image.create)\n    ..m<$core.String, $core.String>(16, _omitFieldNames ? '' : 'extraMap', protoName: 'extraMap', entryClassName: 'EffectConfig.ExtraMapEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('douyin'))\n    ..a<$fixnum.Int64>(17, _omitFieldNames ? '' : 'mp4AnimAssetId', $pb.PbFieldType.OU6, protoName: 'mp4AnimAssetId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(18, _omitFieldNames ? '' : 'priority', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(19, _omitFieldNames ? '' : 'maxWaitTime', $pb.PbFieldType.OU6, protoName: 'maxWaitTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(20, _omitFieldNames ? '' : 'dressId', protoName: 'dressId')\n    ..a<$fixnum.Int64>(21, _omitFieldNames ? '' : 'alignment', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(22, _omitFieldNames ? '' : 'alignmentOffset', $pb.PbFieldType.OU6, protoName: 'alignmentOffset', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  EffectConfig clone() => EffectConfig()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  EffectConfig copyWith(void Function(EffectConfig) updates) => super.copyWith((message) => updates(message as EffectConfig)) as EffectConfig;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EffectConfig create() => EffectConfig._();\n  EffectConfig createEmptyInstance() => create();\n  static $pb.PbList<EffectConfig> createRepeated() => $pb.PbList<EffectConfig>();\n  @$core.pragma('dart2js:noInline')\n  static EffectConfig getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EffectConfig>(create);\n  static EffectConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get type => $_getI64(0);\n  @$pb.TagNumber(1)\n  set type($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => clearField(1);\n\n  @$pb.TagNumber(2)\n  Image get icon => $_getN(1);\n  @$pb.TagNumber(2)\n  set icon(Image v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => clearField(2);\n  @$pb.TagNumber(2)\n  Image ensureIcon() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get avatarPos => $_getI64(2);\n  @$pb.TagNumber(3)\n  set avatarPos($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasAvatarPos() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatarPos() => clearField(3);\n\n  @$pb.TagNumber(4)\n  Text get text => $_getN(3);\n  @$pb.TagNumber(4)\n  set text(Text v) { setField(4, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText() => clearField(4);\n  @$pb.TagNumber(4)\n  Text ensureText() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Image get textIcon => $_getN(4);\n  @$pb.TagNumber(5)\n  set textIcon(Image v) { setField(5, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasTextIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextIcon() => clearField(5);\n  @$pb.TagNumber(5)\n  Image ensureTextIcon() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get stayTime => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set stayTime($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasStayTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStayTime() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get animAssetId => $_getI64(6);\n  @$pb.TagNumber(7)\n  set animAssetId($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasAnimAssetId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAnimAssetId() => clearField(7);\n\n  @$pb.TagNumber(8)\n  Image get badge => $_getN(7);\n  @$pb.TagNumber(8)\n  set badge(Image v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasBadge() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadge() => clearField(8);\n  @$pb.TagNumber(8)\n  Image ensureBadge() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.List<$fixnum.Int64> get flexSettingArrayList => $_getList(8);\n\n  @$pb.TagNumber(10)\n  Image get textIconOverlay => $_getN(9);\n  @$pb.TagNumber(10)\n  set textIconOverlay(Image v) { setField(10, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasTextIconOverlay() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTextIconOverlay() => clearField(10);\n  @$pb.TagNumber(10)\n  Image ensureTextIconOverlay() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  Image get animatedBadge => $_getN(10);\n  @$pb.TagNumber(11)\n  set animatedBadge(Image v) { setField(11, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasAnimatedBadge() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAnimatedBadge() => clearField(11);\n  @$pb.TagNumber(11)\n  Image ensureAnimatedBadge() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.bool get hasSweepLight => $_getBF(11);\n  @$pb.TagNumber(12)\n  set hasSweepLight($core.bool v) { $_setBool(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasHasSweepLight() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearHasSweepLight() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.List<$fixnum.Int64> get textFlexSettingArrayList => $_getList(12);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get centerAnimAssetId => $_getI64(13);\n  @$pb.TagNumber(14)\n  set centerAnimAssetId($fixnum.Int64 v) { $_setInt64(13, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasCenterAnimAssetId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCenterAnimAssetId() => clearField(14);\n\n  @$pb.TagNumber(15)\n  Image get dynamicImage => $_getN(14);\n  @$pb.TagNumber(15)\n  set dynamicImage(Image v) { setField(15, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasDynamicImage() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearDynamicImage() => clearField(15);\n  @$pb.TagNumber(15)\n  Image ensureDynamicImage() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $core.Map<$core.String, $core.String> get extraMap => $_getMap(15);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get mp4AnimAssetId => $_getI64(16);\n  @$pb.TagNumber(17)\n  set mp4AnimAssetId($fixnum.Int64 v) { $_setInt64(16, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasMp4AnimAssetId() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearMp4AnimAssetId() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $fixnum.Int64 get priority => $_getI64(17);\n  @$pb.TagNumber(18)\n  set priority($fixnum.Int64 v) { $_setInt64(17, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasPriority() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPriority() => clearField(18);\n\n  @$pb.TagNumber(19)\n  $fixnum.Int64 get maxWaitTime => $_getI64(18);\n  @$pb.TagNumber(19)\n  set maxWaitTime($fixnum.Int64 v) { $_setInt64(18, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasMaxWaitTime() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearMaxWaitTime() => clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get dressId => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set dressId($core.String v) { $_setString(19, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasDressId() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDressId() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $fixnum.Int64 get alignment => $_getI64(20);\n  @$pb.TagNumber(21)\n  set alignment($fixnum.Int64 v) { $_setInt64(20, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasAlignment() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearAlignment() => clearField(21);\n\n  @$pb.TagNumber(22)\n  $fixnum.Int64 get alignmentOffset => $_getI64(21);\n  @$pb.TagNumber(22)\n  set alignmentOffset($fixnum.Int64 v) { $_setInt64(21, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasAlignmentOffset() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearAlignmentOffset() => clearField(22);\n}\n\nclass Text extends $pb.GeneratedMessage {\n  factory Text() => create();\n  Text._() : super();\n  factory Text.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Text.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Text', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'defaultPatter', protoName: 'defaultPatter')\n    ..aOM<TextFormat>(3, _omitFieldNames ? '' : 'defaultFormat', protoName: 'defaultFormat', subBuilder: TextFormat.create)\n    ..pc<TextPiece>(4, _omitFieldNames ? '' : 'piecesList', $pb.PbFieldType.PM, protoName: 'piecesList', subBuilder: TextPiece.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Text clone() => Text()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Text copyWith(void Function(Text) updates) => super.copyWith((message) => updates(message as Text)) as Text;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Text create() => Text._();\n  Text createEmptyInstance() => create();\n  static $pb.PbList<Text> createRepeated() => $pb.PbList<Text>();\n  @$core.pragma('dart2js:noInline')\n  static Text getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Text>(create);\n  static Text? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get defaultPatter => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set defaultPatter($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDefaultPatter() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDefaultPatter() => clearField(2);\n\n  @$pb.TagNumber(3)\n  TextFormat get defaultFormat => $_getN(2);\n  @$pb.TagNumber(3)\n  set defaultFormat(TextFormat v) { setField(3, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultFormat() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultFormat() => clearField(3);\n  @$pb.TagNumber(3)\n  TextFormat ensureDefaultFormat() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.List<TextPiece> get piecesList => $_getList(3);\n}\n\nclass TextPiece extends $pb.GeneratedMessage {\n  factory TextPiece() => create();\n  TextPiece._() : super();\n  factory TextPiece.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPiece.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPiece', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'type')\n    ..aOM<TextFormat>(2, _omitFieldNames ? '' : 'format', subBuilder: TextFormat.create)\n    ..aOS(3, _omitFieldNames ? '' : 'stringValue', protoName: 'stringValue')\n    ..aOM<TextPieceUser>(4, _omitFieldNames ? '' : 'userValue', protoName: 'userValue', subBuilder: TextPieceUser.create)\n    ..aOM<TextPieceGift>(5, _omitFieldNames ? '' : 'giftValue', protoName: 'giftValue', subBuilder: TextPieceGift.create)\n    ..aOM<TextPieceHeart>(6, _omitFieldNames ? '' : 'heartValue', protoName: 'heartValue', subBuilder: TextPieceHeart.create)\n    ..aOM<TextPiecePatternRef>(7, _omitFieldNames ? '' : 'patternRefValue', protoName: 'patternRefValue', subBuilder: TextPiecePatternRef.create)\n    ..aOM<TextPieceImage>(8, _omitFieldNames ? '' : 'imageValue', protoName: 'imageValue', subBuilder: TextPieceImage.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPiece clone() => TextPiece()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPiece copyWith(void Function(TextPiece) updates) => super.copyWith((message) => updates(message as TextPiece)) as TextPiece;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPiece create() => TextPiece._();\n  TextPiece createEmptyInstance() => create();\n  static $pb.PbList<TextPiece> createRepeated() => $pb.PbList<TextPiece>();\n  @$core.pragma('dart2js:noInline')\n  static TextPiece getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPiece>(create);\n  static TextPiece? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get type => $_getBF(0);\n  @$pb.TagNumber(1)\n  set type($core.bool v) { $_setBool(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => clearField(1);\n\n  @$pb.TagNumber(2)\n  TextFormat get format => $_getN(1);\n  @$pb.TagNumber(2)\n  set format(TextFormat v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => clearField(2);\n  @$pb.TagNumber(2)\n  TextFormat ensureFormat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get stringValue => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set stringValue($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasStringValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStringValue() => clearField(3);\n\n  @$pb.TagNumber(4)\n  TextPieceUser get userValue => $_getN(3);\n  @$pb.TagNumber(4)\n  set userValue(TextPieceUser v) { setField(4, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasUserValue() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUserValue() => clearField(4);\n  @$pb.TagNumber(4)\n  TextPieceUser ensureUserValue() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  TextPieceGift get giftValue => $_getN(4);\n  @$pb.TagNumber(5)\n  set giftValue(TextPieceGift v) { setField(5, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasGiftValue() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGiftValue() => clearField(5);\n  @$pb.TagNumber(5)\n  TextPieceGift ensureGiftValue() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  TextPieceHeart get heartValue => $_getN(5);\n  @$pb.TagNumber(6)\n  set heartValue(TextPieceHeart v) { setField(6, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasHeartValue() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearHeartValue() => clearField(6);\n  @$pb.TagNumber(6)\n  TextPieceHeart ensureHeartValue() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  TextPiecePatternRef get patternRefValue => $_getN(6);\n  @$pb.TagNumber(7)\n  set patternRefValue(TextPiecePatternRef v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasPatternRefValue() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPatternRefValue() => clearField(7);\n  @$pb.TagNumber(7)\n  TextPiecePatternRef ensurePatternRefValue() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  TextPieceImage get imageValue => $_getN(7);\n  @$pb.TagNumber(8)\n  set imageValue(TextPieceImage v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasImageValue() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearImageValue() => clearField(8);\n  @$pb.TagNumber(8)\n  TextPieceImage ensureImageValue() => $_ensure(7);\n}\n\nclass TextPieceImage extends $pb.GeneratedMessage {\n  factory TextPieceImage() => create();\n  TextPieceImage._() : super();\n  factory TextPieceImage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPieceImage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPieceImage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Image>(1, _omitFieldNames ? '' : 'image', subBuilder: Image.create)\n    ..a<$core.double>(2, _omitFieldNames ? '' : 'scalingRate', $pb.PbFieldType.OF, protoName: 'scalingRate')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPieceImage clone() => TextPieceImage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPieceImage copyWith(void Function(TextPieceImage) updates) => super.copyWith((message) => updates(message as TextPieceImage)) as TextPieceImage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPieceImage create() => TextPieceImage._();\n  TextPieceImage createEmptyInstance() => create();\n  static $pb.PbList<TextPieceImage> createRepeated() => $pb.PbList<TextPieceImage>();\n  @$core.pragma('dart2js:noInline')\n  static TextPieceImage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPieceImage>(create);\n  static TextPieceImage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Image get image => $_getN(0);\n  @$pb.TagNumber(1)\n  set image(Image v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImage() => clearField(1);\n  @$pb.TagNumber(1)\n  Image ensureImage() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.double get scalingRate => $_getN(1);\n  @$pb.TagNumber(2)\n  set scalingRate($core.double v) { $_setFloat(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasScalingRate() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScalingRate() => clearField(2);\n}\n\nclass TextPiecePatternRef extends $pb.GeneratedMessage {\n  factory TextPiecePatternRef() => create();\n  TextPiecePatternRef._() : super();\n  factory TextPiecePatternRef.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPiecePatternRef.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPiecePatternRef', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'defaultPattern', protoName: 'defaultPattern')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPiecePatternRef clone() => TextPiecePatternRef()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPiecePatternRef copyWith(void Function(TextPiecePatternRef) updates) => super.copyWith((message) => updates(message as TextPiecePatternRef)) as TextPiecePatternRef;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPiecePatternRef create() => TextPiecePatternRef._();\n  TextPiecePatternRef createEmptyInstance() => create();\n  static $pb.PbList<TextPiecePatternRef> createRepeated() => $pb.PbList<TextPiecePatternRef>();\n  @$core.pragma('dart2js:noInline')\n  static TextPiecePatternRef getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPiecePatternRef>(create);\n  static TextPiecePatternRef? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get defaultPattern => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set defaultPattern($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDefaultPattern() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDefaultPattern() => clearField(2);\n}\n\nclass TextPieceHeart extends $pb.GeneratedMessage {\n  factory TextPieceHeart() => create();\n  TextPieceHeart._() : super();\n  factory TextPieceHeart.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPieceHeart.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPieceHeart', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'color')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPieceHeart clone() => TextPieceHeart()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPieceHeart copyWith(void Function(TextPieceHeart) updates) => super.copyWith((message) => updates(message as TextPieceHeart)) as TextPieceHeart;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPieceHeart create() => TextPieceHeart._();\n  TextPieceHeart createEmptyInstance() => create();\n  static $pb.PbList<TextPieceHeart> createRepeated() => $pb.PbList<TextPieceHeart>();\n  @$core.pragma('dart2js:noInline')\n  static TextPieceHeart getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPieceHeart>(create);\n  static TextPieceHeart? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get color => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set color($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColor() => clearField(1);\n}\n\nclass TextPieceGift extends $pb.GeneratedMessage {\n  factory TextPieceGift() => create();\n  TextPieceGift._() : super();\n  factory TextPieceGift.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPieceGift.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPieceGift', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'giftId', $pb.PbFieldType.OU6, protoName: 'giftId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<PatternRef>(2, _omitFieldNames ? '' : 'nameRef', protoName: 'nameRef', subBuilder: PatternRef.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPieceGift clone() => TextPieceGift()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPieceGift copyWith(void Function(TextPieceGift) updates) => super.copyWith((message) => updates(message as TextPieceGift)) as TextPieceGift;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPieceGift create() => TextPieceGift._();\n  TextPieceGift createEmptyInstance() => create();\n  static $pb.PbList<TextPieceGift> createRepeated() => $pb.PbList<TextPieceGift>();\n  @$core.pragma('dart2js:noInline')\n  static TextPieceGift getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPieceGift>(create);\n  static TextPieceGift? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get giftId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set giftId($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasGiftId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGiftId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  PatternRef get nameRef => $_getN(1);\n  @$pb.TagNumber(2)\n  set nameRef(PatternRef v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasNameRef() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNameRef() => clearField(2);\n  @$pb.TagNumber(2)\n  PatternRef ensureNameRef() => $_ensure(1);\n}\n\nclass PatternRef extends $pb.GeneratedMessage {\n  factory PatternRef() => create();\n  PatternRef._() : super();\n  factory PatternRef.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory PatternRef.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PatternRef', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'defaultPattern', protoName: 'defaultPattern')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  PatternRef clone() => PatternRef()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  PatternRef copyWith(void Function(PatternRef) updates) => super.copyWith((message) => updates(message as PatternRef)) as PatternRef;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PatternRef create() => PatternRef._();\n  PatternRef createEmptyInstance() => create();\n  static $pb.PbList<PatternRef> createRepeated() => $pb.PbList<PatternRef>();\n  @$core.pragma('dart2js:noInline')\n  static PatternRef getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PatternRef>(create);\n  static PatternRef? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get defaultPattern => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set defaultPattern($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasDefaultPattern() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDefaultPattern() => clearField(2);\n}\n\nclass TextPieceUser extends $pb.GeneratedMessage {\n  factory TextPieceUser() => create();\n  TextPieceUser._() : super();\n  factory TextPieceUser.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextPieceUser.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextPieceUser', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<User>(1, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOB(2, _omitFieldNames ? '' : 'withColon', protoName: 'withColon')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextPieceUser clone() => TextPieceUser()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextPieceUser copyWith(void Function(TextPieceUser) updates) => super.copyWith((message) => updates(message as TextPieceUser)) as TextPieceUser;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextPieceUser create() => TextPieceUser._();\n  TextPieceUser createEmptyInstance() => create();\n  static $pb.PbList<TextPieceUser> createRepeated() => $pb.PbList<TextPieceUser>();\n  @$core.pragma('dart2js:noInline')\n  static TextPieceUser getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextPieceUser>(create);\n  static TextPieceUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  User get user => $_getN(0);\n  @$pb.TagNumber(1)\n  set user(User v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasUser() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUser() => clearField(1);\n  @$pb.TagNumber(1)\n  User ensureUser() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get withColon => $_getBF(1);\n  @$pb.TagNumber(2)\n  set withColon($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasWithColon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWithColon() => clearField(2);\n}\n\nclass TextFormat extends $pb.GeneratedMessage {\n  factory TextFormat() => create();\n  TextFormat._() : super();\n  factory TextFormat.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory TextFormat.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TextFormat', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'color')\n    ..aOB(2, _omitFieldNames ? '' : 'bold')\n    ..aOB(3, _omitFieldNames ? '' : 'italic')\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'weight', $pb.PbFieldType.OU3)\n    ..a<$core.int>(5, _omitFieldNames ? '' : 'italicAngle', $pb.PbFieldType.OU3, protoName: 'italicAngle')\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'fontSize', $pb.PbFieldType.OU3, protoName: 'fontSize')\n    ..aOB(7, _omitFieldNames ? '' : 'useHeighLightColor', protoName: 'useHeighLightColor')\n    ..aOB(8, _omitFieldNames ? '' : 'useRemoteClor', protoName: 'useRemoteClor')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  TextFormat clone() => TextFormat()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  TextFormat copyWith(void Function(TextFormat) updates) => super.copyWith((message) => updates(message as TextFormat)) as TextFormat;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextFormat create() => TextFormat._();\n  TextFormat createEmptyInstance() => create();\n  static $pb.PbList<TextFormat> createRepeated() => $pb.PbList<TextFormat>();\n  @$core.pragma('dart2js:noInline')\n  static TextFormat getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextFormat>(create);\n  static TextFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get color => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set color($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColor() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get bold => $_getBF(1);\n  @$pb.TagNumber(2)\n  set bold($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasBold() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBold() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get italic => $_getBF(2);\n  @$pb.TagNumber(3)\n  set italic($core.bool v) { $_setBool(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasItalic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearItalic() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get weight => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set weight($core.int v) { $_setUnsignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasWeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearWeight() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get italicAngle => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set italicAngle($core.int v) { $_setUnsignedInt32(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasItalicAngle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearItalicAngle() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get fontSize => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set fontSize($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasFontSize() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFontSize() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get useHeighLightColor => $_getBF(6);\n  @$pb.TagNumber(7)\n  set useHeighLightColor($core.bool v) { $_setBool(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasUseHeighLightColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUseHeighLightColor() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get useRemoteClor => $_getBF(7);\n  @$pb.TagNumber(8)\n  set useRemoteClor($core.bool v) { $_setBool(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasUseRemoteClor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearUseRemoteClor() => clearField(8);\n}\n\nclass LikeMessage extends $pb.GeneratedMessage {\n  factory LikeMessage() => create();\n  LikeMessage._() : super();\n  factory LikeMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory LikeMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LikeMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'count', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'total', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'color', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<User>(5, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOS(6, _omitFieldNames ? '' : 'icon')\n    ..aOM<DoubleLikeDetail>(7, _omitFieldNames ? '' : 'doubleLikeDetail', protoName: 'doubleLikeDetail', subBuilder: DoubleLikeDetail.create)\n    ..aOM<DisplayControlInfo>(8, _omitFieldNames ? '' : 'displayControlInfo', protoName: 'displayControlInfo', subBuilder: DisplayControlInfo.create)\n    ..a<$fixnum.Int64>(9, _omitFieldNames ? '' : 'linkmicGuestUid', $pb.PbFieldType.OU6, protoName: 'linkmicGuestUid', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(10, _omitFieldNames ? '' : 'scene')\n    ..aOM<PicoDisplayInfo>(11, _omitFieldNames ? '' : 'picoDisplayInfo', protoName: 'picoDisplayInfo', subBuilder: PicoDisplayInfo.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  LikeMessage clone() => LikeMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  LikeMessage copyWith(void Function(LikeMessage) updates) => super.copyWith((message) => updates(message as LikeMessage)) as LikeMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeMessage create() => LikeMessage._();\n  LikeMessage createEmptyInstance() => create();\n  static $pb.PbList<LikeMessage> createRepeated() => $pb.PbList<LikeMessage>();\n  @$core.pragma('dart2js:noInline')\n  static LikeMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeMessage>(create);\n  static LikeMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get count => $_getI64(1);\n  @$pb.TagNumber(2)\n  set count($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCount() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get total => $_getI64(2);\n  @$pb.TagNumber(3)\n  set total($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasTotal() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTotal() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get color => $_getI64(3);\n  @$pb.TagNumber(4)\n  set color($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColor() => clearField(4);\n\n  @$pb.TagNumber(5)\n  User get user => $_getN(4);\n  @$pb.TagNumber(5)\n  set user(User v) { setField(5, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasUser() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUser() => clearField(5);\n  @$pb.TagNumber(5)\n  User ensureUser() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get icon => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set icon($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasIcon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIcon() => clearField(6);\n\n  @$pb.TagNumber(7)\n  DoubleLikeDetail get doubleLikeDetail => $_getN(6);\n  @$pb.TagNumber(7)\n  set doubleLikeDetail(DoubleLikeDetail v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasDoubleLikeDetail() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDoubleLikeDetail() => clearField(7);\n  @$pb.TagNumber(7)\n  DoubleLikeDetail ensureDoubleLikeDetail() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  DisplayControlInfo get displayControlInfo => $_getN(7);\n  @$pb.TagNumber(8)\n  set displayControlInfo(DisplayControlInfo v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasDisplayControlInfo() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDisplayControlInfo() => clearField(8);\n  @$pb.TagNumber(8)\n  DisplayControlInfo ensureDisplayControlInfo() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get linkmicGuestUid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set linkmicGuestUid($fixnum.Int64 v) { $_setInt64(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasLinkmicGuestUid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLinkmicGuestUid() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get scene => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set scene($core.String v) { $_setString(9, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasScene() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearScene() => clearField(10);\n\n  @$pb.TagNumber(11)\n  PicoDisplayInfo get picoDisplayInfo => $_getN(10);\n  @$pb.TagNumber(11)\n  set picoDisplayInfo(PicoDisplayInfo v) { setField(11, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasPicoDisplayInfo() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPicoDisplayInfo() => clearField(11);\n  @$pb.TagNumber(11)\n  PicoDisplayInfo ensurePicoDisplayInfo() => $_ensure(10);\n}\n\nclass SocialMessage extends $pb.GeneratedMessage {\n  factory SocialMessage() => create();\n  SocialMessage._() : super();\n  factory SocialMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory SocialMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SocialMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'shareType', $pb.PbFieldType.OU6, protoName: 'shareType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'action', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(5, _omitFieldNames ? '' : 'shareTarget', protoName: 'shareTarget')\n    ..a<$fixnum.Int64>(6, _omitFieldNames ? '' : 'followCount', $pb.PbFieldType.OU6, protoName: 'followCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOM<PublicAreaCommon>(7, _omitFieldNames ? '' : 'publicAreaCommon', protoName: 'publicAreaCommon', subBuilder: PublicAreaCommon.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  SocialMessage clone() => SocialMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  SocialMessage copyWith(void Function(SocialMessage) updates) => super.copyWith((message) => updates(message as SocialMessage)) as SocialMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SocialMessage create() => SocialMessage._();\n  SocialMessage createEmptyInstance() => create();\n  static $pb.PbList<SocialMessage> createRepeated() => $pb.PbList<SocialMessage>();\n  @$core.pragma('dart2js:noInline')\n  static SocialMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SocialMessage>(create);\n  static SocialMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get shareType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set shareType($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasShareType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShareType() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get action => $_getI64(3);\n  @$pb.TagNumber(4)\n  set action($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasAction() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAction() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get shareTarget => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set shareTarget($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasShareTarget() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShareTarget() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get followCount => $_getI64(5);\n  @$pb.TagNumber(6)\n  set followCount($fixnum.Int64 v) { $_setInt64(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasFollowCount() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFollowCount() => clearField(6);\n\n  @$pb.TagNumber(7)\n  PublicAreaCommon get publicAreaCommon => $_getN(6);\n  @$pb.TagNumber(7)\n  set publicAreaCommon(PublicAreaCommon v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasPublicAreaCommon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPublicAreaCommon() => clearField(7);\n  @$pb.TagNumber(7)\n  PublicAreaCommon ensurePublicAreaCommon() => $_ensure(6);\n}\n\nclass PicoDisplayInfo extends $pb.GeneratedMessage {\n  factory PicoDisplayInfo() => create();\n  PicoDisplayInfo._() : super();\n  factory PicoDisplayInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory PicoDisplayInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PicoDisplayInfo', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'comboSumCount', $pb.PbFieldType.OU6, protoName: 'comboSumCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(2, _omitFieldNames ? '' : 'emoji')\n    ..aOM<Image>(3, _omitFieldNames ? '' : 'emojiIcon', protoName: 'emojiIcon', subBuilder: Image.create)\n    ..aOS(4, _omitFieldNames ? '' : 'emojiText', protoName: 'emojiText')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  PicoDisplayInfo clone() => PicoDisplayInfo()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  PicoDisplayInfo copyWith(void Function(PicoDisplayInfo) updates) => super.copyWith((message) => updates(message as PicoDisplayInfo)) as PicoDisplayInfo;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PicoDisplayInfo create() => PicoDisplayInfo._();\n  PicoDisplayInfo createEmptyInstance() => create();\n  static $pb.PbList<PicoDisplayInfo> createRepeated() => $pb.PbList<PicoDisplayInfo>();\n  @$core.pragma('dart2js:noInline')\n  static PicoDisplayInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PicoDisplayInfo>(create);\n  static PicoDisplayInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get comboSumCount => $_getI64(0);\n  @$pb.TagNumber(1)\n  set comboSumCount($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasComboSumCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearComboSumCount() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get emoji => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set emoji($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasEmoji() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEmoji() => clearField(2);\n\n  @$pb.TagNumber(3)\n  Image get emojiIcon => $_getN(2);\n  @$pb.TagNumber(3)\n  set emojiIcon(Image v) { setField(3, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasEmojiIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEmojiIcon() => clearField(3);\n  @$pb.TagNumber(3)\n  Image ensureEmojiIcon() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get emojiText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set emojiText($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasEmojiText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmojiText() => clearField(4);\n}\n\nclass DoubleLikeDetail extends $pb.GeneratedMessage {\n  factory DoubleLikeDetail() => create();\n  DoubleLikeDetail._() : super();\n  factory DoubleLikeDetail.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory DoubleLikeDetail.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DoubleLikeDetail', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'doubleFlag', protoName: 'doubleFlag')\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'seqId', $pb.PbFieldType.OU3, protoName: 'seqId')\n    ..a<$core.int>(3, _omitFieldNames ? '' : 'renewalsNum', $pb.PbFieldType.OU3, protoName: 'renewalsNum')\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'triggersNum', $pb.PbFieldType.OU3, protoName: 'triggersNum')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  DoubleLikeDetail clone() => DoubleLikeDetail()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  DoubleLikeDetail copyWith(void Function(DoubleLikeDetail) updates) => super.copyWith((message) => updates(message as DoubleLikeDetail)) as DoubleLikeDetail;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DoubleLikeDetail create() => DoubleLikeDetail._();\n  DoubleLikeDetail createEmptyInstance() => create();\n  static $pb.PbList<DoubleLikeDetail> createRepeated() => $pb.PbList<DoubleLikeDetail>();\n  @$core.pragma('dart2js:noInline')\n  static DoubleLikeDetail getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DoubleLikeDetail>(create);\n  static DoubleLikeDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get doubleFlag => $_getBF(0);\n  @$pb.TagNumber(1)\n  set doubleFlag($core.bool v) { $_setBool(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasDoubleFlag() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDoubleFlag() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get seqId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set seqId($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasSeqId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeqId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get renewalsNum => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set renewalsNum($core.int v) { $_setUnsignedInt32(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasRenewalsNum() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRenewalsNum() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get triggersNum => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set triggersNum($core.int v) { $_setUnsignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasTriggersNum() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTriggersNum() => clearField(4);\n}\n\nclass DisplayControlInfo extends $pb.GeneratedMessage {\n  factory DisplayControlInfo() => create();\n  DisplayControlInfo._() : super();\n  factory DisplayControlInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory DisplayControlInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'DisplayControlInfo', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'showText', protoName: 'showText')\n    ..aOB(2, _omitFieldNames ? '' : 'showIcons', protoName: 'showIcons')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  DisplayControlInfo clone() => DisplayControlInfo()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  DisplayControlInfo copyWith(void Function(DisplayControlInfo) updates) => super.copyWith((message) => updates(message as DisplayControlInfo)) as DisplayControlInfo;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DisplayControlInfo create() => DisplayControlInfo._();\n  DisplayControlInfo createEmptyInstance() => create();\n  static $pb.PbList<DisplayControlInfo> createRepeated() => $pb.PbList<DisplayControlInfo>();\n  @$core.pragma('dart2js:noInline')\n  static DisplayControlInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DisplayControlInfo>(create);\n  static DisplayControlInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get showText => $_getBF(0);\n  @$pb.TagNumber(1)\n  set showText($core.bool v) { $_setBool(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasShowText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowText() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get showIcons => $_getBF(1);\n  @$pb.TagNumber(2)\n  set showIcons($core.bool v) { $_setBool(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasShowIcons() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowIcons() => clearField(2);\n}\n\nclass EpisodeChatMessage extends $pb.GeneratedMessage {\n  factory EpisodeChatMessage() => create();\n  EpisodeChatMessage._() : super();\n  factory EpisodeChatMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory EpisodeChatMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'EpisodeChatMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Message>(1, _omitFieldNames ? '' : 'common', subBuilder: Message.create)\n    ..aOM<User>(2, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..aOS(3, _omitFieldNames ? '' : 'content')\n    ..aOB(4, _omitFieldNames ? '' : 'visibleToSende', protoName: 'visibleToSende')\n    ..aOM<Image>(7, _omitFieldNames ? '' : 'giftImage', protoName: 'giftImage', subBuilder: Image.create)\n    ..a<$fixnum.Int64>(8, _omitFieldNames ? '' : 'agreeMsgId', $pb.PbFieldType.OU6, protoName: 'agreeMsgId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..pPS(9, _omitFieldNames ? '' : 'colorValueList', protoName: 'colorValueList')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  EpisodeChatMessage clone() => EpisodeChatMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  EpisodeChatMessage copyWith(void Function(EpisodeChatMessage) updates) => super.copyWith((message) => updates(message as EpisodeChatMessage)) as EpisodeChatMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EpisodeChatMessage create() => EpisodeChatMessage._();\n  EpisodeChatMessage createEmptyInstance() => create();\n  static $pb.PbList<EpisodeChatMessage> createRepeated() => $pb.PbList<EpisodeChatMessage>();\n  @$core.pragma('dart2js:noInline')\n  static EpisodeChatMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EpisodeChatMessage>(create);\n  static EpisodeChatMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Message get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Message v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Message ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  User get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(User v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => clearField(2);\n  @$pb.TagNumber(2)\n  User ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get content => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set content($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearContent() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get visibleToSende => $_getBF(3);\n  @$pb.TagNumber(4)\n  set visibleToSende($core.bool v) { $_setBool(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasVisibleToSende() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVisibleToSende() => clearField(4);\n\n  @$pb.TagNumber(7)\n  Image get giftImage => $_getN(4);\n  @$pb.TagNumber(7)\n  set giftImage(Image v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasGiftImage() => $_has(4);\n  @$pb.TagNumber(7)\n  void clearGiftImage() => clearField(7);\n  @$pb.TagNumber(7)\n  Image ensureGiftImage() => $_ensure(4);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get agreeMsgId => $_getI64(5);\n  @$pb.TagNumber(8)\n  set agreeMsgId($fixnum.Int64 v) { $_setInt64(5, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasAgreeMsgId() => $_has(5);\n  @$pb.TagNumber(8)\n  void clearAgreeMsgId() => clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.List<$core.String> get colorValueList => $_getList(6);\n}\n\nclass MatchAgainstScoreMessage extends $pb.GeneratedMessage {\n  factory MatchAgainstScoreMessage() => create();\n  MatchAgainstScoreMessage._() : super();\n  factory MatchAgainstScoreMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory MatchAgainstScoreMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'MatchAgainstScoreMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOM<Common>(1, _omitFieldNames ? '' : 'common', subBuilder: Common.create)\n    ..aOM<Against>(2, _omitFieldNames ? '' : 'against', subBuilder: Against.create)\n    ..a<$core.int>(3, _omitFieldNames ? '' : 'matchStatus', $pb.PbFieldType.OU3, protoName: 'matchStatus')\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'displayStatus', $pb.PbFieldType.OU3, protoName: 'displayStatus')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  MatchAgainstScoreMessage clone() => MatchAgainstScoreMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  MatchAgainstScoreMessage copyWith(void Function(MatchAgainstScoreMessage) updates) => super.copyWith((message) => updates(message as MatchAgainstScoreMessage)) as MatchAgainstScoreMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MatchAgainstScoreMessage create() => MatchAgainstScoreMessage._();\n  MatchAgainstScoreMessage createEmptyInstance() => create();\n  static $pb.PbList<MatchAgainstScoreMessage> createRepeated() => $pb.PbList<MatchAgainstScoreMessage>();\n  @$core.pragma('dart2js:noInline')\n  static MatchAgainstScoreMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MatchAgainstScoreMessage>(create);\n  static MatchAgainstScoreMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Common get common => $_getN(0);\n  @$pb.TagNumber(1)\n  set common(Common v) { setField(1, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCommon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommon() => clearField(1);\n  @$pb.TagNumber(1)\n  Common ensureCommon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Against get against => $_getN(1);\n  @$pb.TagNumber(2)\n  set against(Against v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasAgainst() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAgainst() => clearField(2);\n  @$pb.TagNumber(2)\n  Against ensureAgainst() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get matchStatus => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set matchStatus($core.int v) { $_setUnsignedInt32(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasMatchStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMatchStatus() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get displayStatus => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set displayStatus($core.int v) { $_setUnsignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasDisplayStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDisplayStatus() => clearField(4);\n}\n\nclass Against extends $pb.GeneratedMessage {\n  factory Against() => create();\n  Against._() : super();\n  factory Against.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Against.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Against', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'leftName', protoName: 'leftName')\n    ..aOM<Image>(2, _omitFieldNames ? '' : 'leftLogo', protoName: 'leftLogo', subBuilder: Image.create)\n    ..aOS(3, _omitFieldNames ? '' : 'leftGoal', protoName: 'leftGoal')\n    ..aOS(6, _omitFieldNames ? '' : 'rightName', protoName: 'rightName')\n    ..aOM<Image>(7, _omitFieldNames ? '' : 'rightLogo', protoName: 'rightLogo', subBuilder: Image.create)\n    ..aOS(8, _omitFieldNames ? '' : 'rightGoal', protoName: 'rightGoal')\n    ..a<$fixnum.Int64>(11, _omitFieldNames ? '' : 'timestamp', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(12, _omitFieldNames ? '' : 'version', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(13, _omitFieldNames ? '' : 'leftTeamId', $pb.PbFieldType.OU6, protoName: 'leftTeamId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(14, _omitFieldNames ? '' : 'rightTeamId', $pb.PbFieldType.OU6, protoName: 'rightTeamId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(15, _omitFieldNames ? '' : 'diffSei2absSecond', $pb.PbFieldType.OU6, protoName: 'diffSei2absSecond', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$core.int>(16, _omitFieldNames ? '' : 'finalGoalStage', $pb.PbFieldType.OU3, protoName: 'finalGoalStage')\n    ..a<$core.int>(17, _omitFieldNames ? '' : 'currentGoalStage', $pb.PbFieldType.OU3, protoName: 'currentGoalStage')\n    ..a<$core.int>(18, _omitFieldNames ? '' : 'leftScoreAddition', $pb.PbFieldType.OU3, protoName: 'leftScoreAddition')\n    ..a<$core.int>(19, _omitFieldNames ? '' : 'rightScoreAddition', $pb.PbFieldType.OU3, protoName: 'rightScoreAddition')\n    ..a<$fixnum.Int64>(20, _omitFieldNames ? '' : 'leftGoalInt', $pb.PbFieldType.OU6, protoName: 'leftGoalInt', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(21, _omitFieldNames ? '' : 'rightGoalInt', $pb.PbFieldType.OU6, protoName: 'rightGoalInt', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Against clone() => Against()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Against copyWith(void Function(Against) updates) => super.copyWith((message) => updates(message as Against)) as Against;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Against create() => Against._();\n  Against createEmptyInstance() => create();\n  static $pb.PbList<Against> createRepeated() => $pb.PbList<Against>();\n  @$core.pragma('dart2js:noInline')\n  static Against getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Against>(create);\n  static Against? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get leftName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set leftName($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasLeftName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLeftName() => clearField(1);\n\n  @$pb.TagNumber(2)\n  Image get leftLogo => $_getN(1);\n  @$pb.TagNumber(2)\n  set leftLogo(Image v) { setField(2, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasLeftLogo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftLogo() => clearField(2);\n  @$pb.TagNumber(2)\n  Image ensureLeftLogo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get leftGoal => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set leftGoal($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasLeftGoal() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLeftGoal() => clearField(3);\n\n  @$pb.TagNumber(6)\n  $core.String get rightName => $_getSZ(3);\n  @$pb.TagNumber(6)\n  set rightName($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasRightName() => $_has(3);\n  @$pb.TagNumber(6)\n  void clearRightName() => clearField(6);\n\n  @$pb.TagNumber(7)\n  Image get rightLogo => $_getN(4);\n  @$pb.TagNumber(7)\n  set rightLogo(Image v) { setField(7, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasRightLogo() => $_has(4);\n  @$pb.TagNumber(7)\n  void clearRightLogo() => clearField(7);\n  @$pb.TagNumber(7)\n  Image ensureRightLogo() => $_ensure(4);\n\n  @$pb.TagNumber(8)\n  $core.String get rightGoal => $_getSZ(5);\n  @$pb.TagNumber(8)\n  set rightGoal($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasRightGoal() => $_has(5);\n  @$pb.TagNumber(8)\n  void clearRightGoal() => clearField(8);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get timestamp => $_getI64(6);\n  @$pb.TagNumber(11)\n  set timestamp($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasTimestamp() => $_has(6);\n  @$pb.TagNumber(11)\n  void clearTimestamp() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get version => $_getI64(7);\n  @$pb.TagNumber(12)\n  set version($fixnum.Int64 v) { $_setInt64(7, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasVersion() => $_has(7);\n  @$pb.TagNumber(12)\n  void clearVersion() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get leftTeamId => $_getI64(8);\n  @$pb.TagNumber(13)\n  set leftTeamId($fixnum.Int64 v) { $_setInt64(8, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasLeftTeamId() => $_has(8);\n  @$pb.TagNumber(13)\n  void clearLeftTeamId() => clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get rightTeamId => $_getI64(9);\n  @$pb.TagNumber(14)\n  set rightTeamId($fixnum.Int64 v) { $_setInt64(9, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasRightTeamId() => $_has(9);\n  @$pb.TagNumber(14)\n  void clearRightTeamId() => clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get diffSei2absSecond => $_getI64(10);\n  @$pb.TagNumber(15)\n  set diffSei2absSecond($fixnum.Int64 v) { $_setInt64(10, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasDiffSei2absSecond() => $_has(10);\n  @$pb.TagNumber(15)\n  void clearDiffSei2absSecond() => clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get finalGoalStage => $_getIZ(11);\n  @$pb.TagNumber(16)\n  set finalGoalStage($core.int v) { $_setUnsignedInt32(11, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasFinalGoalStage() => $_has(11);\n  @$pb.TagNumber(16)\n  void clearFinalGoalStage() => clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get currentGoalStage => $_getIZ(12);\n  @$pb.TagNumber(17)\n  set currentGoalStage($core.int v) { $_setUnsignedInt32(12, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasCurrentGoalStage() => $_has(12);\n  @$pb.TagNumber(17)\n  void clearCurrentGoalStage() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get leftScoreAddition => $_getIZ(13);\n  @$pb.TagNumber(18)\n  set leftScoreAddition($core.int v) { $_setUnsignedInt32(13, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasLeftScoreAddition() => $_has(13);\n  @$pb.TagNumber(18)\n  void clearLeftScoreAddition() => clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get rightScoreAddition => $_getIZ(14);\n  @$pb.TagNumber(19)\n  set rightScoreAddition($core.int v) { $_setUnsignedInt32(14, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasRightScoreAddition() => $_has(14);\n  @$pb.TagNumber(19)\n  void clearRightScoreAddition() => clearField(19);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get leftGoalInt => $_getI64(15);\n  @$pb.TagNumber(20)\n  set leftGoalInt($fixnum.Int64 v) { $_setInt64(15, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasLeftGoalInt() => $_has(15);\n  @$pb.TagNumber(20)\n  void clearLeftGoalInt() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $fixnum.Int64 get rightGoalInt => $_getI64(16);\n  @$pb.TagNumber(21)\n  set rightGoalInt($fixnum.Int64 v) { $_setInt64(16, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasRightGoalInt() => $_has(16);\n  @$pb.TagNumber(21)\n  void clearRightGoalInt() => clearField(21);\n}\n\nclass Common extends $pb.GeneratedMessage {\n  factory Common() => create();\n  Common._() : super();\n  factory Common.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Common.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Common', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'method')\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'msgId', $pb.PbFieldType.OU6, protoName: 'msgId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'roomId', $pb.PbFieldType.OU6, protoName: 'roomId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'createTime', $pb.PbFieldType.OU6, protoName: 'createTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$core.int>(5, _omitFieldNames ? '' : 'monitor', $pb.PbFieldType.OU3)\n    ..aOB(6, _omitFieldNames ? '' : 'isShowMsg', protoName: 'isShowMsg')\n    ..aOS(7, _omitFieldNames ? '' : 'describe')\n    ..a<$fixnum.Int64>(9, _omitFieldNames ? '' : 'foldType', $pb.PbFieldType.OU6, protoName: 'foldType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(10, _omitFieldNames ? '' : 'anchorFoldType', $pb.PbFieldType.OU6, protoName: 'anchorFoldType', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(11, _omitFieldNames ? '' : 'priorityScore', $pb.PbFieldType.OU6, protoName: 'priorityScore', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(12, _omitFieldNames ? '' : 'logId', protoName: 'logId')\n    ..aOS(13, _omitFieldNames ? '' : 'msgProcessFilterK', protoName: 'msgProcessFilterK')\n    ..aOS(14, _omitFieldNames ? '' : 'msgProcessFilterV', protoName: 'msgProcessFilterV')\n    ..aOM<User>(15, _omitFieldNames ? '' : 'user', subBuilder: User.create)\n    ..a<$fixnum.Int64>(17, _omitFieldNames ? '' : 'anchorFoldTypeV2', $pb.PbFieldType.OU6, protoName: 'anchorFoldTypeV2', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(18, _omitFieldNames ? '' : 'processAtSeiTimeMs', $pb.PbFieldType.OU6, protoName: 'processAtSeiTimeMs', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(19, _omitFieldNames ? '' : 'randomDispatchMs', $pb.PbFieldType.OU6, protoName: 'randomDispatchMs', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOB(20, _omitFieldNames ? '' : 'isDispatch', protoName: 'isDispatch')\n    ..a<$fixnum.Int64>(21, _omitFieldNames ? '' : 'channelId', $pb.PbFieldType.OU6, protoName: 'channelId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(22, _omitFieldNames ? '' : 'diffSei2absSecond', $pb.PbFieldType.OU6, protoName: 'diffSei2absSecond', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(23, _omitFieldNames ? '' : 'anchorFoldDuration', $pb.PbFieldType.OU6, protoName: 'anchorFoldDuration', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Common clone() => Common()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Common copyWith(void Function(Common) updates) => super.copyWith((message) => updates(message as Common)) as Common;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Common create() => Common._();\n  Common createEmptyInstance() => create();\n  static $pb.PbList<Common> createRepeated() => $pb.PbList<Common>();\n  @$core.pragma('dart2js:noInline')\n  static Common getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Common>(create);\n  static Common? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get method => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set method($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasMethod() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMethod() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get msgId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set msgId($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasMsgId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMsgId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get roomId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set roomId($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasRoomId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRoomId() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get createTime => $_getI64(3);\n  @$pb.TagNumber(4)\n  set createTime($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasCreateTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCreateTime() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get monitor => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set monitor($core.int v) { $_setUnsignedInt32(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasMonitor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMonitor() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isShowMsg => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isShowMsg($core.bool v) { $_setBool(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasIsShowMsg() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsShowMsg() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get describe => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set describe($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasDescribe() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDescribe() => clearField(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get foldType => $_getI64(7);\n  @$pb.TagNumber(9)\n  set foldType($fixnum.Int64 v) { $_setInt64(7, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasFoldType() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearFoldType() => clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get anchorFoldType => $_getI64(8);\n  @$pb.TagNumber(10)\n  set anchorFoldType($fixnum.Int64 v) { $_setInt64(8, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasAnchorFoldType() => $_has(8);\n  @$pb.TagNumber(10)\n  void clearAnchorFoldType() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get priorityScore => $_getI64(9);\n  @$pb.TagNumber(11)\n  set priorityScore($fixnum.Int64 v) { $_setInt64(9, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasPriorityScore() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearPriorityScore() => clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get logId => $_getSZ(10);\n  @$pb.TagNumber(12)\n  set logId($core.String v) { $_setString(10, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasLogId() => $_has(10);\n  @$pb.TagNumber(12)\n  void clearLogId() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get msgProcessFilterK => $_getSZ(11);\n  @$pb.TagNumber(13)\n  set msgProcessFilterK($core.String v) { $_setString(11, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasMsgProcessFilterK() => $_has(11);\n  @$pb.TagNumber(13)\n  void clearMsgProcessFilterK() => clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get msgProcessFilterV => $_getSZ(12);\n  @$pb.TagNumber(14)\n  set msgProcessFilterV($core.String v) { $_setString(12, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasMsgProcessFilterV() => $_has(12);\n  @$pb.TagNumber(14)\n  void clearMsgProcessFilterV() => clearField(14);\n\n  @$pb.TagNumber(15)\n  User get user => $_getN(13);\n  @$pb.TagNumber(15)\n  set user(User v) { setField(15, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasUser() => $_has(13);\n  @$pb.TagNumber(15)\n  void clearUser() => clearField(15);\n  @$pb.TagNumber(15)\n  User ensureUser() => $_ensure(13);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get anchorFoldTypeV2 => $_getI64(14);\n  @$pb.TagNumber(17)\n  set anchorFoldTypeV2($fixnum.Int64 v) { $_setInt64(14, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasAnchorFoldTypeV2() => $_has(14);\n  @$pb.TagNumber(17)\n  void clearAnchorFoldTypeV2() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $fixnum.Int64 get processAtSeiTimeMs => $_getI64(15);\n  @$pb.TagNumber(18)\n  set processAtSeiTimeMs($fixnum.Int64 v) { $_setInt64(15, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasProcessAtSeiTimeMs() => $_has(15);\n  @$pb.TagNumber(18)\n  void clearProcessAtSeiTimeMs() => clearField(18);\n\n  @$pb.TagNumber(19)\n  $fixnum.Int64 get randomDispatchMs => $_getI64(16);\n  @$pb.TagNumber(19)\n  set randomDispatchMs($fixnum.Int64 v) { $_setInt64(16, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasRandomDispatchMs() => $_has(16);\n  @$pb.TagNumber(19)\n  void clearRandomDispatchMs() => clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.bool get isDispatch => $_getBF(17);\n  @$pb.TagNumber(20)\n  set isDispatch($core.bool v) { $_setBool(17, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasIsDispatch() => $_has(17);\n  @$pb.TagNumber(20)\n  void clearIsDispatch() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $fixnum.Int64 get channelId => $_getI64(18);\n  @$pb.TagNumber(21)\n  set channelId($fixnum.Int64 v) { $_setInt64(18, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasChannelId() => $_has(18);\n  @$pb.TagNumber(21)\n  void clearChannelId() => clearField(21);\n\n  @$pb.TagNumber(22)\n  $fixnum.Int64 get diffSei2absSecond => $_getI64(19);\n  @$pb.TagNumber(22)\n  set diffSei2absSecond($fixnum.Int64 v) { $_setInt64(19, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasDiffSei2absSecond() => $_has(19);\n  @$pb.TagNumber(22)\n  void clearDiffSei2absSecond() => clearField(22);\n\n  @$pb.TagNumber(23)\n  $fixnum.Int64 get anchorFoldDuration => $_getI64(20);\n  @$pb.TagNumber(23)\n  set anchorFoldDuration($fixnum.Int64 v) { $_setInt64(20, v); }\n  @$pb.TagNumber(23)\n  $core.bool hasAnchorFoldDuration() => $_has(20);\n  @$pb.TagNumber(23)\n  void clearAnchorFoldDuration() => clearField(23);\n}\n\nclass User extends $pb.GeneratedMessage {\n  factory User() => create();\n  User._() : super();\n  factory User.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory User.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'User', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'id', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'shortId', $pb.PbFieldType.OU6, protoName: 'shortId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(3, _omitFieldNames ? '' : 'nickName', protoName: 'nickName')\n    ..a<$core.int>(4, _omitFieldNames ? '' : 'gender', $pb.PbFieldType.OU3)\n    ..aOS(5, _omitFieldNames ? '' : 'Signature', protoName: 'Signature')\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'Level', $pb.PbFieldType.OU3, protoName: 'Level')\n    ..a<$fixnum.Int64>(7, _omitFieldNames ? '' : 'Birthday', $pb.PbFieldType.OU6, protoName: 'Birthday', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(8, _omitFieldNames ? '' : 'Telephone', protoName: 'Telephone')\n    ..aOM<Image>(9, _omitFieldNames ? '' : 'AvatarThumb', protoName: 'AvatarThumb', subBuilder: Image.create)\n    ..aOM<Image>(10, _omitFieldNames ? '' : 'AvatarMedium', protoName: 'AvatarMedium', subBuilder: Image.create)\n    ..aOM<Image>(11, _omitFieldNames ? '' : 'AvatarLarge', protoName: 'AvatarLarge', subBuilder: Image.create)\n    ..aOB(12, _omitFieldNames ? '' : 'Verified', protoName: 'Verified')\n    ..a<$core.int>(13, _omitFieldNames ? '' : 'Experience', $pb.PbFieldType.OU3, protoName: 'Experience')\n    ..aOS(14, _omitFieldNames ? '' : 'city')\n    ..a<$core.int>(15, _omitFieldNames ? '' : 'Status', $pb.PbFieldType.O3, protoName: 'Status')\n    ..a<$fixnum.Int64>(16, _omitFieldNames ? '' : 'CreateTime', $pb.PbFieldType.OU6, protoName: 'CreateTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(17, _omitFieldNames ? '' : 'ModifyTime', $pb.PbFieldType.OU6, protoName: 'ModifyTime', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$core.int>(18, _omitFieldNames ? '' : 'Secret', $pb.PbFieldType.OU3, protoName: 'Secret')\n    ..aOS(19, _omitFieldNames ? '' : 'ShareQrcodeUri', protoName: 'ShareQrcodeUri')\n    ..a<$core.int>(20, _omitFieldNames ? '' : 'IncomeSharePercent', $pb.PbFieldType.OU3, protoName: 'IncomeSharePercent')\n    ..pc<Image>(21, _omitFieldNames ? '' : 'BadgeImageList', $pb.PbFieldType.PM, protoName: 'BadgeImageList', subBuilder: Image.create)\n    ..aOM<FollowInfo>(22, _omitFieldNames ? '' : 'FollowInfo', protoName: 'FollowInfo', subBuilder: FollowInfo.create)\n    ..aOS(26, _omitFieldNames ? '' : 'SpecialId', protoName: 'SpecialId')\n    ..aOM<Image>(27, _omitFieldNames ? '' : 'AvatarBorder', protoName: 'AvatarBorder', subBuilder: Image.create)\n    ..aOM<Image>(28, _omitFieldNames ? '' : 'Medal', protoName: 'Medal', subBuilder: Image.create)\n    ..pc<Image>(29, _omitFieldNames ? '' : 'RealTimeIconsList', $pb.PbFieldType.PM, protoName: 'RealTimeIconsList', subBuilder: Image.create)\n    ..aOS(38, _omitFieldNames ? '' : 'displayId', protoName: 'displayId')\n    ..aOS(46, _omitFieldNames ? '' : 'secUid', protoName: 'secUid')\n    ..a<$fixnum.Int64>(1022, _omitFieldNames ? '' : 'fanTicketCount', $pb.PbFieldType.OU6, protoName: 'fanTicketCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(1028, _omitFieldNames ? '' : 'idStr', protoName: 'idStr')\n    ..a<$core.int>(1045, _omitFieldNames ? '' : 'ageRange', $pb.PbFieldType.OU3, protoName: 'ageRange')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  User clone() => User()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  User copyWith(void Function(User) updates) => super.copyWith((message) => updates(message as User)) as User;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static User create() => User._();\n  User createEmptyInstance() => create();\n  static $pb.PbList<User> createRepeated() => $pb.PbList<User>();\n  @$core.pragma('dart2js:noInline')\n  static User getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<User>(create);\n  static User? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get shortId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set shortId($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasShortId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShortId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nickName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nickName($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasNickName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNickName() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get gender => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set gender($core.int v) { $_setUnsignedInt32(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasGender() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGender() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get signature => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set signature($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasSignature() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSignature() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get level => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set level($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasLevel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLevel() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get birthday => $_getI64(6);\n  @$pb.TagNumber(7)\n  set birthday($fixnum.Int64 v) { $_setInt64(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasBirthday() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBirthday() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get telephone => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set telephone($core.String v) { $_setString(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasTelephone() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTelephone() => clearField(8);\n\n  @$pb.TagNumber(9)\n  Image get avatarThumb => $_getN(8);\n  @$pb.TagNumber(9)\n  set avatarThumb(Image v) { setField(9, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasAvatarThumb() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAvatarThumb() => clearField(9);\n  @$pb.TagNumber(9)\n  Image ensureAvatarThumb() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  Image get avatarMedium => $_getN(9);\n  @$pb.TagNumber(10)\n  set avatarMedium(Image v) { setField(10, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasAvatarMedium() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAvatarMedium() => clearField(10);\n  @$pb.TagNumber(10)\n  Image ensureAvatarMedium() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  Image get avatarLarge => $_getN(10);\n  @$pb.TagNumber(11)\n  set avatarLarge(Image v) { setField(11, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasAvatarLarge() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAvatarLarge() => clearField(11);\n  @$pb.TagNumber(11)\n  Image ensureAvatarLarge() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.bool get verified => $_getBF(11);\n  @$pb.TagNumber(12)\n  set verified($core.bool v) { $_setBool(11, v); }\n  @$pb.TagNumber(12)\n  $core.bool hasVerified() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearVerified() => clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get experience => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set experience($core.int v) { $_setUnsignedInt32(12, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasExperience() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearExperience() => clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get city => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set city($core.String v) { $_setString(13, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasCity() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCity() => clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get status => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set status($core.int v) { $_setSignedInt32(14, v); }\n  @$pb.TagNumber(15)\n  $core.bool hasStatus() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearStatus() => clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get createTime => $_getI64(15);\n  @$pb.TagNumber(16)\n  set createTime($fixnum.Int64 v) { $_setInt64(15, v); }\n  @$pb.TagNumber(16)\n  $core.bool hasCreateTime() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCreateTime() => clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get modifyTime => $_getI64(16);\n  @$pb.TagNumber(17)\n  set modifyTime($fixnum.Int64 v) { $_setInt64(16, v); }\n  @$pb.TagNumber(17)\n  $core.bool hasModifyTime() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearModifyTime() => clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get secret => $_getIZ(17);\n  @$pb.TagNumber(18)\n  set secret($core.int v) { $_setUnsignedInt32(17, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasSecret() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearSecret() => clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get shareQrcodeUri => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set shareQrcodeUri($core.String v) { $_setString(18, v); }\n  @$pb.TagNumber(19)\n  $core.bool hasShareQrcodeUri() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearShareQrcodeUri() => clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.int get incomeSharePercent => $_getIZ(19);\n  @$pb.TagNumber(20)\n  set incomeSharePercent($core.int v) { $_setUnsignedInt32(19, v); }\n  @$pb.TagNumber(20)\n  $core.bool hasIncomeSharePercent() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearIncomeSharePercent() => clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.List<Image> get badgeImageList => $_getList(20);\n\n  @$pb.TagNumber(22)\n  FollowInfo get followInfo => $_getN(21);\n  @$pb.TagNumber(22)\n  set followInfo(FollowInfo v) { setField(22, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasFollowInfo() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearFollowInfo() => clearField(22);\n  @$pb.TagNumber(22)\n  FollowInfo ensureFollowInfo() => $_ensure(21);\n\n  @$pb.TagNumber(26)\n  $core.String get specialId => $_getSZ(22);\n  @$pb.TagNumber(26)\n  set specialId($core.String v) { $_setString(22, v); }\n  @$pb.TagNumber(26)\n  $core.bool hasSpecialId() => $_has(22);\n  @$pb.TagNumber(26)\n  void clearSpecialId() => clearField(26);\n\n  @$pb.TagNumber(27)\n  Image get avatarBorder => $_getN(23);\n  @$pb.TagNumber(27)\n  set avatarBorder(Image v) { setField(27, v); }\n  @$pb.TagNumber(27)\n  $core.bool hasAvatarBorder() => $_has(23);\n  @$pb.TagNumber(27)\n  void clearAvatarBorder() => clearField(27);\n  @$pb.TagNumber(27)\n  Image ensureAvatarBorder() => $_ensure(23);\n\n  @$pb.TagNumber(28)\n  Image get medal => $_getN(24);\n  @$pb.TagNumber(28)\n  set medal(Image v) { setField(28, v); }\n  @$pb.TagNumber(28)\n  $core.bool hasMedal() => $_has(24);\n  @$pb.TagNumber(28)\n  void clearMedal() => clearField(28);\n  @$pb.TagNumber(28)\n  Image ensureMedal() => $_ensure(24);\n\n  @$pb.TagNumber(29)\n  $core.List<Image> get realTimeIconsList => $_getList(25);\n\n  @$pb.TagNumber(38)\n  $core.String get displayId => $_getSZ(26);\n  @$pb.TagNumber(38)\n  set displayId($core.String v) { $_setString(26, v); }\n  @$pb.TagNumber(38)\n  $core.bool hasDisplayId() => $_has(26);\n  @$pb.TagNumber(38)\n  void clearDisplayId() => clearField(38);\n\n  @$pb.TagNumber(46)\n  $core.String get secUid => $_getSZ(27);\n  @$pb.TagNumber(46)\n  set secUid($core.String v) { $_setString(27, v); }\n  @$pb.TagNumber(46)\n  $core.bool hasSecUid() => $_has(27);\n  @$pb.TagNumber(46)\n  void clearSecUid() => clearField(46);\n\n  @$pb.TagNumber(1022)\n  $fixnum.Int64 get fanTicketCount => $_getI64(28);\n  @$pb.TagNumber(1022)\n  set fanTicketCount($fixnum.Int64 v) { $_setInt64(28, v); }\n  @$pb.TagNumber(1022)\n  $core.bool hasFanTicketCount() => $_has(28);\n  @$pb.TagNumber(1022)\n  void clearFanTicketCount() => clearField(1022);\n\n  @$pb.TagNumber(1028)\n  $core.String get idStr => $_getSZ(29);\n  @$pb.TagNumber(1028)\n  set idStr($core.String v) { $_setString(29, v); }\n  @$pb.TagNumber(1028)\n  $core.bool hasIdStr() => $_has(29);\n  @$pb.TagNumber(1028)\n  void clearIdStr() => clearField(1028);\n\n  @$pb.TagNumber(1045)\n  $core.int get ageRange => $_getIZ(30);\n  @$pb.TagNumber(1045)\n  set ageRange($core.int v) { $_setUnsignedInt32(30, v); }\n  @$pb.TagNumber(1045)\n  $core.bool hasAgeRange() => $_has(30);\n  @$pb.TagNumber(1045)\n  void clearAgeRange() => clearField(1045);\n}\n\nclass FollowInfo extends $pb.GeneratedMessage {\n  factory FollowInfo() => create();\n  FollowInfo._() : super();\n  factory FollowInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory FollowInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'FollowInfo', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'followingCount', $pb.PbFieldType.OU6, protoName: 'followingCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'followerCount', $pb.PbFieldType.OU6, protoName: 'followerCount', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'followStatus', $pb.PbFieldType.OU6, protoName: 'followStatus', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'pushStatus', $pb.PbFieldType.OU6, protoName: 'pushStatus', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(5, _omitFieldNames ? '' : 'remarkName', protoName: 'remarkName')\n    ..aOS(6, _omitFieldNames ? '' : 'followerCountStr', protoName: 'followerCountStr')\n    ..aOS(7, _omitFieldNames ? '' : 'followingCountStr', protoName: 'followingCountStr')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  FollowInfo clone() => FollowInfo()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  FollowInfo copyWith(void Function(FollowInfo) updates) => super.copyWith((message) => updates(message as FollowInfo)) as FollowInfo;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowInfo create() => FollowInfo._();\n  FollowInfo createEmptyInstance() => create();\n  static $pb.PbList<FollowInfo> createRepeated() => $pb.PbList<FollowInfo>();\n  @$core.pragma('dart2js:noInline')\n  static FollowInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FollowInfo>(create);\n  static FollowInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get followingCount => $_getI64(0);\n  @$pb.TagNumber(1)\n  set followingCount($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasFollowingCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFollowingCount() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get followerCount => $_getI64(1);\n  @$pb.TagNumber(2)\n  set followerCount($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasFollowerCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFollowerCount() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get followStatus => $_getI64(2);\n  @$pb.TagNumber(3)\n  set followStatus($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasFollowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFollowStatus() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get pushStatus => $_getI64(3);\n  @$pb.TagNumber(4)\n  set pushStatus($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasPushStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPushStatus() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get remarkName => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set remarkName($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasRemarkName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRemarkName() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get followerCountStr => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set followerCountStr($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasFollowerCountStr() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFollowerCountStr() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get followingCountStr => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set followingCountStr($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasFollowingCountStr() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollowingCountStr() => clearField(7);\n}\n\nclass Image extends $pb.GeneratedMessage {\n  factory Image() => create();\n  Image._() : super();\n  factory Image.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Image.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Image', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'urlListList', protoName: 'urlListList')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'height', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'width', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(5, _omitFieldNames ? '' : 'avgColor', protoName: 'avgColor')\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'imageType', $pb.PbFieldType.OU3, protoName: 'imageType')\n    ..aOS(7, _omitFieldNames ? '' : 'openWebUrl', protoName: 'openWebUrl')\n    ..aOM<ImageContent>(8, _omitFieldNames ? '' : 'content', subBuilder: ImageContent.create)\n    ..aOB(9, _omitFieldNames ? '' : 'isAnimated', protoName: 'isAnimated')\n    ..aOM<NinePatchSetting>(10, _omitFieldNames ? '' : 'FlexSettingList', protoName: 'FlexSettingList', subBuilder: NinePatchSetting.create)\n    ..aOM<NinePatchSetting>(11, _omitFieldNames ? '' : 'TextSettingList', protoName: 'TextSettingList', subBuilder: NinePatchSetting.create)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Image clone() => Image()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Image copyWith(void Function(Image) updates) => super.copyWith((message) => updates(message as Image)) as Image;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Image create() => Image._();\n  Image createEmptyInstance() => create();\n  static $pb.PbList<Image> createRepeated() => $pb.PbList<Image>();\n  @$core.pragma('dart2js:noInline')\n  static Image getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Image>(create);\n  static Image? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.List<$core.String> get urlListList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get height => $_getI64(2);\n  @$pb.TagNumber(3)\n  set height($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get width => $_getI64(3);\n  @$pb.TagNumber(4)\n  set width($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasWidth() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearWidth() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get avgColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set avgColor($core.String v) { $_setString(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasAvgColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAvgColor() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get imageType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set imageType($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasImageType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImageType() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get openWebUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set openWebUrl($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasOpenWebUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOpenWebUrl() => clearField(7);\n\n  @$pb.TagNumber(8)\n  ImageContent get content => $_getN(7);\n  @$pb.TagNumber(8)\n  set content(ImageContent v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasContent() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearContent() => clearField(8);\n  @$pb.TagNumber(8)\n  ImageContent ensureContent() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.bool get isAnimated => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isAnimated($core.bool v) { $_setBool(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasIsAnimated() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsAnimated() => clearField(9);\n\n  @$pb.TagNumber(10)\n  NinePatchSetting get flexSettingList => $_getN(9);\n  @$pb.TagNumber(10)\n  set flexSettingList(NinePatchSetting v) { setField(10, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasFlexSettingList() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFlexSettingList() => clearField(10);\n  @$pb.TagNumber(10)\n  NinePatchSetting ensureFlexSettingList() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  NinePatchSetting get textSettingList => $_getN(10);\n  @$pb.TagNumber(11)\n  set textSettingList(NinePatchSetting v) { setField(11, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasTextSettingList() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTextSettingList() => clearField(11);\n  @$pb.TagNumber(11)\n  NinePatchSetting ensureTextSettingList() => $_ensure(10);\n}\n\nclass NinePatchSetting extends $pb.GeneratedMessage {\n  factory NinePatchSetting() => create();\n  NinePatchSetting._() : super();\n  factory NinePatchSetting.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory NinePatchSetting.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'NinePatchSetting', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'settingListList', protoName: 'settingListList')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  NinePatchSetting clone() => NinePatchSetting()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  NinePatchSetting copyWith(void Function(NinePatchSetting) updates) => super.copyWith((message) => updates(message as NinePatchSetting)) as NinePatchSetting;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NinePatchSetting create() => NinePatchSetting._();\n  NinePatchSetting createEmptyInstance() => create();\n  static $pb.PbList<NinePatchSetting> createRepeated() => $pb.PbList<NinePatchSetting>();\n  @$core.pragma('dart2js:noInline')\n  static NinePatchSetting getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NinePatchSetting>(create);\n  static NinePatchSetting? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.List<$core.String> get settingListList => $_getList(0);\n}\n\nclass ImageContent extends $pb.GeneratedMessage {\n  factory ImageContent() => create();\n  ImageContent._() : super();\n  factory ImageContent.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ImageContent.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ImageContent', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'fontColor', protoName: 'fontColor')\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'level', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(4, _omitFieldNames ? '' : 'alternativeText', protoName: 'alternativeText')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ImageContent clone() => ImageContent()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ImageContent copyWith(void Function(ImageContent) updates) => super.copyWith((message) => updates(message as ImageContent)) as ImageContent;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageContent create() => ImageContent._();\n  ImageContent createEmptyInstance() => create();\n  static $pb.PbList<ImageContent> createRepeated() => $pb.PbList<ImageContent>();\n  @$core.pragma('dart2js:noInline')\n  static ImageContent getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ImageContent>(create);\n  static ImageContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get fontColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set fontColor($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasFontColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFontColor() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get level => $_getI64(2);\n  @$pb.TagNumber(3)\n  set level($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasLevel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLevel() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get alternativeText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set alternativeText($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasAlternativeText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAlternativeText() => clearField(4);\n}\n\nclass PushFrame extends $pb.GeneratedMessage {\n  factory PushFrame() => create();\n  PushFrame._() : super();\n  factory PushFrame.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory PushFrame.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PushFrame', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'seqId', $pb.PbFieldType.OU6, protoName: 'seqId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'logId', $pb.PbFieldType.OU6, protoName: 'logId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'service', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'method', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..pc<HeadersList>(5, _omitFieldNames ? '' : 'headersList', $pb.PbFieldType.PM, protoName: 'headersList', subBuilder: HeadersList.create)\n    ..aOS(6, _omitFieldNames ? '' : 'payloadEncoding', protoName: 'payloadEncoding')\n    ..aOS(7, _omitFieldNames ? '' : 'payloadType', protoName: 'payloadType')\n    ..a<$core.List<$core.int>>(8, _omitFieldNames ? '' : 'payload', $pb.PbFieldType.OY)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  PushFrame clone() => PushFrame()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  PushFrame copyWith(void Function(PushFrame) updates) => super.copyWith((message) => updates(message as PushFrame)) as PushFrame;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PushFrame create() => PushFrame._();\n  PushFrame createEmptyInstance() => create();\n  static $pb.PbList<PushFrame> createRepeated() => $pb.PbList<PushFrame>();\n  @$core.pragma('dart2js:noInline')\n  static PushFrame getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PushFrame>(create);\n  static PushFrame? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seqId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seqId($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasSeqId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeqId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get logId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set logId($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasLogId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLogId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get service => $_getI64(2);\n  @$pb.TagNumber(3)\n  set service($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasService() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearService() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get method => $_getI64(3);\n  @$pb.TagNumber(4)\n  set method($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasMethod() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMethod() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.List<HeadersList> get headersList => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get payloadEncoding => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set payloadEncoding($core.String v) { $_setString(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasPayloadEncoding() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPayloadEncoding() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get payloadType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set payloadType($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasPayloadType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPayloadType() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.List<$core.int> get payload => $_getN(7);\n  @$pb.TagNumber(8)\n  set payload($core.List<$core.int> v) { $_setBytes(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasPayload() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPayload() => clearField(8);\n}\n\nclass kk extends $pb.GeneratedMessage {\n  factory kk() => create();\n  kk._() : super();\n  factory kk.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory kk.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'kk', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$core.int>(14, _omitFieldNames ? '' : 'k', $pb.PbFieldType.OU3)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  kk clone() => kk()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  kk copyWith(void Function(kk) updates) => super.copyWith((message) => updates(message as kk)) as kk;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static kk create() => kk._();\n  kk createEmptyInstance() => create();\n  static $pb.PbList<kk> createRepeated() => $pb.PbList<kk>();\n  @$core.pragma('dart2js:noInline')\n  static kk getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<kk>(create);\n  static kk? _defaultInstance;\n\n  @$pb.TagNumber(14)\n  $core.int get k => $_getIZ(0);\n  @$pb.TagNumber(14)\n  set k($core.int v) { $_setUnsignedInt32(0, v); }\n  @$pb.TagNumber(14)\n  $core.bool hasK() => $_has(0);\n  @$pb.TagNumber(14)\n  void clearK() => clearField(14);\n}\n\nclass SendMessageBody extends $pb.GeneratedMessage {\n  factory SendMessageBody() => create();\n  SendMessageBody._() : super();\n  factory SendMessageBody.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory SendMessageBody.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SendMessageBody', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'conversationId', protoName: 'conversationId')\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'conversationType', $pb.PbFieldType.OU3, protoName: 'conversationType')\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'conversationShortId', $pb.PbFieldType.OU6, protoName: 'conversationShortId', defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(4, _omitFieldNames ? '' : 'content')\n    ..pc<ExtList>(5, _omitFieldNames ? '' : 'ext', $pb.PbFieldType.PM, subBuilder: ExtList.create)\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'messageType', $pb.PbFieldType.OU3, protoName: 'messageType')\n    ..aOS(7, _omitFieldNames ? '' : 'ticket')\n    ..aOS(8, _omitFieldNames ? '' : 'clientMessageId', protoName: 'clientMessageId')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  SendMessageBody clone() => SendMessageBody()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  SendMessageBody copyWith(void Function(SendMessageBody) updates) => super.copyWith((message) => updates(message as SendMessageBody)) as SendMessageBody;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SendMessageBody create() => SendMessageBody._();\n  SendMessageBody createEmptyInstance() => create();\n  static $pb.PbList<SendMessageBody> createRepeated() => $pb.PbList<SendMessageBody>();\n  @$core.pragma('dart2js:noInline')\n  static SendMessageBody getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SendMessageBody>(create);\n  static SendMessageBody? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get conversationId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set conversationId($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasConversationId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearConversationId() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get conversationType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set conversationType($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasConversationType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConversationType() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get conversationShortId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set conversationShortId($fixnum.Int64 v) { $_setInt64(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasConversationShortId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearConversationShortId() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get content => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set content($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearContent() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.List<ExtList> get ext => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.int get messageType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set messageType($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasMessageType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMessageType() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get ticket => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set ticket($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasTicket() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTicket() => clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get clientMessageId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set clientMessageId($core.String v) { $_setString(7, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasClientMessageId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearClientMessageId() => clearField(8);\n}\n\nclass ExtList extends $pb.GeneratedMessage {\n  factory ExtList() => create();\n  ExtList._() : super();\n  factory ExtList.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory ExtList.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ExtList', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  ExtList clone() => ExtList()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  ExtList copyWith(void Function(ExtList) updates) => super.copyWith((message) => updates(message as ExtList)) as ExtList;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtList create() => ExtList._();\n  ExtList createEmptyInstance() => create();\n  static $pb.PbList<ExtList> createRepeated() => $pb.PbList<ExtList>();\n  @$core.pragma('dart2js:noInline')\n  static ExtList getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ExtList>(create);\n  static ExtList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get value => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set value($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasValue() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValue() => clearField(2);\n}\n\nclass Rsp_F extends $pb.GeneratedMessage {\n  factory Rsp_F() => create();\n  Rsp_F._() : super();\n  factory Rsp_F.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Rsp_F.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Rsp.F', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'q1', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'q3', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..aOS(4, _omitFieldNames ? '' : 'q4')\n    ..a<$fixnum.Int64>(5, _omitFieldNames ? '' : 'q5', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Rsp_F clone() => Rsp_F()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Rsp_F copyWith(void Function(Rsp_F) updates) => super.copyWith((message) => updates(message as Rsp_F)) as Rsp_F;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rsp_F create() => Rsp_F._();\n  Rsp_F createEmptyInstance() => create();\n  static $pb.PbList<Rsp_F> createRepeated() => $pb.PbList<Rsp_F>();\n  @$core.pragma('dart2js:noInline')\n  static Rsp_F getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rsp_F>(create);\n  static Rsp_F? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get q1 => $_getI64(0);\n  @$pb.TagNumber(1)\n  set q1($fixnum.Int64 v) { $_setInt64(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasQ1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQ1() => clearField(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get q3 => $_getI64(1);\n  @$pb.TagNumber(3)\n  set q3($fixnum.Int64 v) { $_setInt64(1, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasQ3() => $_has(1);\n  @$pb.TagNumber(3)\n  void clearQ3() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get q4 => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set q4($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasQ4() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearQ4() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get q5 => $_getI64(3);\n  @$pb.TagNumber(5)\n  set q5($fixnum.Int64 v) { $_setInt64(3, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasQ5() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearQ5() => clearField(5);\n}\n\nclass Rsp extends $pb.GeneratedMessage {\n  factory Rsp() => create();\n  Rsp._() : super();\n  factory Rsp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory Rsp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Rsp', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$core.int>(1, _omitFieldNames ? '' : 'a', $pb.PbFieldType.O3)\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'b', $pb.PbFieldType.O3)\n    ..a<$core.int>(3, _omitFieldNames ? '' : 'c', $pb.PbFieldType.O3)\n    ..aOS(4, _omitFieldNames ? '' : 'd')\n    ..a<$core.int>(5, _omitFieldNames ? '' : 'e', $pb.PbFieldType.O3)\n    ..aOM<Rsp_F>(6, _omitFieldNames ? '' : 'f', subBuilder: Rsp_F.create)\n    ..aOS(7, _omitFieldNames ? '' : 'g')\n    ..a<$fixnum.Int64>(10, _omitFieldNames ? '' : 'h', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(11, _omitFieldNames ? '' : 'i', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..a<$fixnum.Int64>(13, _omitFieldNames ? '' : 'j', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  Rsp clone() => Rsp()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  Rsp copyWith(void Function(Rsp) updates) => super.copyWith((message) => updates(message as Rsp)) as Rsp;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rsp create() => Rsp._();\n  Rsp createEmptyInstance() => create();\n  static $pb.PbList<Rsp> createRepeated() => $pb.PbList<Rsp>();\n  @$core.pragma('dart2js:noInline')\n  static Rsp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rsp>(create);\n  static Rsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get a => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set a($core.int v) { $_setSignedInt32(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasA() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearA() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get b => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set b($core.int v) { $_setSignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasB() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearB() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get c => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set c($core.int v) { $_setSignedInt32(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasC() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearC() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get d => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set d($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasD() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearD() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get e => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set e($core.int v) { $_setSignedInt32(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasE() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearE() => clearField(5);\n\n  @$pb.TagNumber(6)\n  Rsp_F get f => $_getN(5);\n  @$pb.TagNumber(6)\n  set f(Rsp_F v) { setField(6, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasF() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearF() => clearField(6);\n  @$pb.TagNumber(6)\n  Rsp_F ensureF() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get g => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set g($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasG() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearG() => clearField(7);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get h => $_getI64(7);\n  @$pb.TagNumber(10)\n  set h($fixnum.Int64 v) { $_setInt64(7, v); }\n  @$pb.TagNumber(10)\n  $core.bool hasH() => $_has(7);\n  @$pb.TagNumber(10)\n  void clearH() => clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get i => $_getI64(8);\n  @$pb.TagNumber(11)\n  set i($fixnum.Int64 v) { $_setInt64(8, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasI() => $_has(8);\n  @$pb.TagNumber(11)\n  void clearI() => clearField(11);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get j => $_getI64(9);\n  @$pb.TagNumber(13)\n  set j($fixnum.Int64 v) { $_setInt64(9, v); }\n  @$pb.TagNumber(13)\n  $core.bool hasJ() => $_has(9);\n  @$pb.TagNumber(13)\n  void clearJ() => clearField(13);\n}\n\nclass PreMessage extends $pb.GeneratedMessage {\n  factory PreMessage() => create();\n  PreMessage._() : super();\n  factory PreMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory PreMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PreMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..a<$core.int>(1, _omitFieldNames ? '' : 'cmd', $pb.PbFieldType.OU3)\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'sequenceId', $pb.PbFieldType.OU3, protoName: 'sequenceId')\n    ..aOS(3, _omitFieldNames ? '' : 'sdkVersion', protoName: 'sdkVersion')\n    ..aOS(4, _omitFieldNames ? '' : 'token')\n    ..a<$core.int>(5, _omitFieldNames ? '' : 'refer', $pb.PbFieldType.OU3)\n    ..a<$core.int>(6, _omitFieldNames ? '' : 'inboxType', $pb.PbFieldType.OU3, protoName: 'inboxType')\n    ..aOS(7, _omitFieldNames ? '' : 'buildNumber', protoName: 'buildNumber')\n    ..aOM<SendMessageBody>(8, _omitFieldNames ? '' : 'sendMessageBody', protoName: 'sendMessageBody', subBuilder: SendMessageBody.create)\n    ..aOS(9, _omitFieldNames ? '' : 'aa')\n    ..aOS(11, _omitFieldNames ? '' : 'devicePlatform', protoName: 'devicePlatform')\n    ..pc<HeadersList>(15, _omitFieldNames ? '' : 'headers', $pb.PbFieldType.PM, subBuilder: HeadersList.create)\n    ..a<$core.int>(18, _omitFieldNames ? '' : 'authType', $pb.PbFieldType.OU3, protoName: 'authType')\n    ..aOS(21, _omitFieldNames ? '' : 'biz')\n    ..aOS(22, _omitFieldNames ? '' : 'access')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  PreMessage clone() => PreMessage()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  PreMessage copyWith(void Function(PreMessage) updates) => super.copyWith((message) => updates(message as PreMessage)) as PreMessage;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PreMessage create() => PreMessage._();\n  PreMessage createEmptyInstance() => create();\n  static $pb.PbList<PreMessage> createRepeated() => $pb.PbList<PreMessage>();\n  @$core.pragma('dart2js:noInline')\n  static PreMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PreMessage>(create);\n  static PreMessage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get cmd => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set cmd($core.int v) { $_setUnsignedInt32(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasCmd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCmd() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sequenceId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sequenceId($core.int v) { $_setUnsignedInt32(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasSequenceId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSequenceId() => clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sdkVersion => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sdkVersion($core.String v) { $_setString(2, v); }\n  @$pb.TagNumber(3)\n  $core.bool hasSdkVersion() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSdkVersion() => clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get token => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set token($core.String v) { $_setString(3, v); }\n  @$pb.TagNumber(4)\n  $core.bool hasToken() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearToken() => clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get refer => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set refer($core.int v) { $_setUnsignedInt32(4, v); }\n  @$pb.TagNumber(5)\n  $core.bool hasRefer() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRefer() => clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get inboxType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set inboxType($core.int v) { $_setUnsignedInt32(5, v); }\n  @$pb.TagNumber(6)\n  $core.bool hasInboxType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearInboxType() => clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get buildNumber => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set buildNumber($core.String v) { $_setString(6, v); }\n  @$pb.TagNumber(7)\n  $core.bool hasBuildNumber() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBuildNumber() => clearField(7);\n\n  @$pb.TagNumber(8)\n  SendMessageBody get sendMessageBody => $_getN(7);\n  @$pb.TagNumber(8)\n  set sendMessageBody(SendMessageBody v) { setField(8, v); }\n  @$pb.TagNumber(8)\n  $core.bool hasSendMessageBody() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSendMessageBody() => clearField(8);\n  @$pb.TagNumber(8)\n  SendMessageBody ensureSendMessageBody() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get aa => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set aa($core.String v) { $_setString(8, v); }\n  @$pb.TagNumber(9)\n  $core.bool hasAa() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAa() => clearField(9);\n\n  @$pb.TagNumber(11)\n  $core.String get devicePlatform => $_getSZ(9);\n  @$pb.TagNumber(11)\n  set devicePlatform($core.String v) { $_setString(9, v); }\n  @$pb.TagNumber(11)\n  $core.bool hasDevicePlatform() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearDevicePlatform() => clearField(11);\n\n  @$pb.TagNumber(15)\n  $core.List<HeadersList> get headers => $_getList(10);\n\n  @$pb.TagNumber(18)\n  $core.int get authType => $_getIZ(11);\n  @$pb.TagNumber(18)\n  set authType($core.int v) { $_setUnsignedInt32(11, v); }\n  @$pb.TagNumber(18)\n  $core.bool hasAuthType() => $_has(11);\n  @$pb.TagNumber(18)\n  void clearAuthType() => clearField(18);\n\n  @$pb.TagNumber(21)\n  $core.String get biz => $_getSZ(12);\n  @$pb.TagNumber(21)\n  set biz($core.String v) { $_setString(12, v); }\n  @$pb.TagNumber(21)\n  $core.bool hasBiz() => $_has(12);\n  @$pb.TagNumber(21)\n  void clearBiz() => clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.String get access => $_getSZ(13);\n  @$pb.TagNumber(22)\n  set access($core.String v) { $_setString(13, v); }\n  @$pb.TagNumber(22)\n  $core.bool hasAccess() => $_has(13);\n  @$pb.TagNumber(22)\n  void clearAccess() => clearField(22);\n}\n\nclass HeadersList extends $pb.GeneratedMessage {\n  factory HeadersList() => create();\n  HeadersList._() : super();\n  factory HeadersList.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);\n  factory HeadersList.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'HeadersList', package: const $pb.PackageName(_omitMessageNames ? '' : 'douyin'), createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false\n  ;\n\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '\n  'Will be removed in next major version')\n  HeadersList clone() => HeadersList()..mergeFromMessage(this);\n  @$core.Deprecated(\n  'Using this can add significant overhead to your binary. '\n  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '\n  'Will be removed in next major version')\n  HeadersList copyWith(void Function(HeadersList) updates) => super.copyWith((message) => updates(message as HeadersList)) as HeadersList;\n\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HeadersList create() => HeadersList._();\n  HeadersList createEmptyInstance() => create();\n  static $pb.PbList<HeadersList> createRepeated() => $pb.PbList<HeadersList>();\n  @$core.pragma('dart2js:noInline')\n  static HeadersList getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HeadersList>(create);\n  static HeadersList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String v) { $_setString(0, v); }\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get value => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set value($core.String v) { $_setString(1, v); }\n  @$pb.TagNumber(2)\n  $core.bool hasValue() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValue() => clearField(2);\n}\n\n\nconst _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/proto/douyin.pbenum.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: douyin.proto\n//\n// @dart = 2.12\n\n// ignore_for_file: annotate_overrides, camel_case_types\n// ignore_for_file: constant_identifier_names, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_final_fields\n// ignore_for_file: unnecessary_import, unnecessary_this, unused_import\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass CommentTypeTag extends $pb.ProtobufEnum {\n  static const CommentTypeTag COMMENTTYPETAGUNKNOWN = CommentTypeTag._(0, _omitEnumNames ? '' : 'COMMENTTYPETAGUNKNOWN');\n  static const CommentTypeTag COMMENTTYPETAGSTAR = CommentTypeTag._(1, _omitEnumNames ? '' : 'COMMENTTYPETAGSTAR');\n\n  static const $core.List<CommentTypeTag> values = <CommentTypeTag> [\n    COMMENTTYPETAGUNKNOWN,\n    COMMENTTYPETAGSTAR,\n  ];\n\n  static final $core.Map<$core.int, CommentTypeTag> _byValue = $pb.ProtobufEnum.initByValue(values);\n  static CommentTypeTag? valueOf($core.int value) => _byValue[value];\n\n  const CommentTypeTag._($core.int v, $core.String n) : super(v, n);\n}\n\n\nconst _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/proto/douyin.pbjson.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: douyin.proto\n//\n// @dart = 2.12\n\n// ignore_for_file: annotate_overrides, camel_case_types\n// ignore_for_file: constant_identifier_names, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_final_fields\n// ignore_for_file: unnecessary_import, unnecessary_this, unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use commentTypeTagDescriptor instead')\nconst CommentTypeTag$json = {\n  '1': 'CommentTypeTag',\n  '2': [\n    {'1': 'COMMENTTYPETAGUNKNOWN', '2': 0},\n    {'1': 'COMMENTTYPETAGSTAR', '2': 1},\n  ],\n};\n\n/// Descriptor for `CommentTypeTag`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List commentTypeTagDescriptor = $convert.base64Decode(\n    'Cg5Db21tZW50VHlwZVRhZxIZChVDT01NRU5UVFlQRVRBR1VOS05PV04QABIWChJDT01NRU5UVF'\n    'lQRVRBR1NUQVIQAQ==');\n\n@$core.Deprecated('Use responseDescriptor instead')\nconst Response$json = {\n  '1': 'Response',\n  '2': [\n    {'1': 'messagesList', '3': 1, '4': 3, '5': 11, '6': '.douyin.Message', '10': 'messagesList'},\n    {'1': 'cursor', '3': 2, '4': 1, '5': 9, '10': 'cursor'},\n    {'1': 'fetchInterval', '3': 3, '4': 1, '5': 4, '10': 'fetchInterval'},\n    {'1': 'now', '3': 4, '4': 1, '5': 4, '10': 'now'},\n    {'1': 'internalExt', '3': 5, '4': 1, '5': 9, '10': 'internalExt'},\n    {'1': 'fetchType', '3': 6, '4': 1, '5': 13, '10': 'fetchType'},\n    {'1': 'routeParams', '3': 7, '4': 3, '5': 11, '6': '.douyin.Response.RouteParamsEntry', '10': 'routeParams'},\n    {'1': 'heartbeatDuration', '3': 8, '4': 1, '5': 4, '10': 'heartbeatDuration'},\n    {'1': 'needAck', '3': 9, '4': 1, '5': 8, '10': 'needAck'},\n    {'1': 'pushServer', '3': 10, '4': 1, '5': 9, '10': 'pushServer'},\n    {'1': 'liveCursor', '3': 11, '4': 1, '5': 9, '10': 'liveCursor'},\n    {'1': 'historyNoMore', '3': 12, '4': 1, '5': 8, '10': 'historyNoMore'},\n  ],\n  '3': [Response_RouteParamsEntry$json],\n};\n\n@$core.Deprecated('Use responseDescriptor instead')\nconst Response_RouteParamsEntry$json = {\n  '1': 'RouteParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Response`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseDescriptor = $convert.base64Decode(\n    'CghSZXNwb25zZRIzCgxtZXNzYWdlc0xpc3QYASADKAsyDy5kb3V5aW4uTWVzc2FnZVIMbWVzc2'\n    'FnZXNMaXN0EhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEiQKDWZldGNoSW50ZXJ2YWwYAyABKARS'\n    'DWZldGNoSW50ZXJ2YWwSEAoDbm93GAQgASgEUgNub3cSIAoLaW50ZXJuYWxFeHQYBSABKAlSC2'\n    'ludGVybmFsRXh0EhwKCWZldGNoVHlwZRgGIAEoDVIJZmV0Y2hUeXBlEkMKC3JvdXRlUGFyYW1z'\n    'GAcgAygLMiEuZG91eWluLlJlc3BvbnNlLlJvdXRlUGFyYW1zRW50cnlSC3JvdXRlUGFyYW1zEi'\n    'wKEWhlYXJ0YmVhdER1cmF0aW9uGAggASgEUhFoZWFydGJlYXREdXJhdGlvbhIYCgduZWVkQWNr'\n    'GAkgASgIUgduZWVkQWNrEh4KCnB1c2hTZXJ2ZXIYCiABKAlSCnB1c2hTZXJ2ZXISHgoKbGl2ZU'\n    'N1cnNvchgLIAEoCVIKbGl2ZUN1cnNvchIkCg1oaXN0b3J5Tm9Nb3JlGAwgASgIUg1oaXN0b3J5'\n    'Tm9Nb3JlGj4KEFJvdXRlUGFyYW1zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAi'\n    'ABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use messageDescriptor instead')\nconst Message$json = {\n  '1': 'Message',\n  '2': [\n    {'1': 'method', '3': 1, '4': 1, '5': 9, '10': 'method'},\n    {'1': 'payload', '3': 2, '4': 1, '5': 12, '10': 'payload'},\n    {'1': 'msgId', '3': 3, '4': 1, '5': 3, '10': 'msgId'},\n    {'1': 'msgType', '3': 4, '4': 1, '5': 5, '10': 'msgType'},\n    {'1': 'offset', '3': 5, '4': 1, '5': 3, '10': 'offset'},\n    {'1': 'needWrdsStore', '3': 6, '4': 1, '5': 8, '10': 'needWrdsStore'},\n    {'1': 'wrdsVersion', '3': 7, '4': 1, '5': 3, '10': 'wrdsVersion'},\n    {'1': 'wrdsSubKey', '3': 8, '4': 1, '5': 9, '10': 'wrdsSubKey'},\n  ],\n};\n\n/// Descriptor for `Message`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List messageDescriptor = $convert.base64Decode(\n    'CgdNZXNzYWdlEhYKBm1ldGhvZBgBIAEoCVIGbWV0aG9kEhgKB3BheWxvYWQYAiABKAxSB3BheW'\n    'xvYWQSFAoFbXNnSWQYAyABKANSBW1zZ0lkEhgKB21zZ1R5cGUYBCABKAVSB21zZ1R5cGUSFgoG'\n    'b2Zmc2V0GAUgASgDUgZvZmZzZXQSJAoNbmVlZFdyZHNTdG9yZRgGIAEoCFINbmVlZFdyZHNTdG'\n    '9yZRIgCgt3cmRzVmVyc2lvbhgHIAEoA1ILd3Jkc1ZlcnNpb24SHgoKd3Jkc1N1YktleRgIIAEo'\n    'CVIKd3Jkc1N1YktleQ==');\n\n@$core.Deprecated('Use chatMessageDescriptor instead')\nconst ChatMessage$json = {\n  '1': 'ChatMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'content', '3': 3, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'visibleToSender', '3': 4, '4': 1, '5': 8, '10': 'visibleToSender'},\n    {'1': 'backgroundImage', '3': 5, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'backgroundImage'},\n    {'1': 'fullScreenTextColor', '3': 6, '4': 1, '5': 9, '10': 'fullScreenTextColor'},\n    {'1': 'backgroundImageV2', '3': 7, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'backgroundImageV2'},\n    {'1': 'publicAreaCommon', '3': 8, '4': 1, '5': 11, '6': '.douyin.PublicAreaCommon', '10': 'publicAreaCommon'},\n    {'1': 'giftImage', '3': 9, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'giftImage'},\n    {'1': 'agreeMsgId', '3': 11, '4': 1, '5': 4, '10': 'agreeMsgId'},\n    {'1': 'priorityLevel', '3': 12, '4': 1, '5': 13, '10': 'priorityLevel'},\n    {'1': 'landscapeAreaCommon', '3': 13, '4': 1, '5': 11, '6': '.douyin.LandscapeAreaCommon', '10': 'landscapeAreaCommon'},\n    {'1': 'eventTime', '3': 15, '4': 1, '5': 4, '10': 'eventTime'},\n    {'1': 'sendReview', '3': 16, '4': 1, '5': 8, '10': 'sendReview'},\n    {'1': 'fromIntercom', '3': 17, '4': 1, '5': 8, '10': 'fromIntercom'},\n    {'1': 'intercomHideUserCard', '3': 18, '4': 1, '5': 8, '10': 'intercomHideUserCard'},\n    {'1': 'chatBy', '3': 20, '4': 1, '5': 9, '10': 'chatBy'},\n    {'1': 'individualChatPriority', '3': 21, '4': 1, '5': 13, '10': 'individualChatPriority'},\n    {'1': 'rtfContent', '3': 22, '4': 1, '5': 11, '6': '.douyin.Text', '10': 'rtfContent'},\n  ],\n};\n\n/// Descriptor for `ChatMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chatMessageDescriptor = $convert.base64Decode(\n    'CgtDaGF0TWVzc2FnZRImCgZjb21tb24YASABKAsyDi5kb3V5aW4uQ29tbW9uUgZjb21tb24SIA'\n    'oEdXNlchgCIAEoCzIMLmRvdXlpbi5Vc2VyUgR1c2VyEhgKB2NvbnRlbnQYAyABKAlSB2NvbnRl'\n    'bnQSKAoPdmlzaWJsZVRvU2VuZGVyGAQgASgIUg92aXNpYmxlVG9TZW5kZXISNwoPYmFja2dyb3'\n    'VuZEltYWdlGAUgASgLMg0uZG91eWluLkltYWdlUg9iYWNrZ3JvdW5kSW1hZ2USMAoTZnVsbFNj'\n    'cmVlblRleHRDb2xvchgGIAEoCVITZnVsbFNjcmVlblRleHRDb2xvchI7ChFiYWNrZ3JvdW5kSW'\n    '1hZ2VWMhgHIAEoCzINLmRvdXlpbi5JbWFnZVIRYmFja2dyb3VuZEltYWdlVjISRAoQcHVibGlj'\n    'QXJlYUNvbW1vbhgIIAEoCzIYLmRvdXlpbi5QdWJsaWNBcmVhQ29tbW9uUhBwdWJsaWNBcmVhQ2'\n    '9tbW9uEisKCWdpZnRJbWFnZRgJIAEoCzINLmRvdXlpbi5JbWFnZVIJZ2lmdEltYWdlEh4KCmFn'\n    'cmVlTXNnSWQYCyABKARSCmFncmVlTXNnSWQSJAoNcHJpb3JpdHlMZXZlbBgMIAEoDVINcHJpb3'\n    'JpdHlMZXZlbBJNChNsYW5kc2NhcGVBcmVhQ29tbW9uGA0gASgLMhsuZG91eWluLkxhbmRzY2Fw'\n    'ZUFyZWFDb21tb25SE2xhbmRzY2FwZUFyZWFDb21tb24SHAoJZXZlbnRUaW1lGA8gASgEUglldm'\n    'VudFRpbWUSHgoKc2VuZFJldmlldxgQIAEoCFIKc2VuZFJldmlldxIiCgxmcm9tSW50ZXJjb20Y'\n    'ESABKAhSDGZyb21JbnRlcmNvbRIyChRpbnRlcmNvbUhpZGVVc2VyQ2FyZBgSIAEoCFIUaW50ZX'\n    'Jjb21IaWRlVXNlckNhcmQSFgoGY2hhdEJ5GBQgASgJUgZjaGF0QnkSNgoWaW5kaXZpZHVhbENo'\n    'YXRQcmlvcml0eRgVIAEoDVIWaW5kaXZpZHVhbENoYXRQcmlvcml0eRIsCgpydGZDb250ZW50GB'\n    'YgASgLMgwuZG91eWluLlRleHRSCnJ0ZkNvbnRlbnQ=');\n\n@$core.Deprecated('Use landscapeAreaCommonDescriptor instead')\nconst LandscapeAreaCommon$json = {\n  '1': 'LandscapeAreaCommon',\n  '2': [\n    {'1': 'showHead', '3': 1, '4': 1, '5': 8, '10': 'showHead'},\n    {'1': 'showNickname', '3': 2, '4': 1, '5': 8, '10': 'showNickname'},\n    {'1': 'showFontColor', '3': 3, '4': 1, '5': 8, '10': 'showFontColor'},\n    {'1': 'colorValueList', '3': 4, '4': 3, '5': 9, '10': 'colorValueList'},\n    {'1': 'commentTypeTagsList', '3': 5, '4': 3, '5': 14, '6': '.douyin.CommentTypeTag', '10': 'commentTypeTagsList'},\n  ],\n};\n\n/// Descriptor for `LandscapeAreaCommon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List landscapeAreaCommonDescriptor = $convert.base64Decode(\n    'ChNMYW5kc2NhcGVBcmVhQ29tbW9uEhoKCHNob3dIZWFkGAEgASgIUghzaG93SGVhZBIiCgxzaG'\n    '93Tmlja25hbWUYAiABKAhSDHNob3dOaWNrbmFtZRIkCg1zaG93Rm9udENvbG9yGAMgASgIUg1z'\n    'aG93Rm9udENvbG9yEiYKDmNvbG9yVmFsdWVMaXN0GAQgAygJUg5jb2xvclZhbHVlTGlzdBJICh'\n    'Njb21tZW50VHlwZVRhZ3NMaXN0GAUgAygOMhYuZG91eWluLkNvbW1lbnRUeXBlVGFnUhNjb21t'\n    'ZW50VHlwZVRhZ3NMaXN0');\n\n@$core.Deprecated('Use roomUserSeqMessageDescriptor instead')\nconst RoomUserSeqMessage$json = {\n  '1': 'RoomUserSeqMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'ranksList', '3': 2, '4': 3, '5': 11, '6': '.douyin.RoomUserSeqMessageContributor', '10': 'ranksList'},\n    {'1': 'total', '3': 3, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'popStr', '3': 4, '4': 1, '5': 9, '10': 'popStr'},\n    {'1': 'seatsList', '3': 5, '4': 3, '5': 11, '6': '.douyin.RoomUserSeqMessageContributor', '10': 'seatsList'},\n    {'1': 'popularity', '3': 6, '4': 1, '5': 3, '10': 'popularity'},\n    {'1': 'totalUser', '3': 7, '4': 1, '5': 3, '10': 'totalUser'},\n    {'1': 'totalUserStr', '3': 8, '4': 1, '5': 9, '10': 'totalUserStr'},\n    {'1': 'totalStr', '3': 9, '4': 1, '5': 9, '10': 'totalStr'},\n    {'1': 'onlineUserForAnchor', '3': 10, '4': 1, '5': 9, '10': 'onlineUserForAnchor'},\n    {'1': 'totalPvForAnchor', '3': 11, '4': 1, '5': 9, '10': 'totalPvForAnchor'},\n    {'1': 'upRightStatsStr', '3': 12, '4': 1, '5': 9, '10': 'upRightStatsStr'},\n    {'1': 'upRightStatsStrComplete', '3': 13, '4': 1, '5': 9, '10': 'upRightStatsStrComplete'},\n  ],\n};\n\n/// Descriptor for `RoomUserSeqMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List roomUserSeqMessageDescriptor = $convert.base64Decode(\n    'ChJSb29tVXNlclNlcU1lc3NhZ2USJgoGY29tbW9uGAEgASgLMg4uZG91eWluLkNvbW1vblIGY2'\n    '9tbW9uEkMKCXJhbmtzTGlzdBgCIAMoCzIlLmRvdXlpbi5Sb29tVXNlclNlcU1lc3NhZ2VDb250'\n    'cmlidXRvclIJcmFua3NMaXN0EhQKBXRvdGFsGAMgASgDUgV0b3RhbBIWCgZwb3BTdHIYBCABKA'\n    'lSBnBvcFN0chJDCglzZWF0c0xpc3QYBSADKAsyJS5kb3V5aW4uUm9vbVVzZXJTZXFNZXNzYWdl'\n    'Q29udHJpYnV0b3JSCXNlYXRzTGlzdBIeCgpwb3B1bGFyaXR5GAYgASgDUgpwb3B1bGFyaXR5Eh'\n    'wKCXRvdGFsVXNlchgHIAEoA1IJdG90YWxVc2VyEiIKDHRvdGFsVXNlclN0chgIIAEoCVIMdG90'\n    'YWxVc2VyU3RyEhoKCHRvdGFsU3RyGAkgASgJUgh0b3RhbFN0chIwChNvbmxpbmVVc2VyRm9yQW'\n    '5jaG9yGAogASgJUhNvbmxpbmVVc2VyRm9yQW5jaG9yEioKEHRvdGFsUHZGb3JBbmNob3IYCyAB'\n    'KAlSEHRvdGFsUHZGb3JBbmNob3ISKAoPdXBSaWdodFN0YXRzU3RyGAwgASgJUg91cFJpZ2h0U3'\n    'RhdHNTdHISOAoXdXBSaWdodFN0YXRzU3RyQ29tcGxldGUYDSABKAlSF3VwUmlnaHRTdGF0c1N0'\n    'ckNvbXBsZXRl');\n\n@$core.Deprecated('Use commonTextMessageDescriptor instead')\nconst CommonTextMessage$json = {\n  '1': 'CommonTextMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'scene', '3': 3, '4': 1, '5': 9, '10': 'scene'},\n  ],\n};\n\n/// Descriptor for `CommonTextMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commonTextMessageDescriptor = $convert.base64Decode(\n    'ChFDb21tb25UZXh0TWVzc2FnZRImCgZjb21tb24YASABKAsyDi5kb3V5aW4uQ29tbW9uUgZjb2'\n    '1tb24SIAoEdXNlchgCIAEoCzIMLmRvdXlpbi5Vc2VyUgR1c2VyEhQKBXNjZW5lGAMgASgJUgVz'\n    'Y2VuZQ==');\n\n@$core.Deprecated('Use updateFanTicketMessageDescriptor instead')\nconst UpdateFanTicketMessage$json = {\n  '1': 'UpdateFanTicketMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'roomFanTicketCountText', '3': 2, '4': 1, '5': 9, '10': 'roomFanTicketCountText'},\n    {'1': 'roomFanTicketCount', '3': 3, '4': 1, '5': 4, '10': 'roomFanTicketCount'},\n    {'1': 'forceUpdate', '3': 4, '4': 1, '5': 8, '10': 'forceUpdate'},\n  ],\n};\n\n/// Descriptor for `UpdateFanTicketMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateFanTicketMessageDescriptor = $convert.base64Decode(\n    'ChZVcGRhdGVGYW5UaWNrZXRNZXNzYWdlEiYKBmNvbW1vbhgBIAEoCzIOLmRvdXlpbi5Db21tb2'\n    '5SBmNvbW1vbhI2ChZyb29tRmFuVGlja2V0Q291bnRUZXh0GAIgASgJUhZyb29tRmFuVGlja2V0'\n    'Q291bnRUZXh0Ei4KEnJvb21GYW5UaWNrZXRDb3VudBgDIAEoBFIScm9vbUZhblRpY2tldENvdW'\n    '50EiAKC2ZvcmNlVXBkYXRlGAQgASgIUgtmb3JjZVVwZGF0ZQ==');\n\n@$core.Deprecated('Use roomUserSeqMessageContributorDescriptor instead')\nconst RoomUserSeqMessageContributor$json = {\n  '1': 'RoomUserSeqMessageContributor',\n  '2': [\n    {'1': 'score', '3': 1, '4': 1, '5': 4, '10': 'score'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'rank', '3': 3, '4': 1, '5': 4, '10': 'rank'},\n    {'1': 'delta', '3': 4, '4': 1, '5': 4, '10': 'delta'},\n    {'1': 'isHidden', '3': 5, '4': 1, '5': 8, '10': 'isHidden'},\n    {'1': 'scoreDescription', '3': 6, '4': 1, '5': 9, '10': 'scoreDescription'},\n    {'1': 'exactlyScore', '3': 7, '4': 1, '5': 9, '10': 'exactlyScore'},\n  ],\n};\n\n/// Descriptor for `RoomUserSeqMessageContributor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List roomUserSeqMessageContributorDescriptor = $convert.base64Decode(\n    'Ch1Sb29tVXNlclNlcU1lc3NhZ2VDb250cmlidXRvchIUCgVzY29yZRgBIAEoBFIFc2NvcmUSIA'\n    'oEdXNlchgCIAEoCzIMLmRvdXlpbi5Vc2VyUgR1c2VyEhIKBHJhbmsYAyABKARSBHJhbmsSFAoF'\n    'ZGVsdGEYBCABKARSBWRlbHRhEhoKCGlzSGlkZGVuGAUgASgIUghpc0hpZGRlbhIqChBzY29yZU'\n    'Rlc2NyaXB0aW9uGAYgASgJUhBzY29yZURlc2NyaXB0aW9uEiIKDGV4YWN0bHlTY29yZRgHIAEo'\n    'CVIMZXhhY3RseVNjb3Jl');\n\n@$core.Deprecated('Use giftMessageDescriptor instead')\nconst GiftMessage$json = {\n  '1': 'GiftMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'giftId', '3': 2, '4': 1, '5': 4, '10': 'giftId'},\n    {'1': 'fanTicketCount', '3': 3, '4': 1, '5': 4, '10': 'fanTicketCount'},\n    {'1': 'groupCount', '3': 4, '4': 1, '5': 4, '10': 'groupCount'},\n    {'1': 'repeatCount', '3': 5, '4': 1, '5': 4, '10': 'repeatCount'},\n    {'1': 'comboCount', '3': 6, '4': 1, '5': 4, '10': 'comboCount'},\n    {'1': 'user', '3': 7, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'toUser', '3': 8, '4': 1, '5': 11, '6': '.douyin.User', '10': 'toUser'},\n    {'1': 'repeatEnd', '3': 9, '4': 1, '5': 13, '10': 'repeatEnd'},\n    {'1': 'textEffect', '3': 10, '4': 1, '5': 11, '6': '.douyin.TextEffect', '10': 'textEffect'},\n    {'1': 'groupId', '3': 11, '4': 1, '5': 4, '10': 'groupId'},\n    {'1': 'incomeTaskgifts', '3': 12, '4': 1, '5': 4, '10': 'incomeTaskgifts'},\n    {'1': 'roomFanTicketCount', '3': 13, '4': 1, '5': 4, '10': 'roomFanTicketCount'},\n    {'1': 'priority', '3': 14, '4': 1, '5': 11, '6': '.douyin.GiftIMPriority', '10': 'priority'},\n    {'1': 'gift', '3': 15, '4': 1, '5': 11, '6': '.douyin.GiftStruct', '10': 'gift'},\n    {'1': 'logId', '3': 16, '4': 1, '5': 9, '10': 'logId'},\n    {'1': 'sendType', '3': 17, '4': 1, '5': 4, '10': 'sendType'},\n    {'1': 'publicAreaCommon', '3': 18, '4': 1, '5': 11, '6': '.douyin.PublicAreaCommon', '10': 'publicAreaCommon'},\n    {'1': 'trayDisplayText', '3': 19, '4': 1, '5': 11, '6': '.douyin.Text', '10': 'trayDisplayText'},\n    {'1': 'bannedDisplayEffects', '3': 20, '4': 1, '5': 4, '10': 'bannedDisplayEffects'},\n    {'1': 'displayForSelf', '3': 25, '4': 1, '5': 8, '10': 'displayForSelf'},\n    {'1': 'interactGiftInfo', '3': 26, '4': 1, '5': 9, '10': 'interactGiftInfo'},\n    {'1': 'diyItemInfo', '3': 27, '4': 1, '5': 9, '10': 'diyItemInfo'},\n    {'1': 'minAssetSetList', '3': 28, '4': 3, '5': 4, '10': 'minAssetSetList'},\n    {'1': 'totalCount', '3': 29, '4': 1, '5': 4, '10': 'totalCount'},\n    {'1': 'clientGiftSource', '3': 30, '4': 1, '5': 13, '10': 'clientGiftSource'},\n    {'1': 'toUserIdsList', '3': 32, '4': 3, '5': 4, '10': 'toUserIdsList'},\n    {'1': 'sendTime', '3': 33, '4': 1, '5': 4, '10': 'sendTime'},\n    {'1': 'forceDisplayEffects', '3': 34, '4': 1, '5': 4, '10': 'forceDisplayEffects'},\n    {'1': 'traceId', '3': 35, '4': 1, '5': 9, '10': 'traceId'},\n    {'1': 'effectDisplayTs', '3': 36, '4': 1, '5': 4, '10': 'effectDisplayTs'},\n  ],\n};\n\n/// Descriptor for `GiftMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List giftMessageDescriptor = $convert.base64Decode(\n    'CgtHaWZ0TWVzc2FnZRImCgZjb21tb24YASABKAsyDi5kb3V5aW4uQ29tbW9uUgZjb21tb24SFg'\n    'oGZ2lmdElkGAIgASgEUgZnaWZ0SWQSJgoOZmFuVGlja2V0Q291bnQYAyABKARSDmZhblRpY2tl'\n    'dENvdW50Eh4KCmdyb3VwQ291bnQYBCABKARSCmdyb3VwQ291bnQSIAoLcmVwZWF0Q291bnQYBS'\n    'ABKARSC3JlcGVhdENvdW50Eh4KCmNvbWJvQ291bnQYBiABKARSCmNvbWJvQ291bnQSIAoEdXNl'\n    'chgHIAEoCzIMLmRvdXlpbi5Vc2VyUgR1c2VyEiQKBnRvVXNlchgIIAEoCzIMLmRvdXlpbi5Vc2'\n    'VyUgZ0b1VzZXISHAoJcmVwZWF0RW5kGAkgASgNUglyZXBlYXRFbmQSMgoKdGV4dEVmZmVjdBgK'\n    'IAEoCzISLmRvdXlpbi5UZXh0RWZmZWN0Ugp0ZXh0RWZmZWN0EhgKB2dyb3VwSWQYCyABKARSB2'\n    'dyb3VwSWQSKAoPaW5jb21lVGFza2dpZnRzGAwgASgEUg9pbmNvbWVUYXNrZ2lmdHMSLgoScm9v'\n    'bUZhblRpY2tldENvdW50GA0gASgEUhJyb29tRmFuVGlja2V0Q291bnQSMgoIcHJpb3JpdHkYDi'\n    'ABKAsyFi5kb3V5aW4uR2lmdElNUHJpb3JpdHlSCHByaW9yaXR5EiYKBGdpZnQYDyABKAsyEi5k'\n    'b3V5aW4uR2lmdFN0cnVjdFIEZ2lmdBIUCgVsb2dJZBgQIAEoCVIFbG9nSWQSGgoIc2VuZFR5cG'\n    'UYESABKARSCHNlbmRUeXBlEkQKEHB1YmxpY0FyZWFDb21tb24YEiABKAsyGC5kb3V5aW4uUHVi'\n    'bGljQXJlYUNvbW1vblIQcHVibGljQXJlYUNvbW1vbhI2Cg90cmF5RGlzcGxheVRleHQYEyABKA'\n    'syDC5kb3V5aW4uVGV4dFIPdHJheURpc3BsYXlUZXh0EjIKFGJhbm5lZERpc3BsYXlFZmZlY3Rz'\n    'GBQgASgEUhRiYW5uZWREaXNwbGF5RWZmZWN0cxImCg5kaXNwbGF5Rm9yU2VsZhgZIAEoCFIOZG'\n    'lzcGxheUZvclNlbGYSKgoQaW50ZXJhY3RHaWZ0SW5mbxgaIAEoCVIQaW50ZXJhY3RHaWZ0SW5m'\n    'bxIgCgtkaXlJdGVtSW5mbxgbIAEoCVILZGl5SXRlbUluZm8SKAoPbWluQXNzZXRTZXRMaXN0GB'\n    'wgAygEUg9taW5Bc3NldFNldExpc3QSHgoKdG90YWxDb3VudBgdIAEoBFIKdG90YWxDb3VudBIq'\n    'ChBjbGllbnRHaWZ0U291cmNlGB4gASgNUhBjbGllbnRHaWZ0U291cmNlEiQKDXRvVXNlcklkc0'\n    'xpc3QYICADKARSDXRvVXNlcklkc0xpc3QSGgoIc2VuZFRpbWUYISABKARSCHNlbmRUaW1lEjAK'\n    'E2ZvcmNlRGlzcGxheUVmZmVjdHMYIiABKARSE2ZvcmNlRGlzcGxheUVmZmVjdHMSGAoHdHJhY2'\n    'VJZBgjIAEoCVIHdHJhY2VJZBIoCg9lZmZlY3REaXNwbGF5VHMYJCABKARSD2VmZmVjdERpc3Bs'\n    'YXlUcw==');\n\n@$core.Deprecated('Use giftStructDescriptor instead')\nconst GiftStruct$json = {\n  '1': 'GiftStruct',\n  '2': [\n    {'1': 'image', '3': 1, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'image'},\n    {'1': 'describe', '3': 2, '4': 1, '5': 9, '10': 'describe'},\n    {'1': 'notify', '3': 3, '4': 1, '5': 8, '10': 'notify'},\n    {'1': 'duration', '3': 4, '4': 1, '5': 4, '10': 'duration'},\n    {'1': 'id', '3': 5, '4': 1, '5': 4, '10': 'id'},\n    {'1': 'forLinkmic', '3': 7, '4': 1, '5': 8, '10': 'forLinkmic'},\n    {'1': 'doodle', '3': 8, '4': 1, '5': 8, '10': 'doodle'},\n    {'1': 'forFansclub', '3': 9, '4': 1, '5': 8, '10': 'forFansclub'},\n    {'1': 'combo', '3': 10, '4': 1, '5': 8, '10': 'combo'},\n    {'1': 'type', '3': 11, '4': 1, '5': 13, '10': 'type'},\n    {'1': 'diamondCount', '3': 12, '4': 1, '5': 13, '10': 'diamondCount'},\n    {'1': 'isDisplayedOnPanel', '3': 13, '4': 1, '5': 8, '10': 'isDisplayedOnPanel'},\n    {'1': 'primaryEffectId', '3': 14, '4': 1, '5': 4, '10': 'primaryEffectId'},\n    {'1': 'giftLabelIcon', '3': 15, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'giftLabelIcon'},\n    {'1': 'name', '3': 16, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'region', '3': 17, '4': 1, '5': 9, '10': 'region'},\n    {'1': 'manual', '3': 18, '4': 1, '5': 9, '10': 'manual'},\n    {'1': 'forCustom', '3': 19, '4': 1, '5': 8, '10': 'forCustom'},\n    {'1': 'icon', '3': 21, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'icon'},\n    {'1': 'actionType', '3': 22, '4': 1, '5': 13, '10': 'actionType'},\n  ],\n};\n\n/// Descriptor for `GiftStruct`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List giftStructDescriptor = $convert.base64Decode(\n    'CgpHaWZ0U3RydWN0EiMKBWltYWdlGAEgASgLMg0uZG91eWluLkltYWdlUgVpbWFnZRIaCghkZX'\n    'NjcmliZRgCIAEoCVIIZGVzY3JpYmUSFgoGbm90aWZ5GAMgASgIUgZub3RpZnkSGgoIZHVyYXRp'\n    'b24YBCABKARSCGR1cmF0aW9uEg4KAmlkGAUgASgEUgJpZBIeCgpmb3JMaW5rbWljGAcgASgIUg'\n    'pmb3JMaW5rbWljEhYKBmRvb2RsZRgIIAEoCFIGZG9vZGxlEiAKC2ZvckZhbnNjbHViGAkgASgI'\n    'Ugtmb3JGYW5zY2x1YhIUCgVjb21ibxgKIAEoCFIFY29tYm8SEgoEdHlwZRgLIAEoDVIEdHlwZR'\n    'IiCgxkaWFtb25kQ291bnQYDCABKA1SDGRpYW1vbmRDb3VudBIuChJpc0Rpc3BsYXllZE9uUGFu'\n    'ZWwYDSABKAhSEmlzRGlzcGxheWVkT25QYW5lbBIoCg9wcmltYXJ5RWZmZWN0SWQYDiABKARSD3'\n    'ByaW1hcnlFZmZlY3RJZBIzCg1naWZ0TGFiZWxJY29uGA8gASgLMg0uZG91eWluLkltYWdlUg1n'\n    'aWZ0TGFiZWxJY29uEhIKBG5hbWUYECABKAlSBG5hbWUSFgoGcmVnaW9uGBEgASgJUgZyZWdpb2'\n    '4SFgoGbWFudWFsGBIgASgJUgZtYW51YWwSHAoJZm9yQ3VzdG9tGBMgASgIUglmb3JDdXN0b20S'\n    'IQoEaWNvbhgVIAEoCzINLmRvdXlpbi5JbWFnZVIEaWNvbhIeCgphY3Rpb25UeXBlGBYgASgNUg'\n    'phY3Rpb25UeXBl');\n\n@$core.Deprecated('Use giftIMPriorityDescriptor instead')\nconst GiftIMPriority$json = {\n  '1': 'GiftIMPriority',\n  '2': [\n    {'1': 'queueSizesList', '3': 1, '4': 3, '5': 4, '10': 'queueSizesList'},\n    {'1': 'selfQueuePriority', '3': 2, '4': 1, '5': 4, '10': 'selfQueuePriority'},\n    {'1': 'priority', '3': 3, '4': 1, '5': 4, '10': 'priority'},\n  ],\n};\n\n/// Descriptor for `GiftIMPriority`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List giftIMPriorityDescriptor = $convert.base64Decode(\n    'Cg5HaWZ0SU1Qcmlvcml0eRImCg5xdWV1ZVNpemVzTGlzdBgBIAMoBFIOcXVldWVTaXplc0xpc3'\n    'QSLAoRc2VsZlF1ZXVlUHJpb3JpdHkYAiABKARSEXNlbGZRdWV1ZVByaW9yaXR5EhoKCHByaW9y'\n    'aXR5GAMgASgEUghwcmlvcml0eQ==');\n\n@$core.Deprecated('Use textEffectDescriptor instead')\nconst TextEffect$json = {\n  '1': 'TextEffect',\n  '2': [\n    {'1': 'portrait', '3': 1, '4': 1, '5': 11, '6': '.douyin.TextEffectDetail', '10': 'portrait'},\n    {'1': 'landscape', '3': 2, '4': 1, '5': 11, '6': '.douyin.TextEffectDetail', '10': 'landscape'},\n  ],\n};\n\n/// Descriptor for `TextEffect`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textEffectDescriptor = $convert.base64Decode(\n    'CgpUZXh0RWZmZWN0EjQKCHBvcnRyYWl0GAEgASgLMhguZG91eWluLlRleHRFZmZlY3REZXRhaW'\n    'xSCHBvcnRyYWl0EjYKCWxhbmRzY2FwZRgCIAEoCzIYLmRvdXlpbi5UZXh0RWZmZWN0RGV0YWls'\n    'UglsYW5kc2NhcGU=');\n\n@$core.Deprecated('Use textEffectDetailDescriptor instead')\nconst TextEffectDetail$json = {\n  '1': 'TextEffectDetail',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 11, '6': '.douyin.Text', '10': 'text'},\n    {'1': 'textFontSize', '3': 2, '4': 1, '5': 13, '10': 'textFontSize'},\n    {'1': 'background', '3': 3, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'background'},\n    {'1': 'start', '3': 4, '4': 1, '5': 13, '10': 'start'},\n    {'1': 'duration', '3': 5, '4': 1, '5': 13, '10': 'duration'},\n    {'1': 'x', '3': 6, '4': 1, '5': 13, '10': 'x'},\n    {'1': 'y', '3': 7, '4': 1, '5': 13, '10': 'y'},\n    {'1': 'width', '3': 8, '4': 1, '5': 13, '10': 'width'},\n    {'1': 'height', '3': 9, '4': 1, '5': 13, '10': 'height'},\n    {'1': 'shadowDx', '3': 10, '4': 1, '5': 13, '10': 'shadowDx'},\n    {'1': 'shadowDy', '3': 11, '4': 1, '5': 13, '10': 'shadowDy'},\n    {'1': 'shadowRadius', '3': 12, '4': 1, '5': 13, '10': 'shadowRadius'},\n    {'1': 'shadowColor', '3': 13, '4': 1, '5': 9, '10': 'shadowColor'},\n    {'1': 'strokeColor', '3': 14, '4': 1, '5': 9, '10': 'strokeColor'},\n    {'1': 'strokeWidth', '3': 15, '4': 1, '5': 13, '10': 'strokeWidth'},\n  ],\n};\n\n/// Descriptor for `TextEffectDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textEffectDetailDescriptor = $convert.base64Decode(\n    'ChBUZXh0RWZmZWN0RGV0YWlsEiAKBHRleHQYASABKAsyDC5kb3V5aW4uVGV4dFIEdGV4dBIiCg'\n    'x0ZXh0Rm9udFNpemUYAiABKA1SDHRleHRGb250U2l6ZRItCgpiYWNrZ3JvdW5kGAMgASgLMg0u'\n    'ZG91eWluLkltYWdlUgpiYWNrZ3JvdW5kEhQKBXN0YXJ0GAQgASgNUgVzdGFydBIaCghkdXJhdG'\n    'lvbhgFIAEoDVIIZHVyYXRpb24SDAoBeBgGIAEoDVIBeBIMCgF5GAcgASgNUgF5EhQKBXdpZHRo'\n    'GAggASgNUgV3aWR0aBIWCgZoZWlnaHQYCSABKA1SBmhlaWdodBIaCghzaGFkb3dEeBgKIAEoDV'\n    'IIc2hhZG93RHgSGgoIc2hhZG93RHkYCyABKA1SCHNoYWRvd0R5EiIKDHNoYWRvd1JhZGl1cxgM'\n    'IAEoDVIMc2hhZG93UmFkaXVzEiAKC3NoYWRvd0NvbG9yGA0gASgJUgtzaGFkb3dDb2xvchIgCg'\n    'tzdHJva2VDb2xvchgOIAEoCVILc3Ryb2tlQ29sb3ISIAoLc3Ryb2tlV2lkdGgYDyABKA1SC3N0'\n    'cm9rZVdpZHRo');\n\n@$core.Deprecated('Use memberMessageDescriptor instead')\nconst MemberMessage$json = {\n  '1': 'MemberMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'memberCount', '3': 3, '4': 1, '5': 4, '10': 'memberCount'},\n    {'1': 'operator', '3': 4, '4': 1, '5': 11, '6': '.douyin.User', '10': 'operator'},\n    {'1': 'isSetToAdmin', '3': 5, '4': 1, '5': 8, '10': 'isSetToAdmin'},\n    {'1': 'isTopUser', '3': 6, '4': 1, '5': 8, '10': 'isTopUser'},\n    {'1': 'rankScore', '3': 7, '4': 1, '5': 4, '10': 'rankScore'},\n    {'1': 'topUserNo', '3': 8, '4': 1, '5': 4, '10': 'topUserNo'},\n    {'1': 'enterType', '3': 9, '4': 1, '5': 4, '10': 'enterType'},\n    {'1': 'action', '3': 10, '4': 1, '5': 4, '10': 'action'},\n    {'1': 'actionDescription', '3': 11, '4': 1, '5': 9, '10': 'actionDescription'},\n    {'1': 'userId', '3': 12, '4': 1, '5': 4, '10': 'userId'},\n    {'1': 'effectConfig', '3': 13, '4': 1, '5': 11, '6': '.douyin.EffectConfig', '10': 'effectConfig'},\n    {'1': 'popStr', '3': 14, '4': 1, '5': 9, '10': 'popStr'},\n    {'1': 'enterEffectConfig', '3': 15, '4': 1, '5': 11, '6': '.douyin.EffectConfig', '10': 'enterEffectConfig'},\n    {'1': 'backgroundImage', '3': 16, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'backgroundImage'},\n    {'1': 'backgroundImageV2', '3': 17, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'backgroundImageV2'},\n    {'1': 'anchorDisplayText', '3': 18, '4': 1, '5': 11, '6': '.douyin.Text', '10': 'anchorDisplayText'},\n    {'1': 'publicAreaCommon', '3': 19, '4': 1, '5': 11, '6': '.douyin.PublicAreaCommon', '10': 'publicAreaCommon'},\n    {'1': 'userEnterTipType', '3': 20, '4': 1, '5': 4, '10': 'userEnterTipType'},\n    {'1': 'anchorEnterTipType', '3': 21, '4': 1, '5': 4, '10': 'anchorEnterTipType'},\n  ],\n};\n\n/// Descriptor for `MemberMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List memberMessageDescriptor = $convert.base64Decode(\n    'Cg1NZW1iZXJNZXNzYWdlEiYKBmNvbW1vbhgBIAEoCzIOLmRvdXlpbi5Db21tb25SBmNvbW1vbh'\n    'IgCgR1c2VyGAIgASgLMgwuZG91eWluLlVzZXJSBHVzZXISIAoLbWVtYmVyQ291bnQYAyABKARS'\n    'C21lbWJlckNvdW50EigKCG9wZXJhdG9yGAQgASgLMgwuZG91eWluLlVzZXJSCG9wZXJhdG9yEi'\n    'IKDGlzU2V0VG9BZG1pbhgFIAEoCFIMaXNTZXRUb0FkbWluEhwKCWlzVG9wVXNlchgGIAEoCFIJ'\n    'aXNUb3BVc2VyEhwKCXJhbmtTY29yZRgHIAEoBFIJcmFua1Njb3JlEhwKCXRvcFVzZXJObxgIIA'\n    'EoBFIJdG9wVXNlck5vEhwKCWVudGVyVHlwZRgJIAEoBFIJZW50ZXJUeXBlEhYKBmFjdGlvbhgK'\n    'IAEoBFIGYWN0aW9uEiwKEWFjdGlvbkRlc2NyaXB0aW9uGAsgASgJUhFhY3Rpb25EZXNjcmlwdG'\n    'lvbhIWCgZ1c2VySWQYDCABKARSBnVzZXJJZBI4CgxlZmZlY3RDb25maWcYDSABKAsyFC5kb3V5'\n    'aW4uRWZmZWN0Q29uZmlnUgxlZmZlY3RDb25maWcSFgoGcG9wU3RyGA4gASgJUgZwb3BTdHISQg'\n    'oRZW50ZXJFZmZlY3RDb25maWcYDyABKAsyFC5kb3V5aW4uRWZmZWN0Q29uZmlnUhFlbnRlckVm'\n    'ZmVjdENvbmZpZxI3Cg9iYWNrZ3JvdW5kSW1hZ2UYECABKAsyDS5kb3V5aW4uSW1hZ2VSD2JhY2'\n    'tncm91bmRJbWFnZRI7ChFiYWNrZ3JvdW5kSW1hZ2VWMhgRIAEoCzINLmRvdXlpbi5JbWFnZVIR'\n    'YmFja2dyb3VuZEltYWdlVjISOgoRYW5jaG9yRGlzcGxheVRleHQYEiABKAsyDC5kb3V5aW4uVG'\n    'V4dFIRYW5jaG9yRGlzcGxheVRleHQSRAoQcHVibGljQXJlYUNvbW1vbhgTIAEoCzIYLmRvdXlp'\n    'bi5QdWJsaWNBcmVhQ29tbW9uUhBwdWJsaWNBcmVhQ29tbW9uEioKEHVzZXJFbnRlclRpcFR5cG'\n    'UYFCABKARSEHVzZXJFbnRlclRpcFR5cGUSLgoSYW5jaG9yRW50ZXJUaXBUeXBlGBUgASgEUhJh'\n    'bmNob3JFbnRlclRpcFR5cGU=');\n\n@$core.Deprecated('Use publicAreaCommonDescriptor instead')\nconst PublicAreaCommon$json = {\n  '1': 'PublicAreaCommon',\n  '2': [\n    {'1': 'userLabel', '3': 1, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'userLabel'},\n    {'1': 'userConsumeInRoom', '3': 2, '4': 1, '5': 4, '10': 'userConsumeInRoom'},\n    {'1': 'userSendGiftCntInRoom', '3': 3, '4': 1, '5': 4, '10': 'userSendGiftCntInRoom'},\n  ],\n};\n\n/// Descriptor for `PublicAreaCommon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List publicAreaCommonDescriptor = $convert.base64Decode(\n    'ChBQdWJsaWNBcmVhQ29tbW9uEisKCXVzZXJMYWJlbBgBIAEoCzINLmRvdXlpbi5JbWFnZVIJdX'\n    'NlckxhYmVsEiwKEXVzZXJDb25zdW1lSW5Sb29tGAIgASgEUhF1c2VyQ29uc3VtZUluUm9vbRI0'\n    'ChV1c2VyU2VuZEdpZnRDbnRJblJvb20YAyABKARSFXVzZXJTZW5kR2lmdENudEluUm9vbQ==');\n\n@$core.Deprecated('Use effectConfigDescriptor instead')\nconst EffectConfig$json = {\n  '1': 'EffectConfig',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 4, '10': 'type'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'icon'},\n    {'1': 'avatarPos', '3': 3, '4': 1, '5': 4, '10': 'avatarPos'},\n    {'1': 'text', '3': 4, '4': 1, '5': 11, '6': '.douyin.Text', '10': 'text'},\n    {'1': 'textIcon', '3': 5, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'textIcon'},\n    {'1': 'stayTime', '3': 6, '4': 1, '5': 13, '10': 'stayTime'},\n    {'1': 'animAssetId', '3': 7, '4': 1, '5': 4, '10': 'animAssetId'},\n    {'1': 'badge', '3': 8, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'badge'},\n    {'1': 'flexSettingArrayList', '3': 9, '4': 3, '5': 4, '10': 'flexSettingArrayList'},\n    {'1': 'textIconOverlay', '3': 10, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'textIconOverlay'},\n    {'1': 'animatedBadge', '3': 11, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'animatedBadge'},\n    {'1': 'hasSweepLight', '3': 12, '4': 1, '5': 8, '10': 'hasSweepLight'},\n    {'1': 'textFlexSettingArrayList', '3': 13, '4': 3, '5': 4, '10': 'textFlexSettingArrayList'},\n    {'1': 'centerAnimAssetId', '3': 14, '4': 1, '5': 4, '10': 'centerAnimAssetId'},\n    {'1': 'dynamicImage', '3': 15, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'dynamicImage'},\n    {'1': 'extraMap', '3': 16, '4': 3, '5': 11, '6': '.douyin.EffectConfig.ExtraMapEntry', '10': 'extraMap'},\n    {'1': 'mp4AnimAssetId', '3': 17, '4': 1, '5': 4, '10': 'mp4AnimAssetId'},\n    {'1': 'priority', '3': 18, '4': 1, '5': 4, '10': 'priority'},\n    {'1': 'maxWaitTime', '3': 19, '4': 1, '5': 4, '10': 'maxWaitTime'},\n    {'1': 'dressId', '3': 20, '4': 1, '5': 9, '10': 'dressId'},\n    {'1': 'alignment', '3': 21, '4': 1, '5': 4, '10': 'alignment'},\n    {'1': 'alignmentOffset', '3': 22, '4': 1, '5': 4, '10': 'alignmentOffset'},\n  ],\n  '3': [EffectConfig_ExtraMapEntry$json],\n};\n\n@$core.Deprecated('Use effectConfigDescriptor instead')\nconst EffectConfig_ExtraMapEntry$json = {\n  '1': 'ExtraMapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `EffectConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List effectConfigDescriptor = $convert.base64Decode(\n    'CgxFZmZlY3RDb25maWcSEgoEdHlwZRgBIAEoBFIEdHlwZRIhCgRpY29uGAIgASgLMg0uZG91eW'\n    'luLkltYWdlUgRpY29uEhwKCWF2YXRhclBvcxgDIAEoBFIJYXZhdGFyUG9zEiAKBHRleHQYBCAB'\n    'KAsyDC5kb3V5aW4uVGV4dFIEdGV4dBIpCgh0ZXh0SWNvbhgFIAEoCzINLmRvdXlpbi5JbWFnZV'\n    'IIdGV4dEljb24SGgoIc3RheVRpbWUYBiABKA1SCHN0YXlUaW1lEiAKC2FuaW1Bc3NldElkGAcg'\n    'ASgEUgthbmltQXNzZXRJZBIjCgViYWRnZRgIIAEoCzINLmRvdXlpbi5JbWFnZVIFYmFkZ2USMg'\n    'oUZmxleFNldHRpbmdBcnJheUxpc3QYCSADKARSFGZsZXhTZXR0aW5nQXJyYXlMaXN0EjcKD3Rl'\n    'eHRJY29uT3ZlcmxheRgKIAEoCzINLmRvdXlpbi5JbWFnZVIPdGV4dEljb25PdmVybGF5EjMKDW'\n    'FuaW1hdGVkQmFkZ2UYCyABKAsyDS5kb3V5aW4uSW1hZ2VSDWFuaW1hdGVkQmFkZ2USJAoNaGFz'\n    'U3dlZXBMaWdodBgMIAEoCFINaGFzU3dlZXBMaWdodBI6Chh0ZXh0RmxleFNldHRpbmdBcnJheU'\n    'xpc3QYDSADKARSGHRleHRGbGV4U2V0dGluZ0FycmF5TGlzdBIsChFjZW50ZXJBbmltQXNzZXRJ'\n    'ZBgOIAEoBFIRY2VudGVyQW5pbUFzc2V0SWQSMQoMZHluYW1pY0ltYWdlGA8gASgLMg0uZG91eW'\n    'luLkltYWdlUgxkeW5hbWljSW1hZ2USPgoIZXh0cmFNYXAYECADKAsyIi5kb3V5aW4uRWZmZWN0'\n    'Q29uZmlnLkV4dHJhTWFwRW50cnlSCGV4dHJhTWFwEiYKDm1wNEFuaW1Bc3NldElkGBEgASgEUg'\n    '5tcDRBbmltQXNzZXRJZBIaCghwcmlvcml0eRgSIAEoBFIIcHJpb3JpdHkSIAoLbWF4V2FpdFRp'\n    'bWUYEyABKARSC21heFdhaXRUaW1lEhgKB2RyZXNzSWQYFCABKAlSB2RyZXNzSWQSHAoJYWxpZ2'\n    '5tZW50GBUgASgEUglhbGlnbm1lbnQSKAoPYWxpZ25tZW50T2Zmc2V0GBYgASgEUg9hbGlnbm1l'\n    'bnRPZmZzZXQaOwoNRXh0cmFNYXBFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIA'\n    'EoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use textDescriptor instead')\nconst Text$json = {\n  '1': 'Text',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'defaultPatter', '3': 2, '4': 1, '5': 9, '10': 'defaultPatter'},\n    {'1': 'defaultFormat', '3': 3, '4': 1, '5': 11, '6': '.douyin.TextFormat', '10': 'defaultFormat'},\n    {'1': 'piecesList', '3': 4, '4': 3, '5': 11, '6': '.douyin.TextPiece', '10': 'piecesList'},\n  ],\n};\n\n/// Descriptor for `Text`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textDescriptor = $convert.base64Decode(\n    'CgRUZXh0EhAKA2tleRgBIAEoCVIDa2V5EiQKDWRlZmF1bHRQYXR0ZXIYAiABKAlSDWRlZmF1bH'\n    'RQYXR0ZXISOAoNZGVmYXVsdEZvcm1hdBgDIAEoCzISLmRvdXlpbi5UZXh0Rm9ybWF0Ug1kZWZh'\n    'dWx0Rm9ybWF0EjEKCnBpZWNlc0xpc3QYBCADKAsyES5kb3V5aW4uVGV4dFBpZWNlUgpwaWVjZX'\n    'NMaXN0');\n\n@$core.Deprecated('Use textPieceDescriptor instead')\nconst TextPiece$json = {\n  '1': 'TextPiece',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 8, '10': 'type'},\n    {'1': 'format', '3': 2, '4': 1, '5': 11, '6': '.douyin.TextFormat', '10': 'format'},\n    {'1': 'stringValue', '3': 3, '4': 1, '5': 9, '10': 'stringValue'},\n    {'1': 'userValue', '3': 4, '4': 1, '5': 11, '6': '.douyin.TextPieceUser', '10': 'userValue'},\n    {'1': 'giftValue', '3': 5, '4': 1, '5': 11, '6': '.douyin.TextPieceGift', '10': 'giftValue'},\n    {'1': 'heartValue', '3': 6, '4': 1, '5': 11, '6': '.douyin.TextPieceHeart', '10': 'heartValue'},\n    {'1': 'patternRefValue', '3': 7, '4': 1, '5': 11, '6': '.douyin.TextPiecePatternRef', '10': 'patternRefValue'},\n    {'1': 'imageValue', '3': 8, '4': 1, '5': 11, '6': '.douyin.TextPieceImage', '10': 'imageValue'},\n  ],\n};\n\n/// Descriptor for `TextPiece`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPieceDescriptor = $convert.base64Decode(\n    'CglUZXh0UGllY2USEgoEdHlwZRgBIAEoCFIEdHlwZRIqCgZmb3JtYXQYAiABKAsyEi5kb3V5aW'\n    '4uVGV4dEZvcm1hdFIGZm9ybWF0EiAKC3N0cmluZ1ZhbHVlGAMgASgJUgtzdHJpbmdWYWx1ZRIz'\n    'Cgl1c2VyVmFsdWUYBCABKAsyFS5kb3V5aW4uVGV4dFBpZWNlVXNlclIJdXNlclZhbHVlEjMKCW'\n    'dpZnRWYWx1ZRgFIAEoCzIVLmRvdXlpbi5UZXh0UGllY2VHaWZ0UglnaWZ0VmFsdWUSNgoKaGVh'\n    'cnRWYWx1ZRgGIAEoCzIWLmRvdXlpbi5UZXh0UGllY2VIZWFydFIKaGVhcnRWYWx1ZRJFCg9wYX'\n    'R0ZXJuUmVmVmFsdWUYByABKAsyGy5kb3V5aW4uVGV4dFBpZWNlUGF0dGVyblJlZlIPcGF0dGVy'\n    'blJlZlZhbHVlEjYKCmltYWdlVmFsdWUYCCABKAsyFi5kb3V5aW4uVGV4dFBpZWNlSW1hZ2VSCm'\n    'ltYWdlVmFsdWU=');\n\n@$core.Deprecated('Use textPieceImageDescriptor instead')\nconst TextPieceImage$json = {\n  '1': 'TextPieceImage',\n  '2': [\n    {'1': 'image', '3': 1, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'image'},\n    {'1': 'scalingRate', '3': 2, '4': 1, '5': 2, '10': 'scalingRate'},\n  ],\n};\n\n/// Descriptor for `TextPieceImage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPieceImageDescriptor = $convert.base64Decode(\n    'Cg5UZXh0UGllY2VJbWFnZRIjCgVpbWFnZRgBIAEoCzINLmRvdXlpbi5JbWFnZVIFaW1hZ2USIA'\n    'oLc2NhbGluZ1JhdGUYAiABKAJSC3NjYWxpbmdSYXRl');\n\n@$core.Deprecated('Use textPiecePatternRefDescriptor instead')\nconst TextPiecePatternRef$json = {\n  '1': 'TextPiecePatternRef',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'defaultPattern', '3': 2, '4': 1, '5': 9, '10': 'defaultPattern'},\n  ],\n};\n\n/// Descriptor for `TextPiecePatternRef`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPiecePatternRefDescriptor = $convert.base64Decode(\n    'ChNUZXh0UGllY2VQYXR0ZXJuUmVmEhAKA2tleRgBIAEoCVIDa2V5EiYKDmRlZmF1bHRQYXR0ZX'\n    'JuGAIgASgJUg5kZWZhdWx0UGF0dGVybg==');\n\n@$core.Deprecated('Use textPieceHeartDescriptor instead')\nconst TextPieceHeart$json = {\n  '1': 'TextPieceHeart',\n  '2': [\n    {'1': 'color', '3': 1, '4': 1, '5': 9, '10': 'color'},\n  ],\n};\n\n/// Descriptor for `TextPieceHeart`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPieceHeartDescriptor = $convert.base64Decode(\n    'Cg5UZXh0UGllY2VIZWFydBIUCgVjb2xvchgBIAEoCVIFY29sb3I=');\n\n@$core.Deprecated('Use textPieceGiftDescriptor instead')\nconst TextPieceGift$json = {\n  '1': 'TextPieceGift',\n  '2': [\n    {'1': 'giftId', '3': 1, '4': 1, '5': 4, '10': 'giftId'},\n    {'1': 'nameRef', '3': 2, '4': 1, '5': 11, '6': '.douyin.PatternRef', '10': 'nameRef'},\n  ],\n};\n\n/// Descriptor for `TextPieceGift`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPieceGiftDescriptor = $convert.base64Decode(\n    'Cg1UZXh0UGllY2VHaWZ0EhYKBmdpZnRJZBgBIAEoBFIGZ2lmdElkEiwKB25hbWVSZWYYAiABKA'\n    'syEi5kb3V5aW4uUGF0dGVyblJlZlIHbmFtZVJlZg==');\n\n@$core.Deprecated('Use patternRefDescriptor instead')\nconst PatternRef$json = {\n  '1': 'PatternRef',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'defaultPattern', '3': 2, '4': 1, '5': 9, '10': 'defaultPattern'},\n  ],\n};\n\n/// Descriptor for `PatternRef`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List patternRefDescriptor = $convert.base64Decode(\n    'CgpQYXR0ZXJuUmVmEhAKA2tleRgBIAEoCVIDa2V5EiYKDmRlZmF1bHRQYXR0ZXJuGAIgASgJUg'\n    '5kZWZhdWx0UGF0dGVybg==');\n\n@$core.Deprecated('Use textPieceUserDescriptor instead')\nconst TextPieceUser$json = {\n  '1': 'TextPieceUser',\n  '2': [\n    {'1': 'user', '3': 1, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'withColon', '3': 2, '4': 1, '5': 8, '10': 'withColon'},\n  ],\n};\n\n/// Descriptor for `TextPieceUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textPieceUserDescriptor = $convert.base64Decode(\n    'Cg1UZXh0UGllY2VVc2VyEiAKBHVzZXIYASABKAsyDC5kb3V5aW4uVXNlclIEdXNlchIcCgl3aX'\n    'RoQ29sb24YAiABKAhSCXdpdGhDb2xvbg==');\n\n@$core.Deprecated('Use textFormatDescriptor instead')\nconst TextFormat$json = {\n  '1': 'TextFormat',\n  '2': [\n    {'1': 'color', '3': 1, '4': 1, '5': 9, '10': 'color'},\n    {'1': 'bold', '3': 2, '4': 1, '5': 8, '10': 'bold'},\n    {'1': 'italic', '3': 3, '4': 1, '5': 8, '10': 'italic'},\n    {'1': 'weight', '3': 4, '4': 1, '5': 13, '10': 'weight'},\n    {'1': 'italicAngle', '3': 5, '4': 1, '5': 13, '10': 'italicAngle'},\n    {'1': 'fontSize', '3': 6, '4': 1, '5': 13, '10': 'fontSize'},\n    {'1': 'useHeighLightColor', '3': 7, '4': 1, '5': 8, '10': 'useHeighLightColor'},\n    {'1': 'useRemoteClor', '3': 8, '4': 1, '5': 8, '10': 'useRemoteClor'},\n  ],\n};\n\n/// Descriptor for `TextFormat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textFormatDescriptor = $convert.base64Decode(\n    'CgpUZXh0Rm9ybWF0EhQKBWNvbG9yGAEgASgJUgVjb2xvchISCgRib2xkGAIgASgIUgRib2xkEh'\n    'YKBml0YWxpYxgDIAEoCFIGaXRhbGljEhYKBndlaWdodBgEIAEoDVIGd2VpZ2h0EiAKC2l0YWxp'\n    'Y0FuZ2xlGAUgASgNUgtpdGFsaWNBbmdsZRIaCghmb250U2l6ZRgGIAEoDVIIZm9udFNpemUSLg'\n    'oSdXNlSGVpZ2hMaWdodENvbG9yGAcgASgIUhJ1c2VIZWlnaExpZ2h0Q29sb3ISJAoNdXNlUmVt'\n    'b3RlQ2xvchgIIAEoCFINdXNlUmVtb3RlQ2xvcg==');\n\n@$core.Deprecated('Use likeMessageDescriptor instead')\nconst LikeMessage$json = {\n  '1': 'LikeMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'count', '3': 2, '4': 1, '5': 4, '10': 'count'},\n    {'1': 'total', '3': 3, '4': 1, '5': 4, '10': 'total'},\n    {'1': 'color', '3': 4, '4': 1, '5': 4, '10': 'color'},\n    {'1': 'user', '3': 5, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'icon', '3': 6, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'doubleLikeDetail', '3': 7, '4': 1, '5': 11, '6': '.douyin.DoubleLikeDetail', '10': 'doubleLikeDetail'},\n    {'1': 'displayControlInfo', '3': 8, '4': 1, '5': 11, '6': '.douyin.DisplayControlInfo', '10': 'displayControlInfo'},\n    {'1': 'linkmicGuestUid', '3': 9, '4': 1, '5': 4, '10': 'linkmicGuestUid'},\n    {'1': 'scene', '3': 10, '4': 1, '5': 9, '10': 'scene'},\n    {'1': 'picoDisplayInfo', '3': 11, '4': 1, '5': 11, '6': '.douyin.PicoDisplayInfo', '10': 'picoDisplayInfo'},\n  ],\n};\n\n/// Descriptor for `LikeMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeMessageDescriptor = $convert.base64Decode(\n    'CgtMaWtlTWVzc2FnZRImCgZjb21tb24YASABKAsyDi5kb3V5aW4uQ29tbW9uUgZjb21tb24SFA'\n    'oFY291bnQYAiABKARSBWNvdW50EhQKBXRvdGFsGAMgASgEUgV0b3RhbBIUCgVjb2xvchgEIAEo'\n    'BFIFY29sb3ISIAoEdXNlchgFIAEoCzIMLmRvdXlpbi5Vc2VyUgR1c2VyEhIKBGljb24YBiABKA'\n    'lSBGljb24SRAoQZG91YmxlTGlrZURldGFpbBgHIAEoCzIYLmRvdXlpbi5Eb3VibGVMaWtlRGV0'\n    'YWlsUhBkb3VibGVMaWtlRGV0YWlsEkoKEmRpc3BsYXlDb250cm9sSW5mbxgIIAEoCzIaLmRvdX'\n    'lpbi5EaXNwbGF5Q29udHJvbEluZm9SEmRpc3BsYXlDb250cm9sSW5mbxIoCg9saW5rbWljR3Vl'\n    'c3RVaWQYCSABKARSD2xpbmttaWNHdWVzdFVpZBIUCgVzY2VuZRgKIAEoCVIFc2NlbmUSQQoPcG'\n    'ljb0Rpc3BsYXlJbmZvGAsgASgLMhcuZG91eWluLlBpY29EaXNwbGF5SW5mb1IPcGljb0Rpc3Bs'\n    'YXlJbmZv');\n\n@$core.Deprecated('Use socialMessageDescriptor instead')\nconst SocialMessage$json = {\n  '1': 'SocialMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'shareType', '3': 3, '4': 1, '5': 4, '10': 'shareType'},\n    {'1': 'action', '3': 4, '4': 1, '5': 4, '10': 'action'},\n    {'1': 'shareTarget', '3': 5, '4': 1, '5': 9, '10': 'shareTarget'},\n    {'1': 'followCount', '3': 6, '4': 1, '5': 4, '10': 'followCount'},\n    {'1': 'publicAreaCommon', '3': 7, '4': 1, '5': 11, '6': '.douyin.PublicAreaCommon', '10': 'publicAreaCommon'},\n  ],\n};\n\n/// Descriptor for `SocialMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List socialMessageDescriptor = $convert.base64Decode(\n    'Cg1Tb2NpYWxNZXNzYWdlEiYKBmNvbW1vbhgBIAEoCzIOLmRvdXlpbi5Db21tb25SBmNvbW1vbh'\n    'IgCgR1c2VyGAIgASgLMgwuZG91eWluLlVzZXJSBHVzZXISHAoJc2hhcmVUeXBlGAMgASgEUglz'\n    'aGFyZVR5cGUSFgoGYWN0aW9uGAQgASgEUgZhY3Rpb24SIAoLc2hhcmVUYXJnZXQYBSABKAlSC3'\n    'NoYXJlVGFyZ2V0EiAKC2ZvbGxvd0NvdW50GAYgASgEUgtmb2xsb3dDb3VudBJEChBwdWJsaWNB'\n    'cmVhQ29tbW9uGAcgASgLMhguZG91eWluLlB1YmxpY0FyZWFDb21tb25SEHB1YmxpY0FyZWFDb2'\n    '1tb24=');\n\n@$core.Deprecated('Use picoDisplayInfoDescriptor instead')\nconst PicoDisplayInfo$json = {\n  '1': 'PicoDisplayInfo',\n  '2': [\n    {'1': 'comboSumCount', '3': 1, '4': 1, '5': 4, '10': 'comboSumCount'},\n    {'1': 'emoji', '3': 2, '4': 1, '5': 9, '10': 'emoji'},\n    {'1': 'emojiIcon', '3': 3, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'emojiIcon'},\n    {'1': 'emojiText', '3': 4, '4': 1, '5': 9, '10': 'emojiText'},\n  ],\n};\n\n/// Descriptor for `PicoDisplayInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List picoDisplayInfoDescriptor = $convert.base64Decode(\n    'Cg9QaWNvRGlzcGxheUluZm8SJAoNY29tYm9TdW1Db3VudBgBIAEoBFINY29tYm9TdW1Db3VudB'\n    'IUCgVlbW9qaRgCIAEoCVIFZW1vamkSKwoJZW1vamlJY29uGAMgASgLMg0uZG91eWluLkltYWdl'\n    'UgllbW9qaUljb24SHAoJZW1vamlUZXh0GAQgASgJUgllbW9qaVRleHQ=');\n\n@$core.Deprecated('Use doubleLikeDetailDescriptor instead')\nconst DoubleLikeDetail$json = {\n  '1': 'DoubleLikeDetail',\n  '2': [\n    {'1': 'doubleFlag', '3': 1, '4': 1, '5': 8, '10': 'doubleFlag'},\n    {'1': 'seqId', '3': 2, '4': 1, '5': 13, '10': 'seqId'},\n    {'1': 'renewalsNum', '3': 3, '4': 1, '5': 13, '10': 'renewalsNum'},\n    {'1': 'triggersNum', '3': 4, '4': 1, '5': 13, '10': 'triggersNum'},\n  ],\n};\n\n/// Descriptor for `DoubleLikeDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List doubleLikeDetailDescriptor = $convert.base64Decode(\n    'ChBEb3VibGVMaWtlRGV0YWlsEh4KCmRvdWJsZUZsYWcYASABKAhSCmRvdWJsZUZsYWcSFAoFc2'\n    'VxSWQYAiABKA1SBXNlcUlkEiAKC3JlbmV3YWxzTnVtGAMgASgNUgtyZW5ld2Fsc051bRIgCgt0'\n    'cmlnZ2Vyc051bRgEIAEoDVILdHJpZ2dlcnNOdW0=');\n\n@$core.Deprecated('Use displayControlInfoDescriptor instead')\nconst DisplayControlInfo$json = {\n  '1': 'DisplayControlInfo',\n  '2': [\n    {'1': 'showText', '3': 1, '4': 1, '5': 8, '10': 'showText'},\n    {'1': 'showIcons', '3': 2, '4': 1, '5': 8, '10': 'showIcons'},\n  ],\n};\n\n/// Descriptor for `DisplayControlInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List displayControlInfoDescriptor = $convert.base64Decode(\n    'ChJEaXNwbGF5Q29udHJvbEluZm8SGgoIc2hvd1RleHQYASABKAhSCHNob3dUZXh0EhwKCXNob3'\n    'dJY29ucxgCIAEoCFIJc2hvd0ljb25z');\n\n@$core.Deprecated('Use episodeChatMessageDescriptor instead')\nconst EpisodeChatMessage$json = {\n  '1': 'EpisodeChatMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Message', '10': 'common'},\n    {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'content', '3': 3, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'visibleToSende', '3': 4, '4': 1, '5': 8, '10': 'visibleToSende'},\n    {'1': 'giftImage', '3': 7, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'giftImage'},\n    {'1': 'agreeMsgId', '3': 8, '4': 1, '5': 4, '10': 'agreeMsgId'},\n    {'1': 'colorValueList', '3': 9, '4': 3, '5': 9, '10': 'colorValueList'},\n  ],\n};\n\n/// Descriptor for `EpisodeChatMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List episodeChatMessageDescriptor = $convert.base64Decode(\n    'ChJFcGlzb2RlQ2hhdE1lc3NhZ2USJwoGY29tbW9uGAEgASgLMg8uZG91eWluLk1lc3NhZ2VSBm'\n    'NvbW1vbhIgCgR1c2VyGAIgASgLMgwuZG91eWluLlVzZXJSBHVzZXISGAoHY29udGVudBgDIAEo'\n    'CVIHY29udGVudBImCg52aXNpYmxlVG9TZW5kZRgEIAEoCFIOdmlzaWJsZVRvU2VuZGUSKwoJZ2'\n    'lmdEltYWdlGAcgASgLMg0uZG91eWluLkltYWdlUglnaWZ0SW1hZ2USHgoKYWdyZWVNc2dJZBgI'\n    'IAEoBFIKYWdyZWVNc2dJZBImCg5jb2xvclZhbHVlTGlzdBgJIAMoCVIOY29sb3JWYWx1ZUxpc3'\n    'Q=');\n\n@$core.Deprecated('Use matchAgainstScoreMessageDescriptor instead')\nconst MatchAgainstScoreMessage$json = {\n  '1': 'MatchAgainstScoreMessage',\n  '2': [\n    {'1': 'common', '3': 1, '4': 1, '5': 11, '6': '.douyin.Common', '10': 'common'},\n    {'1': 'against', '3': 2, '4': 1, '5': 11, '6': '.douyin.Against', '10': 'against'},\n    {'1': 'matchStatus', '3': 3, '4': 1, '5': 13, '10': 'matchStatus'},\n    {'1': 'displayStatus', '3': 4, '4': 1, '5': 13, '10': 'displayStatus'},\n  ],\n};\n\n/// Descriptor for `MatchAgainstScoreMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List matchAgainstScoreMessageDescriptor = $convert.base64Decode(\n    'ChhNYXRjaEFnYWluc3RTY29yZU1lc3NhZ2USJgoGY29tbW9uGAEgASgLMg4uZG91eWluLkNvbW'\n    '1vblIGY29tbW9uEikKB2FnYWluc3QYAiABKAsyDy5kb3V5aW4uQWdhaW5zdFIHYWdhaW5zdBIg'\n    'CgttYXRjaFN0YXR1cxgDIAEoDVILbWF0Y2hTdGF0dXMSJAoNZGlzcGxheVN0YXR1cxgEIAEoDV'\n    'INZGlzcGxheVN0YXR1cw==');\n\n@$core.Deprecated('Use againstDescriptor instead')\nconst Against$json = {\n  '1': 'Against',\n  '2': [\n    {'1': 'leftName', '3': 1, '4': 1, '5': 9, '10': 'leftName'},\n    {'1': 'leftLogo', '3': 2, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'leftLogo'},\n    {'1': 'leftGoal', '3': 3, '4': 1, '5': 9, '10': 'leftGoal'},\n    {'1': 'rightName', '3': 6, '4': 1, '5': 9, '10': 'rightName'},\n    {'1': 'rightLogo', '3': 7, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'rightLogo'},\n    {'1': 'rightGoal', '3': 8, '4': 1, '5': 9, '10': 'rightGoal'},\n    {'1': 'timestamp', '3': 11, '4': 1, '5': 4, '10': 'timestamp'},\n    {'1': 'version', '3': 12, '4': 1, '5': 4, '10': 'version'},\n    {'1': 'leftTeamId', '3': 13, '4': 1, '5': 4, '10': 'leftTeamId'},\n    {'1': 'rightTeamId', '3': 14, '4': 1, '5': 4, '10': 'rightTeamId'},\n    {'1': 'diffSei2absSecond', '3': 15, '4': 1, '5': 4, '10': 'diffSei2absSecond'},\n    {'1': 'finalGoalStage', '3': 16, '4': 1, '5': 13, '10': 'finalGoalStage'},\n    {'1': 'currentGoalStage', '3': 17, '4': 1, '5': 13, '10': 'currentGoalStage'},\n    {'1': 'leftScoreAddition', '3': 18, '4': 1, '5': 13, '10': 'leftScoreAddition'},\n    {'1': 'rightScoreAddition', '3': 19, '4': 1, '5': 13, '10': 'rightScoreAddition'},\n    {'1': 'leftGoalInt', '3': 20, '4': 1, '5': 4, '10': 'leftGoalInt'},\n    {'1': 'rightGoalInt', '3': 21, '4': 1, '5': 4, '10': 'rightGoalInt'},\n  ],\n};\n\n/// Descriptor for `Against`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List againstDescriptor = $convert.base64Decode(\n    'CgdBZ2FpbnN0EhoKCGxlZnROYW1lGAEgASgJUghsZWZ0TmFtZRIpCghsZWZ0TG9nbxgCIAEoCz'\n    'INLmRvdXlpbi5JbWFnZVIIbGVmdExvZ28SGgoIbGVmdEdvYWwYAyABKAlSCGxlZnRHb2FsEhwK'\n    'CXJpZ2h0TmFtZRgGIAEoCVIJcmlnaHROYW1lEisKCXJpZ2h0TG9nbxgHIAEoCzINLmRvdXlpbi'\n    '5JbWFnZVIJcmlnaHRMb2dvEhwKCXJpZ2h0R29hbBgIIAEoCVIJcmlnaHRHb2FsEhwKCXRpbWVz'\n    'dGFtcBgLIAEoBFIJdGltZXN0YW1wEhgKB3ZlcnNpb24YDCABKARSB3ZlcnNpb24SHgoKbGVmdF'\n    'RlYW1JZBgNIAEoBFIKbGVmdFRlYW1JZBIgCgtyaWdodFRlYW1JZBgOIAEoBFILcmlnaHRUZWFt'\n    'SWQSLAoRZGlmZlNlaTJhYnNTZWNvbmQYDyABKARSEWRpZmZTZWkyYWJzU2Vjb25kEiYKDmZpbm'\n    'FsR29hbFN0YWdlGBAgASgNUg5maW5hbEdvYWxTdGFnZRIqChBjdXJyZW50R29hbFN0YWdlGBEg'\n    'ASgNUhBjdXJyZW50R29hbFN0YWdlEiwKEWxlZnRTY29yZUFkZGl0aW9uGBIgASgNUhFsZWZ0U2'\n    'NvcmVBZGRpdGlvbhIuChJyaWdodFNjb3JlQWRkaXRpb24YEyABKA1SEnJpZ2h0U2NvcmVBZGRp'\n    'dGlvbhIgCgtsZWZ0R29hbEludBgUIAEoBFILbGVmdEdvYWxJbnQSIgoMcmlnaHRHb2FsSW50GB'\n    'UgASgEUgxyaWdodEdvYWxJbnQ=');\n\n@$core.Deprecated('Use commonDescriptor instead')\nconst Common$json = {\n  '1': 'Common',\n  '2': [\n    {'1': 'method', '3': 1, '4': 1, '5': 9, '10': 'method'},\n    {'1': 'msgId', '3': 2, '4': 1, '5': 4, '10': 'msgId'},\n    {'1': 'roomId', '3': 3, '4': 1, '5': 4, '10': 'roomId'},\n    {'1': 'createTime', '3': 4, '4': 1, '5': 4, '10': 'createTime'},\n    {'1': 'monitor', '3': 5, '4': 1, '5': 13, '10': 'monitor'},\n    {'1': 'isShowMsg', '3': 6, '4': 1, '5': 8, '10': 'isShowMsg'},\n    {'1': 'describe', '3': 7, '4': 1, '5': 9, '10': 'describe'},\n    {'1': 'foldType', '3': 9, '4': 1, '5': 4, '10': 'foldType'},\n    {'1': 'anchorFoldType', '3': 10, '4': 1, '5': 4, '10': 'anchorFoldType'},\n    {'1': 'priorityScore', '3': 11, '4': 1, '5': 4, '10': 'priorityScore'},\n    {'1': 'logId', '3': 12, '4': 1, '5': 9, '10': 'logId'},\n    {'1': 'msgProcessFilterK', '3': 13, '4': 1, '5': 9, '10': 'msgProcessFilterK'},\n    {'1': 'msgProcessFilterV', '3': 14, '4': 1, '5': 9, '10': 'msgProcessFilterV'},\n    {'1': 'user', '3': 15, '4': 1, '5': 11, '6': '.douyin.User', '10': 'user'},\n    {'1': 'anchorFoldTypeV2', '3': 17, '4': 1, '5': 4, '10': 'anchorFoldTypeV2'},\n    {'1': 'processAtSeiTimeMs', '3': 18, '4': 1, '5': 4, '10': 'processAtSeiTimeMs'},\n    {'1': 'randomDispatchMs', '3': 19, '4': 1, '5': 4, '10': 'randomDispatchMs'},\n    {'1': 'isDispatch', '3': 20, '4': 1, '5': 8, '10': 'isDispatch'},\n    {'1': 'channelId', '3': 21, '4': 1, '5': 4, '10': 'channelId'},\n    {'1': 'diffSei2absSecond', '3': 22, '4': 1, '5': 4, '10': 'diffSei2absSecond'},\n    {'1': 'anchorFoldDuration', '3': 23, '4': 1, '5': 4, '10': 'anchorFoldDuration'},\n  ],\n};\n\n/// Descriptor for `Common`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commonDescriptor = $convert.base64Decode(\n    'CgZDb21tb24SFgoGbWV0aG9kGAEgASgJUgZtZXRob2QSFAoFbXNnSWQYAiABKARSBW1zZ0lkEh'\n    'YKBnJvb21JZBgDIAEoBFIGcm9vbUlkEh4KCmNyZWF0ZVRpbWUYBCABKARSCmNyZWF0ZVRpbWUS'\n    'GAoHbW9uaXRvchgFIAEoDVIHbW9uaXRvchIcCglpc1Nob3dNc2cYBiABKAhSCWlzU2hvd01zZx'\n    'IaCghkZXNjcmliZRgHIAEoCVIIZGVzY3JpYmUSGgoIZm9sZFR5cGUYCSABKARSCGZvbGRUeXBl'\n    'EiYKDmFuY2hvckZvbGRUeXBlGAogASgEUg5hbmNob3JGb2xkVHlwZRIkCg1wcmlvcml0eVNjb3'\n    'JlGAsgASgEUg1wcmlvcml0eVNjb3JlEhQKBWxvZ0lkGAwgASgJUgVsb2dJZBIsChFtc2dQcm9j'\n    'ZXNzRmlsdGVySxgNIAEoCVIRbXNnUHJvY2Vzc0ZpbHRlcksSLAoRbXNnUHJvY2Vzc0ZpbHRlcl'\n    'YYDiABKAlSEW1zZ1Byb2Nlc3NGaWx0ZXJWEiAKBHVzZXIYDyABKAsyDC5kb3V5aW4uVXNlclIE'\n    'dXNlchIqChBhbmNob3JGb2xkVHlwZVYyGBEgASgEUhBhbmNob3JGb2xkVHlwZVYyEi4KEnByb2'\n    'Nlc3NBdFNlaVRpbWVNcxgSIAEoBFIScHJvY2Vzc0F0U2VpVGltZU1zEioKEHJhbmRvbURpc3Bh'\n    'dGNoTXMYEyABKARSEHJhbmRvbURpc3BhdGNoTXMSHgoKaXNEaXNwYXRjaBgUIAEoCFIKaXNEaX'\n    'NwYXRjaBIcCgljaGFubmVsSWQYFSABKARSCWNoYW5uZWxJZBIsChFkaWZmU2VpMmFic1NlY29u'\n    'ZBgWIAEoBFIRZGlmZlNlaTJhYnNTZWNvbmQSLgoSYW5jaG9yRm9sZER1cmF0aW9uGBcgASgEUh'\n    'JhbmNob3JGb2xkRHVyYXRpb24=');\n\n@$core.Deprecated('Use userDescriptor instead')\nconst User$json = {\n  '1': 'User',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 4, '10': 'id'},\n    {'1': 'shortId', '3': 2, '4': 1, '5': 4, '10': 'shortId'},\n    {'1': 'nickName', '3': 3, '4': 1, '5': 9, '10': 'nickName'},\n    {'1': 'gender', '3': 4, '4': 1, '5': 13, '10': 'gender'},\n    {'1': 'Signature', '3': 5, '4': 1, '5': 9, '10': 'Signature'},\n    {'1': 'Level', '3': 6, '4': 1, '5': 13, '10': 'Level'},\n    {'1': 'Birthday', '3': 7, '4': 1, '5': 4, '10': 'Birthday'},\n    {'1': 'Telephone', '3': 8, '4': 1, '5': 9, '10': 'Telephone'},\n    {'1': 'AvatarThumb', '3': 9, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'AvatarThumb'},\n    {'1': 'AvatarMedium', '3': 10, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'AvatarMedium'},\n    {'1': 'AvatarLarge', '3': 11, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'AvatarLarge'},\n    {'1': 'Verified', '3': 12, '4': 1, '5': 8, '10': 'Verified'},\n    {'1': 'Experience', '3': 13, '4': 1, '5': 13, '10': 'Experience'},\n    {'1': 'city', '3': 14, '4': 1, '5': 9, '10': 'city'},\n    {'1': 'Status', '3': 15, '4': 1, '5': 5, '10': 'Status'},\n    {'1': 'CreateTime', '3': 16, '4': 1, '5': 4, '10': 'CreateTime'},\n    {'1': 'ModifyTime', '3': 17, '4': 1, '5': 4, '10': 'ModifyTime'},\n    {'1': 'Secret', '3': 18, '4': 1, '5': 13, '10': 'Secret'},\n    {'1': 'ShareQrcodeUri', '3': 19, '4': 1, '5': 9, '10': 'ShareQrcodeUri'},\n    {'1': 'IncomeSharePercent', '3': 20, '4': 1, '5': 13, '10': 'IncomeSharePercent'},\n    {'1': 'BadgeImageList', '3': 21, '4': 3, '5': 11, '6': '.douyin.Image', '10': 'BadgeImageList'},\n    {'1': 'FollowInfo', '3': 22, '4': 1, '5': 11, '6': '.douyin.FollowInfo', '10': 'FollowInfo'},\n    {'1': 'SpecialId', '3': 26, '4': 1, '5': 9, '10': 'SpecialId'},\n    {'1': 'AvatarBorder', '3': 27, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'AvatarBorder'},\n    {'1': 'Medal', '3': 28, '4': 1, '5': 11, '6': '.douyin.Image', '10': 'Medal'},\n    {'1': 'RealTimeIconsList', '3': 29, '4': 3, '5': 11, '6': '.douyin.Image', '10': 'RealTimeIconsList'},\n    {'1': 'displayId', '3': 38, '4': 1, '5': 9, '10': 'displayId'},\n    {'1': 'secUid', '3': 46, '4': 1, '5': 9, '10': 'secUid'},\n    {'1': 'fanTicketCount', '3': 1022, '4': 1, '5': 4, '10': 'fanTicketCount'},\n    {'1': 'idStr', '3': 1028, '4': 1, '5': 9, '10': 'idStr'},\n    {'1': 'ageRange', '3': 1045, '4': 1, '5': 13, '10': 'ageRange'},\n  ],\n};\n\n/// Descriptor for `User`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userDescriptor = $convert.base64Decode(\n    'CgRVc2VyEg4KAmlkGAEgASgEUgJpZBIYCgdzaG9ydElkGAIgASgEUgdzaG9ydElkEhoKCG5pY2'\n    'tOYW1lGAMgASgJUghuaWNrTmFtZRIWCgZnZW5kZXIYBCABKA1SBmdlbmRlchIcCglTaWduYXR1'\n    'cmUYBSABKAlSCVNpZ25hdHVyZRIUCgVMZXZlbBgGIAEoDVIFTGV2ZWwSGgoIQmlydGhkYXkYBy'\n    'ABKARSCEJpcnRoZGF5EhwKCVRlbGVwaG9uZRgIIAEoCVIJVGVsZXBob25lEi8KC0F2YXRhclRo'\n    'dW1iGAkgASgLMg0uZG91eWluLkltYWdlUgtBdmF0YXJUaHVtYhIxCgxBdmF0YXJNZWRpdW0YCi'\n    'ABKAsyDS5kb3V5aW4uSW1hZ2VSDEF2YXRhck1lZGl1bRIvCgtBdmF0YXJMYXJnZRgLIAEoCzIN'\n    'LmRvdXlpbi5JbWFnZVILQXZhdGFyTGFyZ2USGgoIVmVyaWZpZWQYDCABKAhSCFZlcmlmaWVkEh'\n    '4KCkV4cGVyaWVuY2UYDSABKA1SCkV4cGVyaWVuY2USEgoEY2l0eRgOIAEoCVIEY2l0eRIWCgZT'\n    'dGF0dXMYDyABKAVSBlN0YXR1cxIeCgpDcmVhdGVUaW1lGBAgASgEUgpDcmVhdGVUaW1lEh4KCk'\n    '1vZGlmeVRpbWUYESABKARSCk1vZGlmeVRpbWUSFgoGU2VjcmV0GBIgASgNUgZTZWNyZXQSJgoO'\n    'U2hhcmVRcmNvZGVVcmkYEyABKAlSDlNoYXJlUXJjb2RlVXJpEi4KEkluY29tZVNoYXJlUGVyY2'\n    'VudBgUIAEoDVISSW5jb21lU2hhcmVQZXJjZW50EjUKDkJhZGdlSW1hZ2VMaXN0GBUgAygLMg0u'\n    'ZG91eWluLkltYWdlUg5CYWRnZUltYWdlTGlzdBIyCgpGb2xsb3dJbmZvGBYgASgLMhIuZG91eW'\n    'luLkZvbGxvd0luZm9SCkZvbGxvd0luZm8SHAoJU3BlY2lhbElkGBogASgJUglTcGVjaWFsSWQS'\n    'MQoMQXZhdGFyQm9yZGVyGBsgASgLMg0uZG91eWluLkltYWdlUgxBdmF0YXJCb3JkZXISIwoFTW'\n    'VkYWwYHCABKAsyDS5kb3V5aW4uSW1hZ2VSBU1lZGFsEjsKEVJlYWxUaW1lSWNvbnNMaXN0GB0g'\n    'AygLMg0uZG91eWluLkltYWdlUhFSZWFsVGltZUljb25zTGlzdBIcCglkaXNwbGF5SWQYJiABKA'\n    'lSCWRpc3BsYXlJZBIWCgZzZWNVaWQYLiABKAlSBnNlY1VpZBInCg5mYW5UaWNrZXRDb3VudBj+'\n    'ByABKARSDmZhblRpY2tldENvdW50EhUKBWlkU3RyGIQIIAEoCVIFaWRTdHISGwoIYWdlUmFuZ2'\n    'UYlQggASgNUghhZ2VSYW5nZQ==');\n\n@$core.Deprecated('Use followInfoDescriptor instead')\nconst FollowInfo$json = {\n  '1': 'FollowInfo',\n  '2': [\n    {'1': 'followingCount', '3': 1, '4': 1, '5': 4, '10': 'followingCount'},\n    {'1': 'followerCount', '3': 2, '4': 1, '5': 4, '10': 'followerCount'},\n    {'1': 'followStatus', '3': 3, '4': 1, '5': 4, '10': 'followStatus'},\n    {'1': 'pushStatus', '3': 4, '4': 1, '5': 4, '10': 'pushStatus'},\n    {'1': 'remarkName', '3': 5, '4': 1, '5': 9, '10': 'remarkName'},\n    {'1': 'followerCountStr', '3': 6, '4': 1, '5': 9, '10': 'followerCountStr'},\n    {'1': 'followingCountStr', '3': 7, '4': 1, '5': 9, '10': 'followingCountStr'},\n  ],\n};\n\n/// Descriptor for `FollowInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followInfoDescriptor = $convert.base64Decode(\n    'CgpGb2xsb3dJbmZvEiYKDmZvbGxvd2luZ0NvdW50GAEgASgEUg5mb2xsb3dpbmdDb3VudBIkCg'\n    '1mb2xsb3dlckNvdW50GAIgASgEUg1mb2xsb3dlckNvdW50EiIKDGZvbGxvd1N0YXR1cxgDIAEo'\n    'BFIMZm9sbG93U3RhdHVzEh4KCnB1c2hTdGF0dXMYBCABKARSCnB1c2hTdGF0dXMSHgoKcmVtYX'\n    'JrTmFtZRgFIAEoCVIKcmVtYXJrTmFtZRIqChBmb2xsb3dlckNvdW50U3RyGAYgASgJUhBmb2xs'\n    'b3dlckNvdW50U3RyEiwKEWZvbGxvd2luZ0NvdW50U3RyGAcgASgJUhFmb2xsb3dpbmdDb3VudF'\n    'N0cg==');\n\n@$core.Deprecated('Use imageDescriptor instead')\nconst Image$json = {\n  '1': 'Image',\n  '2': [\n    {'1': 'urlListList', '3': 1, '4': 3, '5': 9, '10': 'urlListList'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'height', '3': 3, '4': 1, '5': 4, '10': 'height'},\n    {'1': 'width', '3': 4, '4': 1, '5': 4, '10': 'width'},\n    {'1': 'avgColor', '3': 5, '4': 1, '5': 9, '10': 'avgColor'},\n    {'1': 'imageType', '3': 6, '4': 1, '5': 13, '10': 'imageType'},\n    {'1': 'openWebUrl', '3': 7, '4': 1, '5': 9, '10': 'openWebUrl'},\n    {'1': 'content', '3': 8, '4': 1, '5': 11, '6': '.douyin.ImageContent', '10': 'content'},\n    {'1': 'isAnimated', '3': 9, '4': 1, '5': 8, '10': 'isAnimated'},\n    {'1': 'FlexSettingList', '3': 10, '4': 1, '5': 11, '6': '.douyin.NinePatchSetting', '10': 'FlexSettingList'},\n    {'1': 'TextSettingList', '3': 11, '4': 1, '5': 11, '6': '.douyin.NinePatchSetting', '10': 'TextSettingList'},\n  ],\n};\n\n/// Descriptor for `Image`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageDescriptor = $convert.base64Decode(\n    'CgVJbWFnZRIgCgt1cmxMaXN0TGlzdBgBIAMoCVILdXJsTGlzdExpc3QSEAoDdXJpGAIgASgJUg'\n    'N1cmkSFgoGaGVpZ2h0GAMgASgEUgZoZWlnaHQSFAoFd2lkdGgYBCABKARSBXdpZHRoEhoKCGF2'\n    'Z0NvbG9yGAUgASgJUghhdmdDb2xvchIcCglpbWFnZVR5cGUYBiABKA1SCWltYWdlVHlwZRIeCg'\n    'pvcGVuV2ViVXJsGAcgASgJUgpvcGVuV2ViVXJsEi4KB2NvbnRlbnQYCCABKAsyFC5kb3V5aW4u'\n    'SW1hZ2VDb250ZW50Ugdjb250ZW50Eh4KCmlzQW5pbWF0ZWQYCSABKAhSCmlzQW5pbWF0ZWQSQg'\n    'oPRmxleFNldHRpbmdMaXN0GAogASgLMhguZG91eWluLk5pbmVQYXRjaFNldHRpbmdSD0ZsZXhT'\n    'ZXR0aW5nTGlzdBJCCg9UZXh0U2V0dGluZ0xpc3QYCyABKAsyGC5kb3V5aW4uTmluZVBhdGNoU2'\n    'V0dGluZ1IPVGV4dFNldHRpbmdMaXN0');\n\n@$core.Deprecated('Use ninePatchSettingDescriptor instead')\nconst NinePatchSetting$json = {\n  '1': 'NinePatchSetting',\n  '2': [\n    {'1': 'settingListList', '3': 1, '4': 3, '5': 9, '10': 'settingListList'},\n  ],\n};\n\n/// Descriptor for `NinePatchSetting`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ninePatchSettingDescriptor = $convert.base64Decode(\n    'ChBOaW5lUGF0Y2hTZXR0aW5nEigKD3NldHRpbmdMaXN0TGlzdBgBIAMoCVIPc2V0dGluZ0xpc3'\n    'RMaXN0');\n\n@$core.Deprecated('Use imageContentDescriptor instead')\nconst ImageContent$json = {\n  '1': 'ImageContent',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'fontColor', '3': 2, '4': 1, '5': 9, '10': 'fontColor'},\n    {'1': 'level', '3': 3, '4': 1, '5': 4, '10': 'level'},\n    {'1': 'alternativeText', '3': 4, '4': 1, '5': 9, '10': 'alternativeText'},\n  ],\n};\n\n/// Descriptor for `ImageContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageContentDescriptor = $convert.base64Decode(\n    'CgxJbWFnZUNvbnRlbnQSEgoEbmFtZRgBIAEoCVIEbmFtZRIcCglmb250Q29sb3IYAiABKAlSCW'\n    'ZvbnRDb2xvchIUCgVsZXZlbBgDIAEoBFIFbGV2ZWwSKAoPYWx0ZXJuYXRpdmVUZXh0GAQgASgJ'\n    'Ug9hbHRlcm5hdGl2ZVRleHQ=');\n\n@$core.Deprecated('Use pushFrameDescriptor instead')\nconst PushFrame$json = {\n  '1': 'PushFrame',\n  '2': [\n    {'1': 'seqId', '3': 1, '4': 1, '5': 4, '10': 'seqId'},\n    {'1': 'logId', '3': 2, '4': 1, '5': 4, '10': 'logId'},\n    {'1': 'service', '3': 3, '4': 1, '5': 4, '10': 'service'},\n    {'1': 'method', '3': 4, '4': 1, '5': 4, '10': 'method'},\n    {'1': 'headersList', '3': 5, '4': 3, '5': 11, '6': '.douyin.HeadersList', '10': 'headersList'},\n    {'1': 'payloadEncoding', '3': 6, '4': 1, '5': 9, '10': 'payloadEncoding'},\n    {'1': 'payloadType', '3': 7, '4': 1, '5': 9, '10': 'payloadType'},\n    {'1': 'payload', '3': 8, '4': 1, '5': 12, '10': 'payload'},\n  ],\n};\n\n/// Descriptor for `PushFrame`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pushFrameDescriptor = $convert.base64Decode(\n    'CglQdXNoRnJhbWUSFAoFc2VxSWQYASABKARSBXNlcUlkEhQKBWxvZ0lkGAIgASgEUgVsb2dJZB'\n    'IYCgdzZXJ2aWNlGAMgASgEUgdzZXJ2aWNlEhYKBm1ldGhvZBgEIAEoBFIGbWV0aG9kEjUKC2hl'\n    'YWRlcnNMaXN0GAUgAygLMhMuZG91eWluLkhlYWRlcnNMaXN0UgtoZWFkZXJzTGlzdBIoCg9wYX'\n    'lsb2FkRW5jb2RpbmcYBiABKAlSD3BheWxvYWRFbmNvZGluZxIgCgtwYXlsb2FkVHlwZRgHIAEo'\n    'CVILcGF5bG9hZFR5cGUSGAoHcGF5bG9hZBgIIAEoDFIHcGF5bG9hZA==');\n\n@$core.Deprecated('Use kkDescriptor instead')\nconst kk$json = {\n  '1': 'kk',\n  '2': [\n    {'1': 'k', '3': 14, '4': 1, '5': 13, '10': 'k'},\n  ],\n};\n\n/// Descriptor for `kk`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List kkDescriptor = $convert.base64Decode(\n    'CgJraxIMCgFrGA4gASgNUgFr');\n\n@$core.Deprecated('Use sendMessageBodyDescriptor instead')\nconst SendMessageBody$json = {\n  '1': 'SendMessageBody',\n  '2': [\n    {'1': 'conversationId', '3': 1, '4': 1, '5': 9, '10': 'conversationId'},\n    {'1': 'conversationType', '3': 2, '4': 1, '5': 13, '10': 'conversationType'},\n    {'1': 'conversationShortId', '3': 3, '4': 1, '5': 4, '10': 'conversationShortId'},\n    {'1': 'content', '3': 4, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'ext', '3': 5, '4': 3, '5': 11, '6': '.douyin.ExtList', '10': 'ext'},\n    {'1': 'messageType', '3': 6, '4': 1, '5': 13, '10': 'messageType'},\n    {'1': 'ticket', '3': 7, '4': 1, '5': 9, '10': 'ticket'},\n    {'1': 'clientMessageId', '3': 8, '4': 1, '5': 9, '10': 'clientMessageId'},\n  ],\n};\n\n/// Descriptor for `SendMessageBody`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sendMessageBodyDescriptor = $convert.base64Decode(\n    'Cg9TZW5kTWVzc2FnZUJvZHkSJgoOY29udmVyc2F0aW9uSWQYASABKAlSDmNvbnZlcnNhdGlvbk'\n    'lkEioKEGNvbnZlcnNhdGlvblR5cGUYAiABKA1SEGNvbnZlcnNhdGlvblR5cGUSMAoTY29udmVy'\n    'c2F0aW9uU2hvcnRJZBgDIAEoBFITY29udmVyc2F0aW9uU2hvcnRJZBIYCgdjb250ZW50GAQgAS'\n    'gJUgdjb250ZW50EiEKA2V4dBgFIAMoCzIPLmRvdXlpbi5FeHRMaXN0UgNleHQSIAoLbWVzc2Fn'\n    'ZVR5cGUYBiABKA1SC21lc3NhZ2VUeXBlEhYKBnRpY2tldBgHIAEoCVIGdGlja2V0EigKD2NsaW'\n    'VudE1lc3NhZ2VJZBgIIAEoCVIPY2xpZW50TWVzc2FnZUlk');\n\n@$core.Deprecated('Use extListDescriptor instead')\nconst ExtList$json = {\n  '1': 'ExtList',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `ExtList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extListDescriptor = $convert.base64Decode(\n    'CgdFeHRMaXN0EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use rspDescriptor instead')\nconst Rsp$json = {\n  '1': 'Rsp',\n  '2': [\n    {'1': 'a', '3': 1, '4': 1, '5': 5, '10': 'a'},\n    {'1': 'b', '3': 2, '4': 1, '5': 5, '10': 'b'},\n    {'1': 'c', '3': 3, '4': 1, '5': 5, '10': 'c'},\n    {'1': 'd', '3': 4, '4': 1, '5': 9, '10': 'd'},\n    {'1': 'e', '3': 5, '4': 1, '5': 5, '10': 'e'},\n    {'1': 'f', '3': 6, '4': 1, '5': 11, '6': '.douyin.Rsp.F', '10': 'f'},\n    {'1': 'g', '3': 7, '4': 1, '5': 9, '10': 'g'},\n    {'1': 'h', '3': 10, '4': 1, '5': 4, '10': 'h'},\n    {'1': 'i', '3': 11, '4': 1, '5': 4, '10': 'i'},\n    {'1': 'j', '3': 13, '4': 1, '5': 4, '10': 'j'},\n  ],\n  '3': [Rsp_F$json],\n};\n\n@$core.Deprecated('Use rspDescriptor instead')\nconst Rsp_F$json = {\n  '1': 'F',\n  '2': [\n    {'1': 'q1', '3': 1, '4': 1, '5': 4, '10': 'q1'},\n    {'1': 'q3', '3': 3, '4': 1, '5': 4, '10': 'q3'},\n    {'1': 'q4', '3': 4, '4': 1, '5': 9, '10': 'q4'},\n    {'1': 'q5', '3': 5, '4': 1, '5': 4, '10': 'q5'},\n  ],\n};\n\n/// Descriptor for `Rsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspDescriptor = $convert.base64Decode(\n    'CgNSc3ASDAoBYRgBIAEoBVIBYRIMCgFiGAIgASgFUgFiEgwKAWMYAyABKAVSAWMSDAoBZBgEIA'\n    'EoCVIBZBIMCgFlGAUgASgFUgFlEhsKAWYYBiABKAsyDS5kb3V5aW4uUnNwLkZSAWYSDAoBZxgH'\n    'IAEoCVIBZxIMCgFoGAogASgEUgFoEgwKAWkYCyABKARSAWkSDAoBahgNIAEoBFIBahpDCgFGEg'\n    '4KAnExGAEgASgEUgJxMRIOCgJxMxgDIAEoBFICcTMSDgoCcTQYBCABKAlSAnE0Eg4KAnE1GAUg'\n    'ASgEUgJxNQ==');\n\n@$core.Deprecated('Use preMessageDescriptor instead')\nconst PreMessage$json = {\n  '1': 'PreMessage',\n  '2': [\n    {'1': 'cmd', '3': 1, '4': 1, '5': 13, '10': 'cmd'},\n    {'1': 'sequenceId', '3': 2, '4': 1, '5': 13, '10': 'sequenceId'},\n    {'1': 'sdkVersion', '3': 3, '4': 1, '5': 9, '10': 'sdkVersion'},\n    {'1': 'token', '3': 4, '4': 1, '5': 9, '10': 'token'},\n    {'1': 'refer', '3': 5, '4': 1, '5': 13, '10': 'refer'},\n    {'1': 'inboxType', '3': 6, '4': 1, '5': 13, '10': 'inboxType'},\n    {'1': 'buildNumber', '3': 7, '4': 1, '5': 9, '10': 'buildNumber'},\n    {'1': 'sendMessageBody', '3': 8, '4': 1, '5': 11, '6': '.douyin.SendMessageBody', '10': 'sendMessageBody'},\n    {'1': 'aa', '3': 9, '4': 1, '5': 9, '10': 'aa'},\n    {'1': 'devicePlatform', '3': 11, '4': 1, '5': 9, '10': 'devicePlatform'},\n    {'1': 'headers', '3': 15, '4': 3, '5': 11, '6': '.douyin.HeadersList', '10': 'headers'},\n    {'1': 'authType', '3': 18, '4': 1, '5': 13, '10': 'authType'},\n    {'1': 'biz', '3': 21, '4': 1, '5': 9, '10': 'biz'},\n    {'1': 'access', '3': 22, '4': 1, '5': 9, '10': 'access'},\n  ],\n};\n\n/// Descriptor for `PreMessage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List preMessageDescriptor = $convert.base64Decode(\n    'CgpQcmVNZXNzYWdlEhAKA2NtZBgBIAEoDVIDY21kEh4KCnNlcXVlbmNlSWQYAiABKA1SCnNlcX'\n    'VlbmNlSWQSHgoKc2RrVmVyc2lvbhgDIAEoCVIKc2RrVmVyc2lvbhIUCgV0b2tlbhgEIAEoCVIF'\n    'dG9rZW4SFAoFcmVmZXIYBSABKA1SBXJlZmVyEhwKCWluYm94VHlwZRgGIAEoDVIJaW5ib3hUeX'\n    'BlEiAKC2J1aWxkTnVtYmVyGAcgASgJUgtidWlsZE51bWJlchJBCg9zZW5kTWVzc2FnZUJvZHkY'\n    'CCABKAsyFy5kb3V5aW4uU2VuZE1lc3NhZ2VCb2R5Ug9zZW5kTWVzc2FnZUJvZHkSDgoCYWEYCS'\n    'ABKAlSAmFhEiYKDmRldmljZVBsYXRmb3JtGAsgASgJUg5kZXZpY2VQbGF0Zm9ybRItCgdoZWFk'\n    'ZXJzGA8gAygLMhMuZG91eWluLkhlYWRlcnNMaXN0UgdoZWFkZXJzEhoKCGF1dGhUeXBlGBIgAS'\n    'gNUghhdXRoVHlwZRIQCgNiaXoYFSABKAlSA2JpehIWCgZhY2Nlc3MYFiABKAlSBmFjY2Vzcw==');\n\n@$core.Deprecated('Use headersListDescriptor instead')\nconst HeadersList$json = {\n  '1': 'HeadersList',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `HeadersList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List headersListDescriptor = $convert.base64Decode(\n    'CgtIZWFkZXJzTGlzdBIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU=');\n\n"
  },
  {
    "path": "simple_live_core/lib/src/danmaku/proto/douyin.proto",
    "content": "syntax = \"proto3\";\n\npackage douyin;\n\n\nmessage Response {\n  repeated Message messagesList = 1;\n  string cursor = 2;\n  uint64 fetchInterval = 3;\n  uint64 now = 4;\n  string internalExt = 5;\n  uint32 fetchType = 6;\n  map<string, string> routeParams = 7;\n  uint64 heartbeatDuration = 8;\n  bool needAck = 9;\n  string pushServer = 10;\n  string liveCursor = 11;\n  bool historyNoMore = 12;\n}\n\nmessage Message{\n    string method = 1;\n    bytes payload = 2;\n    int64 msgId = 3;\n    int32 msgType = 4;\n    int64 offset = 5;\n    bool needWrdsStore = 6;\n    int64 wrdsVersion = 7;\n    string wrdsSubKey = 8;\n}\n\n// 聊天\nmessage ChatMessage {\n  Common common = 1;\n  User user = 2;\n  string content = 3;\n  bool visibleToSender = 4;\n  Image backgroundImage = 5;\n  string fullScreenTextColor = 6;\n  Image backgroundImageV2 = 7;\n  PublicAreaCommon publicAreaCommon = 8;\n  Image giftImage = 9;\n  uint64 agreeMsgId = 11;\n  uint32 priorityLevel = 12;\n  LandscapeAreaCommon landscapeAreaCommon = 13;\n  uint64 eventTime = 15;\n  bool sendReview = 16;\n  bool fromIntercom = 17;\n  bool intercomHideUserCard = 18;\n//  repeated chatTagsList = 19;\n  string chatBy  = 20;\n  uint32 individualChatPriority = 21;\n  Text rtfContent = 22;\n}\n\n\nmessage LandscapeAreaCommon {\n  bool showHead = 1;\n  bool showNickname = 2;\n  bool showFontColor = 3;\n  repeated string colorValueList = 4;\n  repeated CommentTypeTag commentTypeTagsList = 5;\n}\n\nmessage RoomUserSeqMessage {\n  Common common = 1;\n  repeated RoomUserSeqMessageContributor ranksList = 2;\n  int64 total = 3;\n  string popStr = 4;\n  repeated RoomUserSeqMessageContributor seatsList = 5;\n  int64 popularity = 6;\n  int64 totalUser = 7;\n  string totalUserStr = 8;\n  string totalStr = 9;\n  string onlineUserForAnchor = 10;\n  string totalPvForAnchor = 11;\n  string upRightStatsStr = 12;\n  string upRightStatsStrComplete = 13;\n\n}\n\nmessage CommonTextMessage {\n  Common common = 1;\n  User user = 2;\n  string scene = 3;\n}\n\nmessage UpdateFanTicketMessage {\n  Common common = 1;\n  string roomFanTicketCountText = 2;\n  uint64 roomFanTicketCount = 3;\n  bool forceUpdate = 4;\n}\n\nmessage RoomUserSeqMessageContributor {\n  uint64 score = 1;\n  User user = 2;\n  uint64 rank  = 3;\n  uint64 delta  = 4;\n  bool isHidden = 5;\n  string scoreDescription = 6;\n  string exactlyScore = 7;\n}\n\n// 礼物消息\nmessage GiftMessage {\n  Common common = 1;\n  uint64 giftId = 2;\n  uint64 fanTicketCount = 3;\n  uint64 groupCount = 4;\n  uint64 repeatCount = 5;\n  uint64 comboCount = 6;\n  User user = 7;\n  User toUser = 8;\n  uint32 repeatEnd = 9;\n  TextEffect textEffect = 10;\n  uint64 groupId = 11;\n  uint64 incomeTaskgifts = 12;\n  uint64 roomFanTicketCount = 13;\n  GiftIMPriority priority = 14;\n  GiftStruct gift = 15;\n  string logId = 16;\n  uint64 sendType = 17;\n  PublicAreaCommon publicAreaCommon = 18;\n  Text trayDisplayText = 19;\n  uint64 bannedDisplayEffects = 20;\n//  GiftTrayInfo trayInfo = 21;\n//  AssetEffectMixInfo assetEffectMixInfo = 22;\n  bool displayForSelf = 25;\n  string interactGiftInfo = 26;\n  string diyItemInfo = 27;\n  repeated uint64 minAssetSetList = 28;\n  uint64 totalCount = 29;\n  uint32 clientGiftSource = 30;\n//  AnchorGiftData anchorGift = 31;\n  repeated uint64 toUserIdsList = 32;\n  uint64 sendTime = 33;\n  uint64 forceDisplayEffects = 34;\n  string traceId = 35;\n  uint64 effectDisplayTs = 36;\n}\n\nmessage GiftStruct {\n  Image image = 1;\n  string describe = 2;\n  bool notify = 3;\n  uint64 duration = 4;\n  uint64 id = 5;\n//  GiftStructFansClubInfo fansclubInfo = 6;\n  bool forLinkmic = 7;\n  bool doodle = 8;\n  bool forFansclub = 9;\n  bool combo = 10;\n  uint32 type = 11;\n  uint32 diamondCount = 12;\n  bool isDisplayedOnPanel = 13;\n  uint64 primaryEffectId = 14;\n  Image giftLabelIcon = 15;\n  string name = 16;\n  string region = 17;\n  string manual = 18;\n  bool forCustom = 19;\n  //  specialEffectsMap = 20;\n  Image icon = 21;\n  uint32 actionType = 22;\n  // fixme 后面的就不写了还有几十个属性\n\n}\n\nmessage GiftIMPriority {\n    repeated uint64 queueSizesList = 1;\n    uint64 selfQueuePriority = 2;\n    uint64 priority = 3;\n}\n\nmessage TextEffect {\n  TextEffectDetail portrait = 1;\n  TextEffectDetail landscape = 2;\n}\n\nmessage TextEffectDetail {\n  Text text = 1;\n  uint32 textFontSize = 2;\n  Image background = 3;\n  uint32 start = 4;\n  uint32 duration = 5;\n  uint32 x = 6;\n  uint32 y = 7;\n  uint32 width = 8;\n  uint32 height = 9;\n  uint32 shadowDx = 10;\n  uint32 shadowDy = 11;\n  uint32 shadowRadius = 12;\n  string shadowColor = 13;\n  string strokeColor = 14;\n  uint32 strokeWidth = 15;\n}\n\n// 成员消息\nmessage MemberMessage {\n  Common common = 1;\n  User user = 2;\n  uint64 memberCount = 3;\n  User operator = 4;\n  bool isSetToAdmin = 5;\n  bool isTopUser = 6;\n  uint64 rankScore = 7;\n  uint64 topUserNo = 8;\n  uint64 enterType = 9;\n  uint64 action = 10;\n  string actionDescription = 11;\n  uint64 userId = 12;\n  EffectConfig effectConfig = 13;\n  string popStr = 14;\n  EffectConfig enterEffectConfig = 15;\n  Image backgroundImage = 16;\n  Image backgroundImageV2 = 17;\n  Text anchorDisplayText = 18;\n  PublicAreaCommon publicAreaCommon = 19;\n  uint64 userEnterTipType = 20;\n  uint64 anchorEnterTipType = 21;\n}\n\n\nmessage PublicAreaCommon {\n  Image userLabel = 1;\n  uint64 userConsumeInRoom = 2;\n  uint64 userSendGiftCntInRoom = 3;\n}\n\nmessage EffectConfig {\n  uint64 type = 1;\n  Image icon = 2;\n  uint64 avatarPos = 3;\n  Text text = 4;\n  Image textIcon = 5;\n  uint32 stayTime = 6;\n  uint64 animAssetId = 7;\n  Image badge = 8;\n  repeated uint64 flexSettingArrayList = 9;\n  Image textIconOverlay = 10;\n  Image animatedBadge = 11;\n  bool hasSweepLight = 12;\n  repeated uint64 textFlexSettingArrayList = 13;\n  uint64 centerAnimAssetId = 14;\n  Image dynamicImage = 15;\n  map<string,string> extraMap = 16;\n  uint64 mp4AnimAssetId = 17;\n  uint64 priority = 18;\n  uint64 maxWaitTime = 19;\n  string dressId = 20;\n  uint64 alignment = 21;\n  uint64 alignmentOffset = 22;\n}\n\nmessage Text {\n  string key = 1;\n  string defaultPatter = 2;\n  TextFormat defaultFormat = 3;\n  repeated TextPiece piecesList = 4;\n}\n\nmessage TextPiece {\n  bool type = 1;\n  TextFormat format = 2;\n  string stringValue = 3;\n  TextPieceUser userValue = 4;\n  TextPieceGift giftValue = 5;\n  TextPieceHeart heartValue = 6;\n  TextPiecePatternRef patternRefValue = 7;\n  TextPieceImage imageValue = 8;\n}\n\n\nmessage TextPieceImage {\n  Image image = 1;\n  float scalingRate = 2;\n}\n\nmessage TextPiecePatternRef {\n  string key = 1;\n  string defaultPattern = 2;\n}\n\nmessage TextPieceHeart {\n  string color = 1;\n}\n\nmessage TextPieceGift {\n  uint64 giftId = 1;\n  PatternRef nameRef = 2;\n}\n\nmessage PatternRef {\n  string key = 1;\n  string defaultPattern = 2;\n}\n\nmessage TextPieceUser {\n  User user = 1;\n  bool withColon = 2;\n}\n\nmessage TextFormat {\n  string color = 1;\n  bool bold = 2;\n  bool italic = 3;\n  uint32 weight = 4;\n  uint32 italicAngle = 5;\n  uint32 fontSize = 6;\n  bool useHeighLightColor = 7;\n  bool useRemoteClor = 8;\n}\n\n// 点赞\nmessage LikeMessage {\n  Common common = 1;\n  uint64 count = 2;\n  uint64 total = 3;\n  uint64 color = 4;\n  User user = 5;\n  string icon = 6;\n  DoubleLikeDetail doubleLikeDetail = 7;\n  DisplayControlInfo displayControlInfo = 8;\n  uint64 linkmicGuestUid = 9;\n  string scene = 10;\n  PicoDisplayInfo picoDisplayInfo = 11;\n\n}\n\nmessage SocialMessage {\n  Common common = 1;\n  User user = 2;\n  uint64 shareType = 3;\n  uint64 action = 4;\n  string shareTarget = 5;\n  uint64 followCount = 6;\n  PublicAreaCommon publicAreaCommon = 7;\n}\n\nmessage PicoDisplayInfo {\n  uint64 comboSumCount = 1;\n  string emoji = 2;\n  Image emojiIcon = 3;\n  string emojiText = 4;\n}\n\nmessage DoubleLikeDetail {\n  bool doubleFlag = 1;\n  uint32 seqId = 2;\n  uint32 renewalsNum = 3;\n  uint32 triggersNum = 4;\n}\n\nmessage DisplayControlInfo {\n  bool showText = 1;\n  bool showIcons = 2;\n}\n\nmessage EpisodeChatMessage {\n   Message common = 1;\n   User user = 2;\n   string content = 3;\n   bool visibleToSende = 4;\n//   BackgroundImage backgroundImage = 5;\n//   PublicAreaCommon publicAreaCommon = 6;\n   Image giftImage = 7;\n   uint64 agreeMsgId = 8;\n   repeated string colorValueList = 9;\n}\n\n\nmessage MatchAgainstScoreMessage {\n  Common common = 1;\n  Against against = 2;\n  uint32 matchStatus = 3;\n  uint32 displayStatus = 4;\n}\n\nmessage Against {\n  string leftName = 1;\n  Image leftLogo = 2;\n  string leftGoal = 3;\n//  LeftPlayersList leftPlayersList = 4;\n//  LeftGoalStageDetail leftGoalStageDetail = 5;\n  string rightName = 6;\n  Image rightLogo = 7;\n  string rightGoal = 8;\n//  RightPlayersList rightPlayersList  = 9;\n//  RightGoalStageDetail rightGoalStageDetail = 10;\n  uint64 timestamp = 11;\n  uint64 version = 12;\n  uint64 leftTeamId = 13;\n  uint64 rightTeamId = 14;\n  uint64 diffSei2absSecond = 15;\n  uint32 finalGoalStage = 16;\n  uint32 currentGoalStage  =17;\n  uint32 leftScoreAddition  =18;\n  uint32 rightScoreAddition  =19;\n  uint64 leftGoalInt = 20;\n  uint64 rightGoalInt = 21;\n}\n\nmessage Common {\n  string method = 1;\n  uint64 msgId = 2;\n  uint64 roomId = 3;\n  uint64 createTime = 4;\n  uint32 monitor = 5;\n  bool isShowMsg = 6;\n  string describe = 7;\n//  DisplayText displayText = 8;\n  uint64 foldType = 9;\n  uint64 anchorFoldType = 10;\n  uint64 priorityScore = 11;\n  string logId = 12;\n  string msgProcessFilterK = 13;\n  string msgProcessFilterV = 14;\n  User user = 15;\n//  Room room = 16;\n  uint64 anchorFoldTypeV2  = 17;\n  uint64 processAtSeiTimeMs  = 18;\n  uint64 randomDispatchMs  = 19;\n  bool isDispatch = 20;\n  uint64 channelId = 21;\n  uint64 diffSei2absSecond = 22;\n  uint64 anchorFoldDuration = 23;\n}\n\nmessage User {\n  uint64 id = 1;\n  uint64 shortId = 2;\n  string nickName = 3;\n  uint32 gender = 4;\n  string Signature = 5;\n  uint32 Level = 6;\n  uint64 Birthday = 7;\n  string Telephone = 8;\n  Image AvatarThumb = 9;\n  Image AvatarMedium = 10;\n  Image AvatarLarge = 11;\n  bool Verified = 12;\n  uint32 Experience = 13;\n  string city = 14;\n  int32 Status = 15;\n  uint64 CreateTime = 16;\n  uint64 ModifyTime = 17;\n  uint32 Secret = 18;\n  string ShareQrcodeUri = 19;\n  uint32 IncomeSharePercent = 20;\n  repeated Image BadgeImageList = 21;\n  FollowInfo FollowInfo = 22;\n//  PayGrade PayGrade = 23;\n//  FansClub FansClub = 24;\n//  Border Border = 25;\n  string SpecialId = 26;\n  Image AvatarBorder = 27;\n  Image Medal = 28;\n  repeated Image RealTimeIconsList = 29;\n  string displayId = 38;\n  string secUid = 46;\n  uint64 fanTicketCount = 1022;\n  string idStr = 1028;\n  uint32 ageRange = 1045;\n}\n\nmessage FollowInfo {\n  uint64 followingCount = 1;\n  uint64 followerCount = 2;\n  uint64 followStatus = 3;\n  uint64 pushStatus = 4;\n  string remarkName = 5;\n  string followerCountStr = 6;\n  string followingCountStr = 7;\n\n}\nmessage Image {\n  repeated string urlListList = 1;\n  string uri = 2;\n  uint64 height = 3;\n  uint64 width = 4;\n  string avgColor = 5;\n  uint32 imageType = 6;\n  string openWebUrl = 7;\n  ImageContent content = 8;\n  bool isAnimated = 9;\n  NinePatchSetting FlexSettingList = 10;\n  NinePatchSetting TextSettingList = 11;\n}\n\nmessage NinePatchSetting {\n  repeated string settingListList = 1;\n}\n\nmessage ImageContent {\n  string name = 1;\n  string fontColor = 2;\n  uint64 level = 3;\n  string alternativeText = 4;\n}\n\nmessage PushFrame {\n  uint64 seqId = 1;\n  uint64 logId = 2;\n  uint64 service = 3;\n  uint64 method = 4;\n  repeated HeadersList headersList = 5;\n  string payloadEncoding = 6;\n  string payloadType = 7;\n  bytes payload = 8;\n\n}\n\nmessage kk {\n  uint32 k=14;\n}\n\nmessage SendMessageBody {\n  string conversationId = 1;\n  uint32 conversationType = 2;\n  uint64 conversationShortId = 3;\n  string content = 4;\n  repeated ExtList ext = 5;\n  uint32 messageType = 6;\n  string ticket = 7;\n  string clientMessageId = 8;\n\n}\n\nmessage ExtList {\n  string key = 1;\n  string value = 2;\n}\n\nmessage Rsp{\n  int32 a = 1;\n  int32 b = 2;\n  int32 c = 3;\n  string d = 4;\n  int32 e = 5;\n  message F {\n    uint64 q1 = 1;\n    uint64 q3 = 3;\n    string q4 = 4;\n    uint64 q5 = 5;\n  }\n  F f = 6;\n  string g = 7;\n  uint64 h = 10;\n  uint64 i = 11;\n  uint64 j = 13;\n}\n\nmessage PreMessage {\n  uint32 cmd = 1;\n  uint32 sequenceId = 2;\n  string sdkVersion = 3;\n  string token = 4;\n  uint32 refer = 5;\n  uint32 inboxType = 6;\n  string buildNumber = 7;\n  SendMessageBody sendMessageBody = 8;\n  // 字段名待定\n  string aa = 9;\n  string devicePlatform = 11;\n  repeated HeadersList headers = 15;\n  uint32 authType = 18;\n  string biz = 21;\n  string access = 22;\n}\n\nmessage HeadersList {\n  string key = 1;\n  string value = 2;\n}\n\nenum CommentTypeTag {\n  COMMENTTYPETAGUNKNOWN = 0;\n  COMMENTTYPETAGSTAR = 1;\n}"
  },
  {
    "path": "simple_live_core/lib/src/douyin_site.dart",
    "content": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/convert_helper.dart';\nimport 'package:simple_live_core/src/common/http_client.dart';\nimport 'package:simple_live_core/src/scripts/douyin_sign.dart';\n\nclass DouyinSite implements LiveSite {\n  @override\n  String id = \"douyin\";\n\n  @override\n  String name = \"抖音直播\";\n\n  @override\n  LiveDanmaku getDanmaku() => DouyinDanmaku();\n\n  /// 使用 QQBrowser User-Agent（参考 DouyinLiveRecorder）\n  static const String kDefaultUserAgent =\n      \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.567.400 QQBrowser/19.7.6764.400\";\n\n  static const String kDefaultReferer = \"https://live.douyin.com\";\n\n  static const String kDefaultAuthority = \"live.douyin.com\";\n\n  /// 默认 Cookie - 只需要 ttwid 字段即可获取所有画质（包括蓝光）\n  /// 经过测试验证，LOGIN_STATUS=1 等其他字段都是可选的\n  static const String kDefaultCookie =\n      \"ttwid=1%7CB1qls3GdnZhUov9o2NxOMxxYS2ff6OSvEWbv0ytbES4%7C1680522049%7C280d802d6d478e3e78d0c807f7c487e7ffec0ae4e5fdd6a0fe74c3c6af149511\";\n\n  /// 用户设置的 cookie\n  String cookie = \"\";\n\n  void _logDebug(String msg) {\n    // 同时使用 print 和 CoreLog 确保日志输出\n    print(\"[Douyin] $msg\");\n    CoreLog.d(\"[Douyin] $msg\");\n  }\n\n  Map<String, dynamic> headers = {\n    \"Authority\": kDefaultAuthority,\n    \"Referer\": kDefaultReferer,\n    \"User-Agent\": kDefaultUserAgent,\n  };\n\n  Future<Map<String, dynamic>> getRequestHeaders() async {\n    try {\n      // 如果用户已设置 cookie，直接使用用户的 cookie\n      if (cookie.isNotEmpty) {\n        headers[\"cookie\"] = cookie;\n        return headers;\n      }\n\n      // 使用默认的 ttwid cookie（只需要 ttwid 即可获取所有画质）\n      headers[\"cookie\"] = kDefaultCookie;\n      return headers;\n    } catch (e) {\n      CoreLog.error(e);\n      if (!(headers[\"cookie\"]?.toString().isNotEmpty ?? false)) {\n        headers[\"cookie\"] = kDefaultCookie;\n      }\n      return headers;\n    }\n  }\n\n  @override\n  Future<List<LiveCategory>> getCategores() async {\n    List<LiveCategory> categories = [];\n    var result = await HttpClient.instance.getText(\n      \"https://live.douyin.com/\",\n      queryParameters: {},\n      header: await getRequestHeaders(),\n    );\n\n    var renderData =\n        RegExp(\n          r'\\{\\\\\"pathname\\\\\":\\\\\"\\/\\\\\",\\\\\"categoryData.*?\\]\\\\n',\n        ).firstMatch(result)?.group(0) ??\n        \"\";\n    var renderDataJson = json.decode(\n      renderData\n          .trim()\n          .replaceAll('\\\\\"', '\"')\n          .replaceAll(r\"\\\\\", r\"\\\")\n          .replaceAll(']\\\\n', \"\"),\n    );\n\n    for (var item in renderDataJson[\"categoryData\"]) {\n      List<LiveSubCategory> subs = [];\n      var id = '${item[\"partition\"][\"id_str\"]},${item[\"partition\"][\"type\"]}';\n      for (var subItem in item[\"sub_partition\"]) {\n        var subCategory = LiveSubCategory(\n          id: '${subItem[\"partition\"][\"id_str\"]},${subItem[\"partition\"][\"type\"]}',\n          name: asT<String?>(subItem[\"partition\"][\"title\"]) ?? \"\",\n          parentId: id,\n          pic: \"\",\n        );\n        subs.add(subCategory);\n      }\n\n      var category = LiveCategory(\n        children: subs,\n        id: id,\n        name: asT<String?>(item[\"partition\"][\"title\"]) ?? \"\",\n      );\n      subs.insert(\n        0,\n        LiveSubCategory(\n          id: category.id,\n          name: category.name,\n          parentId: category.id,\n          pic: \"\",\n        ),\n      );\n      categories.add(category);\n    }\n    return categories;\n  }\n\n  @override\n  Future<LiveCategoryResult> getCategoryRooms(\n    LiveSubCategory category, {\n    int page = 1,\n  }) async {\n    var ids = category.id.split(',');\n    var partitionId = ids[0];\n    var partitionType = ids[1];\n\n    String serverUrl =\n        \"https://live.douyin.com/webcast/web/partition/detail/room/v2/\";\n    var uri = Uri.parse(serverUrl).replace(\n      scheme: \"https\",\n      port: 443,\n      queryParameters: {\n        \"aid\": '6383',\n        \"app_name\": \"douyin_web\",\n        \"live_id\": '1',\n        \"device_platform\": \"web\",\n        \"language\": \"zh-CN\",\n        \"enter_from\": \"link_share\",\n        \"cookie_enabled\": \"true\",\n        \"screen_width\": \"1980\",\n        \"screen_height\": \"1080\",\n        \"browser_language\": \"zh-CN\",\n        \"browser_platform\": \"Win32\",\n        \"browser_name\": \"Edge\",\n        \"browser_version\": \"125.0.0.0\",\n        \"browser_online\": \"true\",\n        \"count\": '15',\n        \"offset\": ((page - 1) * 15).toString(),\n        \"partition\": partitionId,\n        \"partition_type\": partitionType,\n        \"req_from\": '2',\n      },\n    );\n    var requestUrl = DouyinSign.getAbogusUrl(uri.toString(), kDefaultUserAgent);\n\n    var result = await HttpClient.instance.getJson(\n      requestUrl,\n      header: await getRequestHeaders(),\n    );\n\n    var hasMore = (result[\"data\"][\"data\"] as List).length >= 15;\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"data\"]) {\n      var roomItem = LiveRoomItem(\n        roomId: item[\"web_rid\"],\n        title: item[\"room\"][\"title\"].toString(),\n        cover: item[\"room\"][\"cover\"][\"url_list\"][0].toString(),\n        userName: item[\"room\"][\"owner\"][\"nickname\"].toString(),\n        online:\n            int.tryParse(\n              item[\"room\"][\"room_view_stats\"][\"display_value\"].toString(),\n            ) ??\n            0,\n      );\n      items.add(roomItem);\n    }\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveCategoryResult> getRecommendRooms({int page = 1}) async {\n    String serverUrl =\n        \"https://live.douyin.com/webcast/web/partition/detail/room/v2/\";\n    var uri = Uri.parse(serverUrl).replace(\n      scheme: \"https\",\n      port: 443,\n      queryParameters: {\n        \"aid\": '6383',\n        \"app_name\": \"douyin_web\",\n        \"live_id\": '1',\n        \"device_platform\": \"web\",\n        \"language\": \"zh-CN\",\n        \"enter_from\": \"link_share\",\n        \"cookie_enabled\": \"true\",\n        \"screen_width\": \"1980\",\n        \"screen_height\": \"1080\",\n        \"browser_language\": \"zh-CN\",\n        \"browser_platform\": \"Win32\",\n        \"browser_name\": \"Edge\",\n        \"browser_version\": \"125.0.0.0\",\n        \"browser_online\": \"true\",\n        \"count\": '15',\n        \"offset\": ((page - 1) * 15).toString(),\n        \"partition\": '720',\n        \"partition_type\": '1',\n        \"req_from\": '2',\n      },\n    );\n    var requestUrl = DouyinSign.getAbogusUrl(uri.toString(), kDefaultUserAgent);\n\n    var result = await HttpClient.instance.getJson(\n      requestUrl,\n      header: await getRequestHeaders(),\n    );\n\n    var hasMore = (result[\"data\"][\"data\"] as List).length >= 15;\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"data\"]) {\n      var roomItem = LiveRoomItem(\n        roomId: item[\"web_rid\"],\n        title: item[\"room\"][\"title\"].toString(),\n        cover: item[\"room\"][\"cover\"][\"url_list\"][0].toString(),\n        userName: item[\"room\"][\"owner\"][\"nickname\"].toString(),\n        online:\n            int.tryParse(\n              item[\"room\"][\"room_view_stats\"][\"display_value\"].toString(),\n            ) ??\n            0,\n      );\n      items.add(roomItem);\n    }\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveRoomDetail> getRoomDetail({required String roomId}) async {\n    // 有两种roomId，一种是webRid，一种是roomId\n    // roomId是一次性的，用户每次重新开播都会生成一个新的roomId\n    // roomId一般长度为19位，例如：7376429659866598196\n    // webRid是固定的，用户每次开播都是同一个webRid\n    // webRid一般长度为11-12位，例如：416144012050\n    // 这里简单进行判断，如果roomId长度小于15，则认为是webRid\n    if (roomId.length <= 16) {\n      var webRid = roomId;\n      return await getRoomDetailByWebRid(webRid);\n    }\n\n    return await getRoomDetailByRoomId(roomId);\n  }\n\n  /// 通过roomId获取直播间信息\n  /// - [roomId] 直播间ID\n  /// - 返回直播间信息\n  Future<LiveRoomDetail> getRoomDetailByRoomId(String roomId) async {\n    // 读取房间信息\n    var roomData = await _getRoomDataByRoomId(roomId);\n\n    // 通过房间信息获取WebRid\n    var webRid = roomData[\"data\"][\"room\"][\"owner\"][\"web_rid\"].toString();\n\n    // 读取用户唯一ID，用于弹幕连接\n    // 似乎这个参数不是必须的，先随机生成一个\n    //var userUniqueId = await _getUserUniqueId(webRid);\n    var userUniqueId = generateRandomNumber(12).toString();\n\n    var room = roomData[\"data\"][\"room\"];\n    var owner = room[\"owner\"];\n\n    var status = asT<int?>(room[\"status\"]) ?? 0;\n\n    // roomId是一次性的，用户每次重新开播都会生成一个新的roomId\n    // 所以如果roomId对应的直播间状态不是直播中，就通过webRid获取直播间信息\n    if (status == 4) {\n      var result = await getRoomDetailByWebRid(webRid);\n      return result;\n    }\n\n    var roomStatus = status == 2;\n    // 主要是为了获取cookie,用于弹幕websocket连接\n    var headers = await getRequestHeaders();\n\n    return LiveRoomDetail(\n      roomId: webRid,\n      title: room[\"title\"].toString(),\n      cover: roomStatus ? room[\"cover\"][\"url_list\"][0].toString() : \"\",\n      userName: owner[\"nickname\"].toString(),\n      userAvatar: owner[\"avatar_thumb\"][\"url_list\"][0].toString(),\n      online: roomStatus\n          ? asT<int?>(room[\"room_view_stats\"][\"display_value\"]) ?? 0\n          : 0,\n      status: roomStatus,\n      url: \"https://live.douyin.com/$webRid\",\n      introduction: owner[\"signature\"].toString(),\n      notice: \"\",\n      danmakuData: DouyinDanmakuArgs(\n        webRid: webRid,\n        roomId: roomId,\n        userId: userUniqueId,\n        cookie: headers[\"cookie\"],\n      ),\n      data: room[\"stream_url\"],\n    );\n  }\n\n  /// 通过WebRid获取直播间信息\n  /// - [webRid] 直播间RID\n  /// - 返回直播间信息\n  Future<LiveRoomDetail> getRoomDetailByWebRid(String webRid) async {\n    try {\n      var result = await _getRoomDetailByWebRidApi(webRid);\n      return result;\n    } catch (e) {\n      CoreLog.error(e);\n    }\n    return await _getRoomDetailByWebRidHtml(webRid);\n  }\n\n  /// 通过WebRid访问直播间API，从API中获取直播间信息\n  /// - [webRid] 直播间RID\n  /// - 返回直播间信息\n  Future<LiveRoomDetail> _getRoomDetailByWebRidApi(String webRid) async {\n    // 读取房间信息\n    var data = await _getRoomDataByApi(webRid);\n\n    var roomData = data[\"data\"][0];\n    var userData = data[\"user\"];\n    var roomId = roomData[\"id_str\"].toString();\n\n    // 读取用户唯一ID，用于弹幕连接\n    // 似乎这个参数不是必须的，先随机生成一个\n    //var userUniqueId = await _getUserUniqueId(webRid);\n    var userUniqueId = generateRandomNumber(12).toString();\n\n    var owner = roomData[\"owner\"];\n\n    var roomStatus = (asT<int?>(roomData[\"status\"]) ?? 0) == 2;\n\n    // 主要是为了获取cookie,用于弹幕websocket连接\n    var headers = await getRequestHeaders();\n    return LiveRoomDetail(\n      roomId: webRid,\n      title: roomData[\"title\"].toString(),\n      cover: roomStatus ? roomData[\"cover\"][\"url_list\"][0].toString() : \"\",\n      userName: roomStatus\n          ? owner[\"nickname\"].toString()\n          : userData[\"nickname\"].toString(),\n      userAvatar: roomStatus\n          ? owner[\"avatar_thumb\"][\"url_list\"][0].toString()\n          : userData[\"avatar_thumb\"][\"url_list\"][0].toString(),\n      online: roomStatus\n          ? asT<int?>(roomData[\"room_view_stats\"][\"display_value\"]) ?? 0\n          : 0,\n      status: roomStatus,\n      url: \"https://live.douyin.com/$webRid\",\n      introduction: owner?[\"signature\"]?.toString() ?? \"\",\n      notice: \"\",\n      danmakuData: DouyinDanmakuArgs(\n        webRid: webRid,\n        roomId: roomId,\n        userId: userUniqueId,\n        cookie: headers[\"cookie\"],\n      ),\n      data: roomStatus ? roomData[\"stream_url\"] : {},\n    );\n  }\n\n  /// 通过WebRid访问直播间网页，从网页HTML中获取直播间信息\n  /// - [webRid] 直播间RID\n  /// - 返回直播间信息\n  Future<LiveRoomDetail> _getRoomDetailByWebRidHtml(String webRid) async {\n    var roomData = await _getRoomDataByHtml(webRid);\n    var roomId = roomData[\"roomStore\"][\"roomInfo\"][\"room\"][\"id_str\"].toString();\n    var userUniqueId = roomData[\"userStore\"][\"odin\"][\"user_unique_id\"]\n        .toString();\n\n    var room = roomData[\"roomStore\"][\"roomInfo\"][\"room\"];\n    var owner = room[\"owner\"];\n    var anchor = roomData[\"roomStore\"][\"roomInfo\"][\"anchor\"];\n    var roomStatus = (asT<int?>(room[\"status\"]) ?? 0) == 2;\n\n    // 主要是为了获取cookie,用于弹幕websocket连接\n    var headers = await getRequestHeaders();\n\n    return LiveRoomDetail(\n      roomId: webRid,\n      title: room[\"title\"].toString(),\n      cover: roomStatus ? room[\"cover\"][\"url_list\"][0].toString() : \"\",\n      userName: roomStatus\n          ? owner[\"nickname\"].toString()\n          : anchor[\"nickname\"].toString(),\n      userAvatar: roomStatus\n          ? owner[\"avatar_thumb\"][\"url_list\"][0].toString()\n          : anchor[\"avatar_thumb\"][\"url_list\"][0].toString(),\n      online: roomStatus\n          ? asT<int?>(room[\"room_view_stats\"][\"display_value\"]) ?? 0\n          : 0,\n      status: roomStatus,\n      url: \"https://live.douyin.com/$webRid\",\n      introduction: owner?[\"signature\"]?.toString() ?? \"\",\n      notice: \"\",\n      danmakuData: DouyinDanmakuArgs(\n        webRid: webRid,\n        roomId: roomId,\n        userId: userUniqueId,\n        cookie: headers[\"cookie\"],\n      ),\n      data: roomStatus ? room[\"stream_url\"] : {},\n    );\n  }\n\n  /// 读取用户的唯一ID\n  /// - [webRid] 直播间RID\n  // ignore: unused_element\n  Future<String> _getUserUniqueId(String webRid) async {\n    try {\n      var webInfo = await _getRoomDataByHtml(webRid);\n      return webInfo[\"userStore\"][\"odin\"][\"user_unique_id\"].toString();\n    } catch (e) {\n      return generateRandomNumber(12).toString();\n    }\n  }\n\n  /// 进入直播间前需要先获取cookie\n  /// - [webRid] 直播间RID\n  Future<String> _getWebCookie(String webRid) async {\n    var headResp = await HttpClient.instance.head(\n      \"https://live.douyin.com/$webRid\",\n      header: headers,\n    );\n    var dyCookie = \"\";\n    headResp.headers[\"set-cookie\"]?.forEach((element) {\n      var cookie = element.split(\";\")[0];\n      if (cookie.contains(\"ttwid\")) {\n        dyCookie += \"$cookie;\";\n      }\n      if (cookie.contains(\"__ac_nonce\")) {\n        dyCookie += \"$cookie;\";\n      }\n      if (cookie.contains(\"msToken\")) {\n        dyCookie += \"$cookie;\";\n      }\n    });\n    return dyCookie;\n  }\n\n  /// 通过webRid获取直播间Web信息\n  /// - [webRid] 直播间RID\n  Future<Map> _getRoomDataByHtml(String webRid) async {\n    var dyCookie = await _getWebCookie(webRid);\n    var result = await HttpClient.instance.getText(\n      \"https://live.douyin.com/$webRid\",\n      queryParameters: {},\n      header: {\n        \"Authority\": kDefaultAuthority,\n        \"Referer\": kDefaultReferer,\n        \"Cookie\": dyCookie,\n        \"User-Agent\": kDefaultUserAgent,\n      },\n    );\n\n    var renderData =\n        RegExp(\n          r'\\{\\\\\"state\\\\\":\\{\\\\\"appStore.*?\\]\\\\n',\n        ).firstMatch(result)?.group(0) ??\n        \"\";\n    var str = renderData\n        .trim()\n        .replaceAll('\\\\\"', '\"')\n        .replaceAll(r\"\\\\\", r\"\\\")\n        .replaceAll(']\\\\n', \"\");\n    var renderDataJson = json.decode(str);\n    return renderDataJson[\"state\"];\n  }\n\n  /// 通过webRid获取直播间Web信息\n  /// - [webRid] 直播间RID\n  Future<Map> _getRoomDataByApi(String webRid) async {\n    String serverUrl = \"https://live.douyin.com/webcast/room/web/enter/\";\n\n    // 提前获取 headers\n    var requestHeader = await getRequestHeaders();\n\n    // 使用动态 Referer（包含房间号，参考 DouyinLiveRecorder）\n    requestHeader[\"Referer\"] = \"https://live.douyin.com/$webRid\";\n\n    var uri = Uri.parse(serverUrl).replace(\n      scheme: \"https\",\n      port: 443,\n      queryParameters: {\n        \"aid\": '6383',\n        \"app_name\": \"douyin_web\",\n        \"live_id\": '1',\n        \"device_platform\": \"web\",\n        \"language\": \"zh-CN\",\n        \"browser_language\": \"zh-CN\",\n        \"browser_platform\": \"Win32\",\n        \"browser_name\": \"Chrome\",\n        \"browser_version\": \"125.0.0.0\",\n        \"web_rid\": webRid,\n        \"msToken\": \"\",\n      },\n    );\n    var requestUrl = DouyinSign.getAbogusUrl(uri.toString(), kDefaultUserAgent);\n\n    var result = await HttpClient.instance.getJson(\n      requestUrl,\n      header: requestHeader,\n    );\n\n    if (result is! Map) {\n      throw Exception(\"抖音接口返回格式异常\");\n    }\n\n    return result[\"data\"];\n  }\n\n  /// 通过roomId获取直播间信息\n  /// - [roomId] 直播间ID\n  Future<Map> _getRoomDataByRoomId(String roomId) async {\n    var result = await HttpClient.instance.getJson(\n      'https://webcast.amemv.com/webcast/room/reflow/info/',\n      queryParameters: {\n        \"type_id\": 0,\n        \"live_id\": 1,\n        \"room_id\": roomId,\n        \"sec_user_id\": \"\",\n        \"version_code\": \"99.99.99\",\n        \"app_id\": 6383,\n      },\n      header: await getRequestHeaders(),\n    );\n    return result;\n  }\n\n  @override\n  Future<List<LivePlayQuality>> getPlayQualites({\n    required LiveRoomDetail detail,\n  }) async {\n    List<LivePlayQuality> qualities = [];\n\n    try {\n      var liveCoreData = detail.data[\"live_core_sdk_data\"];\n\n      if (liveCoreData == null) {\n        return qualities;\n      }\n\n      var pullData = liveCoreData[\"pull_data\"];\n\n      if (pullData == null) {\n        return qualities;\n      }\n\n      var options = pullData[\"options\"];\n\n      var qulityList = options?[\"qualities\"];\n\n      var streamData = pullData[\"stream_data\"]?.toString() ?? \"\";\n\n      if (!streamData.startsWith('{')) {\n        var flvList = (detail.data[\"flv_pull_url\"] as Map).values\n            .cast<String>()\n            .toList();\n        var hlsList = (detail.data[\"hls_pull_url_map\"] as Map).values\n            .cast<String>()\n            .toList();\n        for (var quality in qulityList) {\n          int level = quality[\"level\"];\n          List<String> urls = [];\n          var flvIndex = flvList.length - level;\n          if (flvIndex >= 0 && flvIndex < flvList.length) {\n            urls.add(flvList[flvIndex]);\n          }\n          var hlsIndex = hlsList.length - level;\n          if (hlsIndex >= 0 && hlsIndex < hlsList.length) {\n            urls.add(hlsList[hlsIndex]);\n          }\n          var qualityItem = LivePlayQuality(\n            quality: quality[\"name\"],\n            sort: level,\n            data: urls,\n          );\n          if (urls.isNotEmpty) {\n            qualities.add(qualityItem);\n          }\n        }\n      } else {\n        var qualityData = json.decode(streamData)[\"data\"] as Map;\n\n        for (var quality in qulityList) {\n          List<String> urls = [];\n\n          var flvUrl = qualityData[quality[\"sdk_key\"]]?[\"main\"]?[\"flv\"]\n              ?.toString();\n\n          if (flvUrl != null && flvUrl.isNotEmpty) {\n            urls.add(flvUrl);\n          }\n          var hlsUrl = qualityData[quality[\"sdk_key\"]]?[\"main\"]?[\"hls\"]\n              ?.toString();\n\n          if (hlsUrl != null && hlsUrl.isNotEmpty) {\n            urls.add(hlsUrl);\n          }\n\n          var qualityItem = LivePlayQuality(\n            quality: quality[\"name\"],\n            sort: quality[\"level\"],\n            data: urls,\n          );\n          if (urls.isNotEmpty) {\n            qualities.add(qualityItem);\n          }\n        }\n      }\n    } catch (e, stackTrace) {\n      CoreLog.error(e);\n      CoreLog.error(stackTrace);\n    }\n    // var qualityData = json.decode(\n    //     detail.data[\"live_core_sdk_data\"][\"pull_data\"][\"stream_data\"])[\"data\"];\n\n    qualities.sort((a, b) => b.sort.compareTo(a.sort));\n    _logDebug(\"获取到的画质列表: ${qualities.map((q) => q.quality).toList()}\");\n    return qualities;\n  }\n\n  @override\n  Future<LivePlayUrl> getPlayUrls({\n    required LiveRoomDetail detail,\n    required LivePlayQuality quality,\n  }) async {\n    // 返回列表的副本，防止外部 clear() 影响原始数据\n    return LivePlayUrl(urls: List<String>.from(quality.data));\n  }\n\n  @override\n  Future<LiveSearchRoomResult> searchRooms(\n    String keyword, {\n    int page = 1,\n  }) async {\n    String serverUrl = \"https://www.douyin.com/aweme/v1/web/live/search/\";\n    var uri = Uri.parse(serverUrl).replace(\n      scheme: \"https\",\n      port: 443,\n      queryParameters: {\n        \"device_platform\": \"webapp\",\n        \"aid\": \"6383\",\n        \"channel\": \"channel_pc_web\",\n        \"search_channel\": \"aweme_live\",\n        \"keyword\": keyword,\n        \"search_source\": \"switch_tab\",\n        \"query_correct_type\": \"1\",\n        \"is_filter_search\": \"0\",\n        \"from_group_id\": \"\",\n        \"offset\": ((page - 1) * 10).toString(),\n        \"count\": \"10\",\n        \"pc_client_type\": \"1\",\n        \"version_code\": \"170400\",\n        \"version_name\": \"17.4.0\",\n        \"cookie_enabled\": \"true\",\n        \"screen_width\": \"1980\",\n        \"screen_height\": \"1080\",\n        \"browser_language\": \"zh-CN\",\n        \"browser_platform\": \"Win32\",\n        \"browser_name\": \"Edge\",\n        \"browser_version\": \"125.0.0.0\",\n        \"browser_online\": \"true\",\n        \"engine_name\": \"Blink\",\n        \"engine_version\": \"125.0.0.0\",\n        \"os_name\": \"Windows\",\n        \"os_version\": \"10\",\n        \"cpu_core_num\": \"12\",\n        \"device_memory\": \"8\",\n        \"platform\": \"PC\",\n        \"downlink\": \"10\",\n        \"effective_type\": \"4g\",\n        \"round_trip_time\": \"100\",\n        \"webid\": \"7382872326016435738\",\n      },\n    );\n    //var requlestUrl = await getAbogusUrl(uri.toString());\n    var requlestUrl = uri.toString();\n    var headResp = await HttpClient.instance.head(\n      'https://live.douyin.com',\n      header: headers,\n    );\n    var dyCookie = \"\";\n    headResp.headers[\"set-cookie\"]?.forEach((element) {\n      var cookie = element.split(\";\")[0];\n      if (cookie.contains(\"ttwid\")) {\n        dyCookie += \"$cookie;\";\n      }\n      if (cookie.contains(\"__ac_nonce\")) {\n        dyCookie += \"$cookie;\";\n      }\n    });\n\n    var result = await HttpClient.instance.getJson(\n      requlestUrl,\n      queryParameters: {},\n      header: {\n        \"Authority\": 'www.douyin.com',\n        'accept': 'application/json, text/plain, */*',\n        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',\n        'cookie': dyCookie,\n        'priority': 'u=1, i',\n        'referer':\n            'https://www.douyin.com/search/${Uri.encodeComponent(keyword)}?type=live',\n        'sec-ch-ua':\n            '\"Microsoft Edge\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"',\n        'sec-ch-ua-mobile': '?0',\n        'sec-ch-ua-platform': '\"Windows\"',\n        'sec-fetch-dest': 'empty',\n        'sec-fetch-mode': 'cors',\n        'sec-fetch-site': 'same-origin',\n        'user-agent': kDefaultUserAgent,\n      },\n    );\n    if (result == \"\" || result == 'blocked') {\n      throw Exception(\"抖音直播搜索被限制，请稍后再试\");\n    }\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"] ?? []) {\n      var itemData = json.decode(item[\"lives\"][\"rawdata\"].toString());\n      var roomItem = LiveRoomItem(\n        roomId: itemData[\"owner\"][\"web_rid\"].toString(),\n        title: itemData[\"title\"].toString(),\n        cover: itemData[\"cover\"][\"url_list\"][0].toString(),\n        userName: itemData[\"owner\"][\"nickname\"].toString(),\n        online: int.tryParse(itemData[\"stats\"][\"total_user\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    return LiveSearchRoomResult(hasMore: items.length >= 10, items: items);\n  }\n\n  @override\n  Future<LiveSearchAnchorResult> searchAnchors(\n    String keyword, {\n    int page = 1,\n  }) async {\n    throw Exception(\"抖音暂不支持搜索主播，请直接搜索直播间\");\n  }\n\n  @override\n  Future<bool> getLiveStatus({required String roomId}) async {\n    var result = await getRoomDetail(roomId: roomId);\n    return result.status;\n  }\n\n  @override\n  Future<List<LiveSuperChatMessage>> getSuperChatMessage({\n    required String roomId,\n  }) {\n    return Future.value(<LiveSuperChatMessage>[]);\n  }\n\n  //生成指定长度的16进制随机字符串\n  String generateRandomString(int length) {\n    var random = Random.secure();\n    var values = List<int>.generate(length, (i) => random.nextInt(16));\n    StringBuffer stringBuffer = StringBuffer();\n    for (var item in values) {\n      stringBuffer.write(item.toRadixString(16));\n    }\n    return stringBuffer.toString();\n  }\n\n  // 生成随机的数字\n  int generateRandomNumber(int length) {\n    var random = Random.secure();\n    var values = List<int>.generate(length, (i) => random.nextInt(10));\n    StringBuffer stringBuffer = StringBuffer();\n    for (var item in values) {\n      stringBuffer.write(item);\n    }\n    return int.tryParse(stringBuffer.toString()) ??\n        Random().nextInt(1000000000);\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/douyu_site.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:math';\n\nimport 'package:simple_live_core/src/common/http_client.dart';\nimport 'package:simple_live_core/src/danmaku/douyu_danmaku.dart';\nimport 'package:simple_live_core/src/interface/live_danmaku.dart';\nimport 'package:simple_live_core/src/interface/live_site.dart';\nimport 'package:simple_live_core/src/model/live_anchor_item.dart';\nimport 'package:simple_live_core/src/model/live_category.dart';\nimport 'package:simple_live_core/src/model/live_message.dart';\nimport 'package:simple_live_core/src/model/live_play_url.dart';\nimport 'package:simple_live_core/src/model/live_room_item.dart';\nimport 'package:simple_live_core/src/model/live_search_result.dart';\nimport 'package:simple_live_core/src/model/live_room_detail.dart';\nimport 'package:simple_live_core/src/model/live_play_quality.dart';\nimport 'package:simple_live_core/src/model/live_category_result.dart';\nimport 'package:html_unescape/html_unescape.dart';\nimport 'package:simple_live_core/src/scripts/douyu_sign.dart';\n\nclass DouyuSite implements LiveSite {\n  @override\n  String id = \"douyu\";\n\n  @override\n  String name = \"斗鱼直播\";\n\n  @override\n  LiveDanmaku getDanmaku() => DouyuDanmaku();\n\n  @override\n  Future<List<LiveCategory>> getCategores() async {\n    List<LiveCategory> categories = [];\n    var result = await HttpClient.instance.getJson(\n      \"https://m.douyu.com/api/cate/list\",\n    );\n    var subCateList = result[\"data\"][\"cate2Info\"] as List;\n    for (var item in result[\"data\"][\"cate1Info\"]) {\n      var cate1Id = item[\"cate1Id\"];\n      var cate1Name = item[\"cate1Name\"];\n      List<LiveSubCategory> subCategories = [];\n      subCateList.where((x) => x[\"cate1Id\"] == cate1Id).forEach((element) {\n        subCategories.add(\n          LiveSubCategory(\n            pic: element[\"icon\"],\n            id: element[\"cate2Id\"].toString(),\n            parentId: cate1Id.toString(),\n            name: element[\"cate2Name\"].toString(),\n          ),\n        );\n      });\n      categories.add(\n        LiveCategory(\n          id: cate1Id.toString(),\n          name: cate1Name.toString(),\n          children: subCategories,\n        ),\n      );\n    }\n    // 根据ID排序\n    categories.sort((a, b) => int.parse(a.id).compareTo(int.parse(b.id)));\n\n    return categories;\n  }\n\n  @override\n  Future<LiveCategoryResult> getCategoryRooms(\n    LiveSubCategory category, {\n    int page = 1,\n  }) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/gapi/rkc/directory/mixList/2_${category.id}/$page\",\n      queryParameters: {},\n    );\n\n    var items = <LiveRoomItem>[];\n    for (var item in result['data']['rl']) {\n      if (item[\"type\"] != 1) {\n        continue;\n      }\n      var roomItem = LiveRoomItem(\n        cover: item['rs16'].toString(),\n        online: item['ol'],\n        roomId: item['rid'].toString(),\n        title: item['rn'].toString(),\n        userName: item['nn'].toString(),\n      );\n      items.add(roomItem);\n    }\n    var hasMore = page < result['data']['pgcnt'];\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<List<LivePlayQuality>> getPlayQualites({\n    required LiveRoomDetail detail,\n  }) async {\n    var data = detail.data.toString();\n    data += \"&cdn=&rate=-1&ver=Douyu_223061205&iar=1&ive=1&hevc=0&fa=0\";\n    List<LivePlayQuality> qualities = [];\n    var result = await HttpClient.instance.postJson(\n      \"https://www.douyu.com/lapi/live/getH5Play/${detail.roomId}\",\n      data: data,\n      formUrlEncoded: true,\n    );\n\n    var cdns = <String>[];\n    for (var item in result[\"data\"][\"cdnsWithName\"]) {\n      cdns.add(item[\"cdn\"].toString());\n    }\n\n    // 如果cdn以scdn开头，将其放到最后\n    cdns.sort((a, b) {\n      if (a.startsWith(\"scdn\") && !b.startsWith(\"scdn\")) {\n        return 1;\n      } else if (!a.startsWith(\"scdn\") && b.startsWith(\"scdn\")) {\n        return -1;\n      }\n      return 0;\n    });\n\n    for (var item in result[\"data\"][\"multirates\"]) {\n      qualities.add(\n        LivePlayQuality(\n          quality: item[\"name\"].toString(),\n          data: DouyuPlayData(item[\"rate\"], cdns),\n        ),\n      );\n    }\n    return qualities;\n  }\n\n  @override\n  Future<LivePlayUrl> getPlayUrls({\n    required LiveRoomDetail detail,\n    required LivePlayQuality quality,\n  }) async {\n    var args = detail.data.toString();\n    var data = quality.data as DouyuPlayData;\n\n    List<String> urls = [];\n    for (var item in data.cdns) {\n      var url = await getPlayUrl(detail.roomId, args, data.rate, item);\n      if (url.isNotEmpty) {\n        urls.add(url);\n      }\n    }\n    return LivePlayUrl(urls: urls);\n  }\n\n  Future<String> getPlayUrl(\n    String roomId,\n    String args,\n    int rate,\n    String cdn,\n  ) async {\n    args += \"&cdn=$cdn&rate=$rate\";\n    var result = await HttpClient.instance.postJson(\n      \"https://www.douyu.com/lapi/live/getH5Play/$roomId\",\n      data: args,\n      header: {\n        'referer': 'https://www.douyu.com/$roomId',\n        'user-agent':\n            \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43\",\n      },\n      formUrlEncoded: true,\n    );\n\n    return \"${result[\"data\"][\"rtmp_url\"]}/${HtmlUnescape().convert(result[\"data\"][\"rtmp_live\"].toString())}\";\n  }\n\n  @override\n  Future<LiveCategoryResult> getRecommendRooms({int page = 1}) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/japi/weblist/apinc/allpage/6/$page\",\n      queryParameters: {},\n    );\n\n    var items = <LiveRoomItem>[];\n    for (var item in result['data']['rl']) {\n      if (item[\"type\"] != 1) {\n        continue;\n      }\n      var roomItem = LiveRoomItem(\n        cover: item['rs16'].toString(),\n        online: item['ol'],\n        roomId: item['rid'].toString(),\n        title: item['rn'].toString(),\n        userName: item['nn'].toString(),\n      );\n      items.add(roomItem);\n    }\n    var hasMore = page < result['data']['pgcnt'];\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveRoomDetail> getRoomDetail({required String roomId}) async {\n    Map roomInfo = await _getRoomInfo(roomId);\n\n    Map h5RoomInfo = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/swf_api/h5room/$roomId\",\n      queryParameters: {},\n      header: {\n        'referer': 'https://www.douyu.com/$roomId',\n        'user-agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43',\n      },\n    );\n    String? showTime = h5RoomInfo[\"data\"]?[\"show_time\"]?.toString();\n\n    var jsEncResult = await HttpClient.instance.getText(\n      \"https://www.douyu.com/swf_api/homeH5Enc?rids=$roomId\",\n      queryParameters: {},\n      header: {\n        'referer': 'https://www.douyu.com/$roomId',\n        'user-agent':\n            \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43\",\n      },\n    );\n    var crptext = json.decode(jsEncResult)[\"data\"][\"room$roomId\"].toString();\n\n    if (showTime != null && showTime.isNotEmpty) {\n      try {\n        int startTimeStamp = int.parse(showTime);\n        int currentTimeStamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n        int durationInSeconds = currentTimeStamp - startTimeStamp;\n\n        int hours = durationInSeconds ~/ 3600;\n        int minutes = (durationInSeconds % 3600) ~/ 60;\n        int seconds = durationInSeconds % 60;\n\n        String formattedDuration =\n            '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}';\n        print('斗鱼直播间 $roomId 开播时长: $formattedDuration');\n      } catch (e) {\n        print('计算开播时长出错: $e');\n      }\n    }\n\n    return LiveRoomDetail(\n      cover: roomInfo[\"room_pic\"].toString(),\n      online: int.tryParse(roomInfo[\"room_biz_all\"][\"hot\"].toString()) ?? 0,\n      roomId: roomInfo[\"room_id\"].toString(),\n      title: roomInfo[\"room_name\"].toString(),\n      userName: roomInfo[\"owner_name\"].toString(),\n      userAvatar: roomInfo[\"owner_avatar\"].toString(),\n      introduction: roomInfo[\"show_details\"].toString(),\n      notice: \"\",\n      status: roomInfo[\"show_status\"] == 1 && roomInfo[\"videoLoop\"] != 1,\n      danmakuData: roomInfo[\"room_id\"].toString(),\n      data: DouyuSign.getSign(crptext, roomInfo[\"room_id\"].toString()),\n      url: \"https://www.douyu.com/$roomId\",\n      isRecord: roomInfo[\"videoLoop\"] == 1,\n      showTime: showTime,\n    );\n  }\n\n  @override\n  Future<LiveSearchRoomResult> searchRooms(\n    String keyword, {\n    int page = 1,\n  }) async {\n    var did = generateRandomString(32);\n    var result = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/japi/search/api/searchShow\",\n      queryParameters: {\"kw\": keyword, \"page\": page, \"pageSize\": 20},\n      header: {\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.51',\n        'referer': 'https://www.douyu.com/search/',\n        'Cookie': 'dy_did=$did;acf_did=$did',\n      },\n    );\n    if (result['error'] != 0) {\n      throw Exception(result['msg']);\n    }\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"relateShow\"]) {\n      var roomItem = LiveRoomItem(\n        roomId: item[\"rid\"].toString(),\n        title: item[\"roomName\"].toString(),\n        cover: item[\"roomSrc\"].toString(),\n        userName: item[\"nickName\"].toString(),\n        online: parseHotNum(item[\"hot\"].toString()),\n      );\n      items.add(roomItem);\n    }\n    var hasMore = result[\"data\"][\"relateShow\"].isNotEmpty;\n    return LiveSearchRoomResult(hasMore: hasMore, items: items);\n  }\n\n  Future<Map> _getRoomInfo(String roomId) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/betard/$roomId\",\n      queryParameters: {},\n      header: {\n        'referer': 'https://www.douyu.com/$roomId',\n        'user-agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43',\n      },\n    );\n    Map roomInfo;\n    if (result is String) {\n      roomInfo = json.decode(result)[\"room\"];\n    } else {\n      roomInfo = result[\"room\"];\n    }\n    return roomInfo;\n  }\n\n  //生成指定长度的16进制随机字符串\n  String generateRandomString(int length) {\n    var random = Random.secure();\n    var values = List<int>.generate(length, (i) => random.nextInt(16));\n    StringBuffer stringBuffer = StringBuffer();\n    for (var item in values) {\n      stringBuffer.write(item.toRadixString(16));\n    }\n    return stringBuffer.toString();\n  }\n\n  @override\n  Future<LiveSearchAnchorResult> searchAnchors(\n    String keyword, {\n    int page = 1,\n  }) async {\n    var did = generateRandomString(32);\n    var result = await HttpClient.instance.getJson(\n      \"https://www.douyu.com/japi/search/api/searchUser\",\n      queryParameters: {\n        \"kw\": keyword,\n        \"page\": page,\n        \"pageSize\": 20,\n        \"filterType\": 1,\n      },\n      header: {\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.51',\n        'referer': 'https://www.douyu.com/search/',\n        'Cookie': 'dy_did=$did;acf_did=$did',\n      },\n    );\n\n    var items = <LiveAnchorItem>[];\n    for (var item in result[\"data\"][\"relateUser\"]) {\n      var liveStatus =\n          (int.tryParse(item[\"anchorInfo\"][\"isLive\"].toString()) ?? 0) == 1;\n      var roomType =\n          (int.tryParse(item[\"anchorInfo\"][\"roomType\"].toString()) ?? 0);\n      var roomItem = LiveAnchorItem(\n        roomId: item[\"anchorInfo\"][\"rid\"].toString(),\n        avatar: item[\"anchorInfo\"][\"avatar\"].toString(),\n        userName: item[\"anchorInfo\"][\"nickName\"].toString(),\n        liveStatus: liveStatus && roomType == 0,\n      );\n      items.add(roomItem);\n    }\n    var hasMore = result[\"data\"][\"relateUser\"].isNotEmpty;\n    return LiveSearchAnchorResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<bool> getLiveStatus({required String roomId}) async {\n    var roomInfo = await _getRoomInfo(roomId);\n    return roomInfo[\"show_status\"] == 1 && roomInfo[\"videoLoop\"] != 1;\n  }\n\n  int parseHotNum(String hn) {\n    try {\n      var num = double.parse(hn.replaceAll(\"万\", \"\"));\n      if (hn.contains(\"万\")) {\n        num *= 10000;\n      }\n      return num.round();\n    } catch (_) {\n      return -999;\n    }\n  }\n\n  @override\n  Future<List<LiveSuperChatMessage>> getSuperChatMessage({\n    required String roomId,\n  }) {\n    //尚不支持\n    return Future.value([]);\n  }\n}\n\nclass DouyuPlayData {\n  final int rate;\n  final List<String> cdns;\n  DouyuPlayData(this.rate, this.cdns);\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/huya_site.dart",
    "content": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_core/src/common/http_client.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:simple_live_core/src/model/tars/get_cdn_token_ex_req.dart';\nimport 'package:simple_live_core/src/model/tars/get_cdn_token_ex_resp.dart';\nimport 'package:simple_live_core/src/model/tars/get_cdn_token_req.dart';\nimport 'package:simple_live_core/src/model/tars/get_cdn_token_resp.dart';\nimport 'package:simple_live_core/src/model/tars/huya_user_id.dart';\nimport 'package:tars_dart/tars/net/base_tars_http.dart';\n\nclass HuyaSite implements LiveSite {\n  static const baseUrl = \"https://m.huya.com/\";\n  final String kUserAgent =\n      \"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36 Edg/117.0.0.0\";\n\n  static const String HYSDK_UA =\n      \"HYSDK(Windows, 30000002)_APP(pc_exe&7060000&official)_SDK(trans&2.32.3.5646)\";\n\n  static Map<String, String> requestHeaders =  {\n      'Origin': baseUrl,\n      'Referer': baseUrl,\n      'User-Agent': HYSDK_UA,\n  };\n\n  final BaseTarsHttp tupClient =\n  BaseTarsHttp(\"http://wup.huya.com\", \"liveui\", headers: requestHeaders);\n\n  String? playUserAgent;\n  @override\n  String id = \"huya\";\n\n  @override\n  String name = \"虎牙直播\";\n\n  @override\n  LiveDanmaku getDanmaku() => HuyaDanmaku();\n\n  @override\n  Future<List<LiveCategory>> getCategores() async {\n    List<LiveCategory> categories = [\n      LiveCategory(id: \"1\", name: \"网游\", children: []),\n      LiveCategory(id: \"2\", name: \"单机\", children: []),\n      LiveCategory(id: \"8\", name: \"娱乐\", children: []),\n      LiveCategory(id: \"3\", name: \"手游\", children: []),\n    ];\n\n    for (var item in categories) {\n      var items = await getSubCategores(item.id);\n      item.children.addAll(items);\n    }\n    return categories;\n  }\n\n  Future<List<LiveSubCategory>> getSubCategores(String id) async {\n    var result = await HttpClient.instance.getJson(\n      \"https://live.cdn.huya.com/liveconfig/game/bussLive\",\n      queryParameters: {\n        \"bussType\": id,\n      },\n    );\n\n    List<LiveSubCategory> subs = [];\n    for (var item in result[\"data\"]) {\n      var gid = \"\";\n\n      if (item[\"gid\"] is Map) {\n        gid = item[\"gid\"][\"value\"].toString().split(\",\").first;\n      } else if (item[\"gid\"] is double) {\n        gid = item[\"gid\"].toInt().toString();\n      } else if (item[\"gid\"] is int) {\n        gid = item[\"gid\"].toString();\n      } else {\n        gid = item[\"gid\"].toString();\n      }\n\n      var subCategory = LiveSubCategory(\n        id: gid,\n        name: item[\"gameFullName\"].toString(),\n        parentId: id,\n        pic: \"https://huyaimg.msstatic.com/cdnimage/game/$gid-MS.jpg\",\n      );\n      subs.add(subCategory);\n    }\n\n    return subs;\n  }\n\n  @override\n  Future<LiveCategoryResult> getCategoryRooms(LiveSubCategory category,\n      {int page = 1}) async {\n    var resultText = await HttpClient.instance.getJson(\n      \"https://www.huya.com/cache.php\",\n      queryParameters: {\n        \"m\": \"LiveList\",\n        \"do\": \"getLiveListByPage\",\n        \"tagAll\": 0,\n        \"gameId\": category.id,\n        \"page\": page\n      },\n    );\n    var result = json.decode(resultText);\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"datas\"]) {\n      var cover = item[\"screenshot\"].toString();\n      if (!cover.contains(\"?\")) {\n        cover += \"?x-oss-process=style/w338_h190&\";\n      }\n      var title = item[\"introduction\"]?.toString() ?? \"\";\n      if (title.isEmpty) {\n        title = item[\"roomName\"]?.toString() ?? \"\";\n      }\n\n      var roomItem = LiveRoomItem(\n        roomId: item[\"profileRoom\"].toString(),\n        title: title,\n        cover: cover,\n        userName: item[\"nick\"].toString(),\n        online: int.tryParse(item[\"totalCount\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    var hasMore = result[\"data\"][\"page\"] < result[\"data\"][\"totalPage\"];\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<List<LivePlayQuality>> getPlayQualites(\n      {required LiveRoomDetail detail}) {\n    List<LivePlayQuality> qualities = <LivePlayQuality>[];\n    var urlData = detail.data as HuyaUrlDataModel;\n    if (urlData.bitRates.isEmpty) {\n      urlData.bitRates = [\n        HuyaBitRateModel(\n          name: \"原画\",\n          bitRate: 0,\n        ),\n        HuyaBitRateModel(name: \"高清\", bitRate: 2000),\n      ];\n    }\n    // if (urlData.lines.isEmpty) {\n    //   urlData.lines = [\n    //     HuyaLineModel(line: \"tx.flv.huya.com\", lineType: HuyaLineType.flv,),\n    //     HuyaLineModel(line: \"bd.flv.huya.com\", lineType: HuyaLineType.flv),\n    //     HuyaLineModel(line: \"al.flv.huya.com\", lineType: HuyaLineType.flv),\n    //     HuyaLineModel(line: \"hw.flv.huya.com\", lineType: HuyaLineType.flv),\n    //   ];\n    // }\n    //var url = getRealUrl(urlData.url);\n\n    for (var item in urlData.bitRates) {\n      // var urls = <String>[];\n      // for (var line in urlData.lines) {\n      //   var src = line.line;\n      //   src += \"/${line.streamName}\";\n      //   if (line.lineType == HuyaLineType.flv) {\n      //     //src = src.replaceAll(\".m3u8\", \".flv\");\n      //     src += \".flv\";\n      //   }\n      //   if (line.lineType == HuyaLineType.hls) {\n      //     src += \".m3u8\";\n      //   }\n      //   var parms = processAnticode(\n      //     line.lineType == HuyaLineType.flv\n      //         ? line.flvAntiCode\n      //         : line.hlsAntiCode,\n      //     urlData.uid,\n      //     line.streamName,\n      //   );\n      //   src += \"?$parms\";\n      //   if (item.bitRate > 0) {\n      //     src += \"&ratio=${item.bitRate}\";\n      //   }\n      //   urls.add(src);\n      // }\n\n      qualities.add(LivePlayQuality(\n        data: {\n          \"urls\": urlData.lines,\n          \"bitRate\": item.bitRate,\n        },\n        quality: item.name,\n      ));\n    }\n\n    return Future.value(qualities);\n  }\n\n  // 每次访问播放虎牙都需要获取一次，不太合理，倾向于在客户端获取保存替换\n  Future<String> getHuYaUA() async {\n    if (playUserAgent != null) {\n      return playUserAgent!;\n    }\n    try {\n      var result = await HttpClient.instance.getJson(\n        \"https://github.iill.moe/xiaoyaocz/dart_simple_live/master/assets/play_config.json\",\n        queryParameters: {\n          \"ts\": DateTime.now().millisecondsSinceEpoch,\n        },\n      );\n      playUserAgent = json.decode(result)['huya']['user_agent'];\n    } catch (e) {\n      CoreLog.error(e);\n    }\n    return playUserAgent ?? HYSDK_UA;\n  }\n\n  @override\n  Future<LivePlayUrl> getPlayUrls(\n      {required LiveRoomDetail detail,\n      required LivePlayQuality quality}) async {\n    var ls = <String>[];\n    for (var element in quality.data[\"urls\"]) {\n      var line = element as HuyaLineModel;\n      var url = await getPlayUrl(line, quality.data[\"bitRate\"]);\n      ls.add(url);\n    }\n    // 最新UA需要额外验证，此方法暂时弃用\n    // var ua = await getHuYaUA();\n    return LivePlayUrl(\n      urls: ls,\n      headers: {\"user-agent\": HYSDK_UA},\n    );\n  }\n\n  Future<String> getPlayUrl(HuyaLineModel line, int bitRate) async {\n    var antiCode = await getCndTokenInfoEx(line.streamName);\n    antiCode = buildAntiCode(line.streamName, line.presenterUid, antiCode);\n    var url = '${line.line}/${line.streamName}.flv?${antiCode}&codec=264';\n    if (bitRate > 0) {\n      url += \"&ratio=$bitRate\";\n    }\n    return url;\n  }\n\n  // 构造 anticode, python转写\n  /// [stream] streamname [presenterUid] 用户id [antiCode] 页面anti\n  ///\n  /// return ture anticode\n  String buildAntiCode(String stream, int presenterUid, String antiCode) {\n    var mapAnti = Uri(query: antiCode).queryParametersAll;\n    if (!mapAnti.containsKey(\"fm\")) {\n      return antiCode;\n    }\n\n    var ctype = mapAnti[\"ctype\"]?.first ?? \"huya_pc_exe\";\n    var platformId = int.tryParse(mapAnti[\"t\"]?.first ?? \"0\");\n\n    bool isWap = platformId == 103;\n    var clacStartTime = DateTime.now().millisecondsSinceEpoch;\n\n    CoreLog.i(\n        \"using $presenterUid | ctype-{$ctype} | platformId - {$platformId} | isWap - {$isWap} | $clacStartTime\");\n\n    var seqId = presenterUid + clacStartTime;\n    final secretHash =\n        md5.convert(utf8.encode('$seqId|$ctype|$platformId')).toString();\n\n    final convertUid = rotl64(presenterUid);\n    final calcUid = isWap ? presenterUid : convertUid;\n    final fm = Uri.decodeComponent(mapAnti['fm']!.first);\n    final secretPrefix = utf8.decode(base64.decode(fm)).split('_').first;\n    var wsTime = mapAnti['wsTime']!.first;\n    final secretStr =\n        '${secretPrefix}_${calcUid}_${stream}_${secretHash}_$wsTime';\n\n    final wsSecret = md5.convert(utf8.encode(secretStr)).toString();\n\n    final rnd = Random();\n    final ct =\n        ((int.parse(wsTime, radix: 16) + rnd.nextDouble()) * 1000).toInt();\n    final uuid = (((ct % 1e10) + rnd.nextDouble()) * 1e3 % 0xffffffff)\n        .toInt()\n        .toString();\n    final Map<String, dynamic> antiCodeRes = {\n      'wsSecret': wsSecret,\n      'wsTime': wsTime,\n      'seqid': seqId,\n      'ctype': ctype,\n      'ver': '1',\n      'fs': mapAnti['fs']!.first,\n      'fm': Uri.encodeComponent(mapAnti['fm']!.first),\n      't': platformId,\n    };\n    if (isWap) {\n      antiCodeRes.addAll({\n        'uid': presenterUid,\n        'uuid': uuid,\n      });\n    } else {\n      antiCodeRes['u'] = convertUid;\n    }\n\n    return antiCodeRes.entries.map((e) => '${e.key}=${e.value}').join('&');\n  }\n\n  /// return sFlvToken\n  Future<String> getCndTokenInfoEx(String stream) async {\n    var func = \"getCdnTokenInfoEx\";\n    var tid = HuyaUserId();\n    tid.sHuYaUA = \"pc_exe&7060000&official\";\n    var tReq = GetCdnTokenExReq();\n    tReq.tId = tid;\n    tReq.sStreamName = stream;\n    var resp = await tupClient.tupRequest(func, tReq, GetCdnTokenExResp());\n    return resp.sFlvToken;\n  }\n\n  @override\n  Future<LiveCategoryResult> getRecommendRooms({int page = 1}) async {\n    var resultText = await HttpClient.instance.getJson(\n      \"https://www.huya.com/cache.php\",\n      queryParameters: {\n        \"m\": \"LiveList\",\n        \"do\": \"getLiveListByPage\",\n        \"tagAll\": 0,\n        \"page\": page\n      },\n    );\n    var result = json.decode(resultText);\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"data\"][\"datas\"]) {\n      var cover = item[\"screenshot\"].toString();\n      if (!cover.contains(\"?\")) {\n        cover += \"?x-oss-process=style/w338_h190&\";\n      }\n      var title = item[\"introduction\"]?.toString() ?? \"\";\n      if (title.isEmpty) {\n        title = item[\"roomName\"]?.toString() ?? \"\";\n      }\n\n      var roomItem = LiveRoomItem(\n        roomId: item[\"profileRoom\"].toString(),\n        title: title,\n        cover: cover,\n        userName: item[\"nick\"].toString(),\n        online: int.tryParse(item[\"totalCount\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    var hasMore = result[\"data\"][\"page\"] < result[\"data\"][\"totalPage\"];\n    return LiveCategoryResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveRoomDetail> getRoomDetail({required String roomId}) async {\n    var roomInfo = await _getRoomInfo(roomId);\n    var tLiveInfo = roomInfo[\"roomInfo\"][\"tLiveInfo\"];\n    var tProfileInfo = roomInfo[\"roomInfo\"][\"tProfileInfo\"];\n\n    var title = tLiveInfo[\"sIntroduction\"]?.toString() ?? \"\";\n    if (title.isEmpty) {\n      title = tLiveInfo[\"sRoomName\"]?.toString() ?? \"\";\n    }\n    var huyaLines = <HuyaLineModel>[];\n    var huyaBiterates = <HuyaBitRateModel>[];\n    //读取可用线路\n    var lines = tLiveInfo[\"tLiveStreamInfo\"][\"vStreamInfo\"][\"value\"];\n    for (var item in lines) {\n      if ((item[\"sFlvUrl\"]?.toString() ?? \"\").isNotEmpty) {\n        huyaLines.add(HuyaLineModel(\n          line: item[\"sFlvUrl\"].toString(),\n          lineType: HuyaLineType.flv,\n          flvAntiCode: item[\"sFlvAntiCode\"].toString(),\n          hlsAntiCode: item[\"sHlsAntiCode\"].toString(),\n          streamName: item[\"sStreamName\"].toString(),\n          cdnType: item[\"sCdnType\"].toString(),\n          presenterUid: roomInfo[\"topSid\"]??0,\n        ));\n      }\n    }\n\n    //清晰度\n    var biterates = tLiveInfo[\"tLiveStreamInfo\"][\"vBitRateInfo\"][\"value\"];\n    for (var item in biterates) {\n      var name = item[\"sDisplayName\"].toString();\n      if (name.contains(\"HDR\")) {\n        continue;\n      }\n      huyaBiterates.add(HuyaBitRateModel(\n        bitRate: item[\"iBitRate\"],\n        name: name,\n      ));\n    }\n\n    var topSid = roomInfo[\"topSid\"];\n    var subSid = roomInfo[\"subSid\"];\n\n    return LiveRoomDetail(\n      cover: tLiveInfo[\"sScreenshot\"].toString(),\n      online: tLiveInfo[\"lTotalCount\"],\n      roomId: tLiveInfo[\"lProfileRoom\"].toString(),\n      title: title,\n      userName: tProfileInfo[\"sNick\"].toString(),\n      userAvatar: tProfileInfo[\"sAvatar180\"].toString(),\n      introduction: tLiveInfo[\"sIntroduction\"].toString(),\n      notice: roomInfo[\"welcomeText\"].toString(),\n      status: roomInfo[\"roomInfo\"][\"eLiveStatus\"] == 2,\n      data: HuyaUrlDataModel(\n        url:\n            \"https:${utf8.decode(base64.decode(roomInfo[\"roomProfile\"][\"liveLineUrl\"].toString()))}\",\n        lines: huyaLines,\n        bitRates: huyaBiterates,\n        uid: getUid(t: 13, e: 10),\n      ),\n      danmakuData: HuyaDanmakuArgs(\n        ayyuid: tLiveInfo[\"lYyid\"] ?? 0,\n        topSid: topSid ?? 0,\n        subSid: subSid ?? 0,\n      ),\n      url: \"https://www.huya.com/$roomId\",\n    );\n  }\n\n  Future<Map> _getRoomInfo(String roomId) async {\n    var resultText = await HttpClient.instance.getText(\n      \"https://m.huya.com/$roomId\",\n      queryParameters: {},\n      header: {\n        \"user-agent\": kUserAgent,\n      },\n    );\n    var text = RegExp(\n            r\"window\\.HNF_GLOBAL_INIT.=.\\{[\\s\\S]*?\\}[\\s\\S]*?</script>\",\n            multiLine: false)\n        .firstMatch(resultText)\n        ?.group(0);\n    var jsonText = text!\n        .replaceAll(RegExp(r\"window\\.HNF_GLOBAL_INIT.=.\"), '')\n        .replaceAll(\"</script>\", \"\")\n        .replaceAllMapped(RegExp(r'function.*?\\(.*?\\).\\{[\\s\\S]*?\\}'), (match) {\n      return '\"\"';\n    });\n\n    var jsonObj = json.decode(jsonText);\n    var topSid = int.tryParse(\n        RegExp(r'lChannelId\":([0-9]+)').firstMatch(resultText)?.group(1) ??\n            \"0\");\n    var subSid = int.tryParse(\n        RegExp(r'lSubChannelId\":([0-9]+)').firstMatch(resultText)?.group(1) ??\n            \"0\");\n    jsonObj[\"topSid\"] = topSid;\n    jsonObj[\"subSid\"] = subSid;\n    return jsonObj;\n  }\n\n  @override\n  Future<LiveSearchRoomResult> searchRooms(String keyword,\n      {int page = 1}) async {\n    var resultText = await HttpClient.instance.getJson(\n      \"https://search.cdn.huya.com/\",\n      queryParameters: {\n        \"m\": \"Search\",\n        \"do\": \"getSearchContent\",\n        \"q\": keyword,\n        \"uid\": 0,\n        \"v\": 4,\n        \"typ\": -5,\n        \"livestate\": 0,\n        \"rows\": 20,\n        \"start\": (page - 1) * 20,\n      },\n    );\n    var result = json.decode(resultText);\n    var items = <LiveRoomItem>[];\n    for (var item in result[\"response\"][\"3\"][\"docs\"]) {\n      var cover = item[\"game_screenshot\"].toString();\n      if (!cover.contains(\"?\")) {\n        cover += \"?x-oss-process=style/w338_h190&\";\n      }\n\n      var title = item[\"game_introduction\"]?.toString() ?? \"\";\n      if (title.isEmpty) {\n        title = item[\"game_roomName\"]?.toString() ?? \"\";\n      }\n\n      var roomItem = LiveRoomItem(\n        roomId: item[\"room_id\"].toString(),\n        title: title,\n        cover: cover,\n        userName: item[\"game_nick\"].toString(),\n        online: int.tryParse(item[\"game_total_count\"].toString()) ?? 0,\n      );\n      items.add(roomItem);\n    }\n    var hasMore = result[\"response\"][\"3\"][\"numFound\"] > (page * 20);\n    return LiveSearchRoomResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<LiveSearchAnchorResult> searchAnchors(String keyword,\n      {int page = 1}) async {\n    var resultText = await HttpClient.instance.getJson(\n      \"https://search.cdn.huya.com/\",\n      queryParameters: {\n        \"m\": \"Search\",\n        \"do\": \"getSearchContent\",\n        \"q\": keyword,\n        \"uid\": 0,\n        \"v\": 1,\n        \"typ\": -5,\n        \"livestate\": 0,\n        \"rows\": 20,\n        \"start\": (page - 1) * 20,\n      },\n    );\n    var result = json.decode(resultText);\n    var items = <LiveAnchorItem>[];\n    for (var item in result[\"response\"][\"1\"][\"docs\"]) {\n      var anchorItem = LiveAnchorItem(\n        roomId: item[\"room_id\"].toString(),\n        avatar: item[\"game_avatarUrl180\"].toString(),\n        userName: item[\"game_nick\"].toString(),\n        liveStatus: item[\"gameLiveOn\"],\n      );\n      items.add(anchorItem);\n    }\n    var hasMore = result[\"response\"][\"1\"][\"numFound\"] > (page * 20);\n    return LiveSearchAnchorResult(hasMore: hasMore, items: items);\n  }\n\n  @override\n  Future<bool> getLiveStatus({required String roomId}) async {\n    var roomInfo = await _getRoomInfo(roomId);\n    return roomInfo[\"roomInfo\"][\"eLiveStatus\"] == 2;\n  }\n\n  /// 匿名登录获取uid\n  Future<String> getAnonymousUid() async {\n    var result = await HttpClient.instance.postJson(\n      \"https://udblgn.huya.com/web/anonymousLogin\",\n      data: {\n        \"appId\": 5002,\n        \"byPass\": 3,\n        \"context\": \"\",\n        \"version\": \"2.4\",\n        \"data\": {}\n      },\n      header: {\n        \"user-agent\": kUserAgent,\n      },\n    );\n    return result[\"data\"][\"uid\"].toString();\n  }\n\n  int rotl64(int t) {\n    final low = t & 0xFFFFFFFF;\n    final rotatedLow =\n    ((low << 8) | (low >> 24)) & 0xFFFFFFFF;\n    final high = t & ~0xFFFFFFFF;\n    return high | rotatedLow;\n  }\n\n  String getUUid() {\n    var currentTime = DateTime.now().millisecondsSinceEpoch;\n    var randomValue = Random().nextInt(4294967295);\n    var result = (currentTime % 10000000000 * 1000 + randomValue) % 4294967295;\n    return result.toString();\n  }\n\n  String getUid({int? t, int? e}) {\n    var n = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n        .split(\"\");\n    var o = List.filled(36, '');\n    if (t != null) {\n      for (var i = 0; i < t; i++) {\n        o[i] = n[Random().nextInt(e ?? n.length)];\n      }\n    } else {\n      o[8] = o[13] = o[18] = o[23] = \"-\";\n      o[14] = \"4\";\n      for (var i = 0; i < 36; i++) {\n        if (o[i].isEmpty) {\n          var r = Random().nextInt(16);\n          o[i] = n[19 == i ? 3 & r | 8 : r];\n        }\n      }\n    }\n    return o.join(\"\");\n  }\n\n  // String getRealUrl(String e) {\n  //   //https://github.com/wbt5/real-url/blob/master/huya.py\n  //   //使用ChatGPT转换的Dart代码,ChatGPT真好用\n  //   List<String> iAndB = e.split('?');\n  //   String i = iAndB[0];\n  //   String b = iAndB[1];\n  //   List<String> r = i.split('/');\n  //   String s = r[r.length - 1].replaceAll(RegExp(r'.(flv|m3u8)'), '');\n  //   List<String> bs = b.split('&');\n  //   List<String> c = [];\n  //   c.addAll(bs.take(3));\n  //   c.add(bs.skip(3).join(\"&\"));\n  //   Map<String, String> n = {};\n  //   for (var str in c) {\n  //     List<String> keyValue = str.split('=');\n  //     n[keyValue[0]] = keyValue[1];\n  //   }\n  //   String fm = Uri.decodeFull(n['fm'] ?? \"\").split(\"&\")[0];\n  //   String u = utf8.decode(base64Decode(fm));\n  //   String p = u.split('_')[0];\n  //   String f = (DateTime.now().millisecondsSinceEpoch * 1000).toString();\n  //   String l = n['wsTime'] ?? \"\";\n  //   String t = '0';\n  //   String h = [p, t, s, f, l].join(\"_\");\n  //   String m = md5.convert(utf8.encode(h)).toString();\n  //   String y = c[c.length - 1];\n  //   String url = \"$i?wsSecret=$m&wsTime=$l&u=$t&seqid=$f&$y\";\n  //   url = url.replaceAll(\"&ctype=tars_mobile\", \"\");\n  //   url = url.replaceAll(RegExp(r\"ratio=\\d+&\"), \"\");\n  //   url = url.replaceAll(RegExp(r\"imgplus_\\d+\"), \"imgplus\");\n  //   return url;\n  // }\n\n  String processAnticode(String anticode, String uid, String streamname) {\n    // 来源：https://github.com/iceking2nd/real-url/blob/master/huya.py\n    // https://github.com/SeaHOH/ykdl/blob/master/ykdl/extractors/huya/live.py\n    // 通过ChatGPT转换的Dart代码\n    var query = Uri.splitQueryString(anticode);\n\n    query[\"t\"] = \"103\";\n    query[\"ctype\"] = \"tars_mobile\";\n\n    final wsTime = (DateTime.now().millisecondsSinceEpoch ~/ 1000 + 21600)\n        .toRadixString(16);\n    final seqId =\n        (DateTime.now().millisecondsSinceEpoch + int.parse(uid)).toString();\n\n    final fm = utf8.decode(base64.decode(Uri.decodeComponent(query['fm']!)));\n    final wsSecretPrefix = fm.split('_').first;\n    final wsSecretHash = md5\n        .convert(utf8.encode('$seqId|${query[\"ctype\"]}|${query[\"t\"]}'))\n        .toString();\n    final wsSecret = md5\n        .convert(utf8.encode(\n            '${wsSecretPrefix}_${uid}_${streamname}_${wsSecretHash}_$wsTime'))\n        .toString();\n\n    return Uri(queryParameters: {\n      \"wsSecret\": wsSecret,\n      \"wsTime\": wsTime,\n      \"seqid\": seqId,\n      \"ctype\": query[\"ctype\"]!,\n      \"ver\": \"1\",\n      \"fs\": query[\"fs\"]!,\n      // \"sphdcdn\": query[\"sphdcdn\"] ?? \"\",\n      // \"sphdDC\": query[\"sphdDC\"] ?? \"\",\n      // \"sphd\": query[\"sphd\"] ?? \"\",\n      // \"exsphd\": query[\"exsphd\"] ?? \"\",\n      \"dMod\": \"mseh-0\",\n      \"sdkPcdn\": \"1_1\",\n      \"uid\": uid,\n      \"uuid\": getUUid(),\n      \"t\": query[\"t\"]!,\n      \"sv\": \"202411221719\",\n      \"sdk_sid\": \"1732862566708\",\n      \"a_block\": \"0\"\n    }).query;\n  }\n\n  @override\n  Future<List<LiveSuperChatMessage>> getSuperChatMessage(\n      {required String roomId}) {\n    //尚不支持\n    return Future.value([]);\n  }\n}\n\nclass HuyaUrlDataModel {\n  final String url;\n  final String uid;\n  List<HuyaLineModel> lines;\n  List<HuyaBitRateModel> bitRates;\n\n  HuyaUrlDataModel({\n    required this.bitRates,\n    required this.lines,\n    required this.url,\n    required this.uid,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"url\": url,\n      \"uid\": uid,\n      \"lines\": lines.map((e) => e.toString()).toList(),\n      \"bitRates\": bitRates.map((e) => e.toString()).toList(),\n    });\n  }\n}\n\nenum HuyaLineType {\n  flv,\n  hls,\n}\n\nclass HuyaLineModel {\n  final String line;\n  final String cdnType;\n  final String flvAntiCode;\n  final String hlsAntiCode;\n  final String streamName;\n  final HuyaLineType lineType;\n  int bitRate;\n  final int presenterUid; // topSid = subSid = presenterUid\n\n  HuyaLineModel({\n    required this.line,\n    required this.lineType,\n    required this.flvAntiCode,\n    required this.hlsAntiCode,\n    required this.streamName,\n    required this.cdnType,\n    this.bitRate = 0,\n    required this.presenterUid,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"line\": line,\n      \"cdnType\": cdnType,\n      \"flvAntiCode\": flvAntiCode,\n      \"hlsAntiCode\": hlsAntiCode,\n      \"streamName\": streamName,\n      \"lineType\": lineType.toString(),\n      \"presenterUid\": presenterUid,\n    });\n  }\n}\n\nclass HuyaBitRateModel {\n  final String name;\n  final int bitRate;\n\n  HuyaBitRateModel({\n    required this.bitRate,\n    required this.name,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"name\": name,\n      \"bitRate\": bitRate,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/interface/live_danmaku.dart",
    "content": "import 'dart:async';\n\nimport 'package:simple_live_core/src/model/live_message.dart';\n\nclass LiveDanmaku {\n  Function(LiveMessage msg)? onMessage;\n  Function(String msg)? onClose;\n  Function()? onReady;\n\n  /// 心跳时间\n  int heartbeatTime = 0;\n\n  /// 发生心跳\n  void heartbeat() {}\n\n  /// 开始接收信息\n  Future start(dynamic args) {\n    return Future.value();\n  }\n\n  /// 停止接收信息\n  Future stop() {\n    return Future.value();\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/interface/live_site.dart",
    "content": "import 'package:simple_live_core/src/model/live_anchor_item.dart';\n\nimport '../interface/live_danmaku.dart';\nimport '../model/live_category_result.dart';\nimport '../model/live_message.dart';\nimport '../model/live_play_url.dart';\nimport '../model/live_room_detail.dart';\nimport '../model/live_search_result.dart';\n\nimport '../model/live_category.dart';\nimport '../model/live_play_quality.dart';\nimport '../model/live_room_item.dart';\n\nclass LiveSite {\n  /// 站点唯一ID\n  String id = \"\";\n\n  /// 站点名称\n  String name = \"\";\n\n  /// 站点名称\n  LiveDanmaku getDanmaku() => LiveDanmaku();\n\n  /// 读取网站的分类\n  Future<List<LiveCategory>> getCategores() {\n    return Future.value(<LiveCategory>[]);\n  }\n\n  /// 搜索直播间\n  Future<LiveSearchRoomResult> searchRooms(String keyword, {int page = 1}) {\n    return Future.value(\n        LiveSearchRoomResult(hasMore: false, items: <LiveRoomItem>[]));\n  }\n\n  /// 搜索直播间\n  Future<LiveSearchAnchorResult> searchAnchors(String keyword, {int page = 1}) {\n    return Future.value(\n        LiveSearchAnchorResult(hasMore: false, items: <LiveAnchorItem>[]));\n  }\n\n  /// 读取类目下房间\n  Future<LiveCategoryResult> getCategoryRooms(LiveSubCategory category,\n      {int page = 1}) {\n    return Future.value(\n        LiveCategoryResult(hasMore: false, items: <LiveRoomItem>[]));\n  }\n\n  /// 读取推荐的房间\n  Future<LiveCategoryResult> getRecommendRooms({int page = 1}) {\n    return Future.value(\n        LiveCategoryResult(hasMore: false, items: <LiveRoomItem>[]));\n  }\n\n  /// 读取房间详情\n  Future<LiveRoomDetail> getRoomDetail({required String roomId}) {\n    return Future.value(LiveRoomDetail(\n      cover: '',\n      online: 0,\n      roomId: '',\n      status: false,\n      title: '',\n      url: '',\n      userAvatar: '',\n      userName: '',\n    ));\n  }\n\n  /// 读取房间清晰度\n  Future<List<LivePlayQuality>> getPlayQualites(\n      {required LiveRoomDetail detail}) {\n    return Future.value(<LivePlayQuality>[]);\n  }\n\n  /// 读取播放链接\n  Future<LivePlayUrl> getPlayUrls(\n      {required LiveRoomDetail detail, required LivePlayQuality quality}) {\n    return Future.value(LivePlayUrl(urls: []));\n  }\n\n  /// 查询直播状态\n  Future<bool> getLiveStatus({required String roomId}) {\n    return Future.value(false);\n  }\n\n  /// 读取指定房间的SC\n  Future<List<LiveSuperChatMessage>> getSuperChatMessage(\n      {required String roomId}) {\n    return Future.value([]);\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_anchor_item.dart",
    "content": "import 'dart:convert';\n\nclass LiveAnchorItem {\n  /// 房间ID\n  final String roomId;\n\n  /// 封面\n  final String avatar;\n\n  /// 用户名\n  final String userName;\n\n  /// 直播中\n  final bool liveStatus;\n\n  LiveAnchorItem({\n    required this.roomId,\n    required this.avatar,\n    required this.userName,\n    required this.liveStatus,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"roomId\": roomId,\n      \"avatar\": avatar,\n      \"userName\": userName,\n      \"liveStatus\": liveStatus,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_category.dart",
    "content": "import 'dart:convert';\n\nclass LiveCategory {\n  final String name;\n  final String id;\n  final List<LiveSubCategory> children;\n  LiveCategory({\n    required this.id,\n    required this.name,\n    required this.children,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"name\": name,\n      \"id\": id,\n      \"children\": children,\n    });\n  }\n}\n\nclass LiveSubCategory {\n  final String name;\n  final String? pic;\n  final String id;\n  final String parentId;\n  LiveSubCategory({\n    required this.id,\n    required this.name,\n    required this.parentId,\n    this.pic,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"name\": name,\n      \"id\": id,\n      \"parentId\": parentId,\n      \"pic\": pic,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_category_result.dart",
    "content": "import 'package:simple_live_core/src/model/live_room_item.dart';\n\nclass LiveCategoryResult {\n  final bool hasMore;\n  final List<LiveRoomItem> items;\n  LiveCategoryResult({\n    required this.hasMore,\n    required this.items,\n  });\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_message.dart",
    "content": "import 'dart:convert';\n\nenum LiveMessageType {\n  /// 聊天\n  chat,\n\n  /// 礼物,暂时不支持\n  gift,\n\n  /// 在线人数\n  online,\n\n  /// 醒目留言\n  superChat,\n}\n\nclass LiveMessage {\n  /// 消息类型\n  final LiveMessageType type;\n\n  /// 用户名\n  final String userName;\n\n  /// 信息\n  final String message;\n\n  /// 数据\n  /// 单Type=Online时，Data为人气值(long)\n  final dynamic data;\n\n  /// 弹幕颜色\n  final LiveMessageColor color;\n  LiveMessage({\n    required this.type,\n    required this.userName,\n    required this.message,\n    this.data,\n    required this.color,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"type\": type.index,\n      \"userName\": userName,\n      \"message\": message,\n      \"data\": data.toString(),\n      \"color\": color.toString(),\n    });\n  }\n}\n\nclass LiveMessageColor {\n  final int r, g, b;\n  LiveMessageColor(this.r, this.g, this.b);\n  static LiveMessageColor get white => LiveMessageColor(255, 255, 255);\n  static LiveMessageColor numberToColor(int intColor) {\n    var obj = intColor.toRadixString(16);\n\n    LiveMessageColor color = LiveMessageColor.white;\n    if (obj.length == 4) {\n      obj = \"00$obj\";\n    }\n    if (obj.length == 6) {\n      var R = int.parse(obj.substring(0, 2), radix: 16);\n      var G = int.parse(obj.substring(2, 4), radix: 16);\n      var B = int.parse(obj.substring(4, 6), radix: 16);\n\n      color = LiveMessageColor(R, G, B);\n    }\n    if (obj.length == 8) {\n      var R = int.parse(obj.substring(2, 4), radix: 16);\n      var G = int.parse(obj.substring(4, 6), radix: 16);\n      var B = int.parse(obj.substring(6, 8), radix: 16);\n      //var A = int.parse(obj.substring(0, 2), radix: 16);\n      color = LiveMessageColor(R, G, B);\n    }\n\n    return color;\n  }\n\n  @override\n  String toString() {\n    return \"#${r.toRadixString(16).padLeft(2, '0')}${g.toRadixString(16).padLeft(2, '0')}${b.toRadixString(16).padLeft(2, '0')}\";\n  }\n}\n\nclass LiveSuperChatMessage {\n  final String userName;\n  final String face;\n  final String message;\n  final int price;\n  final DateTime startTime;\n  final DateTime endTime;\n  final String backgroundColor;\n  final String backgroundBottomColor;\n  LiveSuperChatMessage({\n    required this.backgroundBottomColor,\n    required this.backgroundColor,\n    required this.endTime,\n    required this.face,\n    required this.message,\n    required this.price,\n    required this.startTime,\n    required this.userName,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"userName\": userName,\n      \"face\": face,\n      \"message\": message,\n      \"price\": price,\n      \"startTime\": startTime,\n      \"endTime\": endTime,\n      \"backgroundColor\": backgroundColor,\n      \"backgroundBottomColor\": backgroundBottomColor,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_play_quality.dart",
    "content": "import 'dart:convert';\n\nclass LivePlayQuality {\n  /// 清晰度\n  final String quality;\n\n  /// 清晰度信息\n  final dynamic data;\n\n  final int sort;\n\n  LivePlayQuality({\n    required this.quality,\n    required this.data,\n    this.sort = 0,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"quality\": quality,\n      \"data\": data.toString(),\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_play_url.dart",
    "content": "import 'dart:convert';\n\nclass LivePlayUrl {\n  /// 播放地址\n  final List<String> urls;\n\n  /// 请求头\n  final Map<String, String>? headers;\n\n  LivePlayUrl({\n    required this.urls,\n    this.headers,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"urls\": urls,\n      \"headers\": headers.toString(),\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_room_detail.dart",
    "content": "import 'dart:convert';\n\nclass LiveRoomDetail {\n  /// 房间ID\n  final String roomId;\n\n  /// 房间标题\n  final String title;\n\n  /// 封面\n  final String cover;\n\n  /// 用户名\n  final String userName;\n\n  /// 头像\n  final String userAvatar;\n\n  /// 在线\n  final int online;\n\n  /// 介绍\n  final String? introduction;\n\n  /// 公告\n  final String? notice;\n\n  /// 状态\n  final bool status;\n\n  /// 附加信息\n  final dynamic data;\n\n  /// 弹幕附加信息\n  final dynamic danmakuData;\n\n  /// 是否录播\n  final bool isRecord;\n\n  /// 链接\n  final String url;\n\n  /// 显示时间\n  final String? showTime;\n\n  LiveRoomDetail({\n    required this.roomId,\n    required this.title,\n    required this.cover,\n    required this.userName,\n    required this.userAvatar,\n    required this.online,\n    this.introduction,\n    this.notice,\n    required this.status,\n    this.data,\n    this.danmakuData,\n    required this.url,\n    this.isRecord = false,\n    this.showTime,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"roomId\": roomId,\n      \"title\": title,\n      \"cover\": cover,\n      \"userName\": userName,\n      \"userAvatar\": userAvatar,\n      \"online\": online,\n      \"introduction\": introduction,\n      \"notice\": notice,\n      \"status\": status,\n      \"data\": data.toString(),\n      \"danmakuData\": danmakuData.toString(),\n      \"url\": url,\n      \"isRecord\": isRecord,\n      \"showTime\": showTime,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_room_item.dart",
    "content": "import 'dart:convert';\n\nclass LiveRoomItem {\n  /// 房间ID\n  final String roomId;\n\n  /// 标题\n  final String title;\n\n  /// 封面\n  final String cover;\n\n  /// 用户名\n  final String userName;\n\n  /// 人气/在线人数\n  final int online;\n  LiveRoomItem({\n    required this.roomId,\n    required this.title,\n    required this.cover,\n    required this.userName,\n    this.online = 0,\n  });\n\n  @override\n  String toString() {\n    return json.encode({\n      \"roomId\": roomId,\n      \"title\": title,\n      \"cover\": cover,\n      \"userName\": userName,\n      \"online\": online,\n    });\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/live_search_result.dart",
    "content": "import 'package:simple_live_core/src/model/live_anchor_item.dart';\nimport 'package:simple_live_core/src/model/live_room_item.dart';\n\nclass LiveSearchRoomResult {\n  final bool hasMore;\n  final List<LiveRoomItem> items;\n  LiveSearchRoomResult({\n    required this.hasMore,\n    required this.items,\n  });\n}\n\nclass LiveSearchAnchorResult {\n  final bool hasMore;\n  final List<LiveAnchorItem> items;\n  LiveSearchAnchorResult({\n    required this.hasMore,\n    required this.items,\n  });\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/get_cdn_token_ex_req.dart",
    "content": "﻿\nimport 'package:tars_dart/tars/codec/tars_displayer.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nimport 'huya_user_id.dart';\n\nclass GetCdnTokenExReq extends TarsStruct {\n  String sFlvUrl = \"\"; //tag 0\n  String sStreamName = \"\"; //tag 1\n  int iLoopTime = 0; //tag 2\n  HuyaUserId tId = HuyaUserId(); //tag 3\n  int iAppId = 66; //tag 4\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    sFlvUrl = _is.read(sFlvUrl, 0, false);\n    sStreamName = _is.read(sStreamName, 1, false);\n    iLoopTime = _is.read(iLoopTime, 2, false);\n    tId = _is.read(tId, 3, false);\n    iAppId = _is.read(iAppId, 4, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(sFlvUrl, 0);\n    _os.write(sStreamName, 1);\n    _os.write(iLoopTime, 2);\n    _os.write(tId, 3);\n    _os.write(iAppId, 4);\n  }\n\n  @override\n  TarsStruct deepCopy() {\n    return GetCdnTokenExReq()\n      ..sFlvUrl = sFlvUrl\n      ..sStreamName = sStreamName\n      ..iLoopTime = iLoopTime\n      ..tId = tId\n      ..iAppId = iAppId;\n  }\n\n  @override\n  displayAsString(StringBuffer sb, int level) {\n    TarsDisplayer _ds = TarsDisplayer(sb, level: level);\n    _ds.DisplayString(sFlvUrl, \"sFlvUrl\");\n    _ds.DisplayString(sStreamName, \"sStreamName\");\n    _ds.DisplayInt(iLoopTime, \"iLoopTime\");\n    _ds.DisplayTarsStruct(tId, \"tId\");\n    _ds.DisplayInt(iAppId, \"iAppId\");\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/get_cdn_token_ex_resp.dart",
    "content": "﻿import 'package:tars_dart/tars/codec/tars_displayer.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nclass GetCdnTokenExResp extends TarsStruct {\n  String sFlvToken = \"\"; //tag 0\n  int iExpireTime = 0; //tag 1\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    sFlvToken = _is.read(sFlvToken, 0, false);\n    iExpireTime = _is.read(iExpireTime, 1, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(sFlvToken, 0);\n    _os.write(iExpireTime, 1);\n  }\n\n  @override\n  TarsStruct deepCopy() {\n    return GetCdnTokenExResp()\n      ..sFlvToken = sFlvToken\n      ..iExpireTime = iExpireTime;\n  }\n\n  @override\n  displayAsString(StringBuffer sb, int level) {\n    TarsDisplayer _ds = TarsDisplayer(sb, level: level);\n    _ds.DisplayString(sFlvToken, \"sFlvToken\");\n    _ds.DisplayInt(iExpireTime, \"iExpireTime\");\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/get_cdn_token_req.dart",
    "content": "// ignore_for_file: no_leading_underscores_for_local_identifiers\n\nimport 'package:tars_dart/tars/codec/tars_displayer.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nclass GetCdnTokenReq extends TarsStruct {\n  String url = \"\";\n\n  String cdnType = \"\";\n\n  String streamName = \"\";\n\n  int presenterUid = 0;\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    url = _is.read(url, 0, false);\n    cdnType = _is.read(cdnType, 1, false);\n    streamName = _is.read(streamName, 2, false);\n    presenterUid = _is.read(presenterUid, 3, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(url, 0);\n    _os.write(cdnType, 1);\n    _os.write(streamName, 2);\n    _os.write(presenterUid, 3);\n  }\n\n  @override\n  Object deepCopy() {\n    return GetCdnTokenReq()\n      ..url = url\n      ..cdnType = cdnType\n      ..streamName = streamName\n      ..presenterUid = presenterUid;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {\n    TarsDisplayer _ds = TarsDisplayer(sb, level: level);\n    _ds.DisplayString(url, \"url\");\n    _ds.DisplayString(cdnType, \"cdnType\");\n    _ds.DisplayString(streamName, \"streamName\");\n    _ds.DisplayInt(presenterUid, \"presenterUid\");\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/get_cdn_token_resp.dart",
    "content": "// ignore_for_file: no_leading_underscores_for_local_identifiers\n\nimport 'package:tars_dart/tars/codec/tars_displayer.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nclass GetCdnTokenResp extends TarsStruct {\n  String url = \"\";\n\n  String cdnType = \"\";\n\n  String streamName = \"\";\n\n  int presenterUid = 0;\n\n  String antiCode = \"\";\n\n  String sTime = \"\";\n\n  String flvAntiCode = \"\";\n\n  String hlsAntiCode = \"\";\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    url = _is.read(url, 0, false);\n    cdnType = _is.read(cdnType, 1, false);\n    streamName = _is.read(streamName, 2, false);\n    presenterUid = _is.read(presenterUid, 3, false);\n    antiCode = _is.read(antiCode, 4, false);\n    sTime = _is.read(sTime, 5, false);\n    flvAntiCode = _is.read(flvAntiCode, 6, false);\n    hlsAntiCode = _is.read(hlsAntiCode, 7, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(url, 0);\n    _os.write(cdnType, 1);\n    _os.write(streamName, 2);\n    _os.write(presenterUid, 3);\n    _os.write(antiCode, 4);\n    _os.write(sTime, 5);\n    _os.write(flvAntiCode, 6);\n    _os.write(hlsAntiCode, 7);\n  }\n\n  @override\n  Object deepCopy() {\n    return GetCdnTokenResp()\n      ..url = url\n      ..cdnType = cdnType\n      ..streamName = streamName\n      ..presenterUid = presenterUid\n      ..antiCode = antiCode\n      ..sTime = sTime\n      ..flvAntiCode = flvAntiCode\n      ..hlsAntiCode = hlsAntiCode;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {\n    TarsDisplayer _ds = TarsDisplayer(sb, level: level);\n    _ds.DisplayString(url, \"url\");\n    _ds.DisplayString(cdnType, \"cdnType\");\n    _ds.DisplayString(streamName, \"streamName\");\n    _ds.DisplayInt(presenterUid, \"presenterUid\");\n    _ds.DisplayString(antiCode, \"antiCode\");\n    _ds.DisplayString(sTime, \"sTime\");\n    _ds.DisplayString(flvAntiCode, \"flvAntiCode\");\n    _ds.DisplayString(hlsAntiCode, \"hlsAntiCode\");\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/huya_danmaku.dart",
    "content": "// ignore_for_file: no_leading_underscores_for_local_identifiers\n\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nclass HYPushMessage extends TarsStruct {\n  int pushType = 0;\n  int uri = 0;\n  List<int> msg = <int>[];\n  int protocolType = 0;\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    pushType = _is.read(pushType, 0, false);\n    uri = _is.read(uri, 1, false);\n    msg = _is.readBytes(2, false);\n    protocolType = _is.read(protocolType, 3, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {}\n\n  @override\n  Object deepCopy() {\n    return HYPushMessage()\n      ..pushType = pushType\n      ..uri = uri\n      ..msg = List<int>.from(msg)\n      ..protocolType = protocolType;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {}\n}\n\nclass HYSender extends TarsStruct {\n  int uid = 0;\n  int lMid = 0;\n  String nickName = \"\";\n  int gender = 0;\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    uid = _is.read(uid, 0, false);\n    lMid = _is.read(lMid, 0, false);\n    nickName = _is.read(nickName, 2, false);\n    gender = _is.read(gender, 3, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {}\n\n  @override\n  Object deepCopy() {\n    return HYSender()\n      ..uid = uid\n      ..lMid = lMid\n      ..nickName = nickName\n      ..gender = gender;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {}\n}\n\nclass HYMessage extends TarsStruct {\n  HYSender userInfo = HYSender();\n  String content = \"\";\n  HYBulletFormat bulletFormat = HYBulletFormat();\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    userInfo = _is.readTarsStruct(userInfo, 0, false) as HYSender;\n    content = _is.read(content, 3, false);\n    bulletFormat = _is.readTarsStruct(bulletFormat, 6, false) as HYBulletFormat;\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {}\n\n  @override\n  Object deepCopy() {\n    return HYMessage()\n      ..userInfo = userInfo.deepCopy() as HYSender\n      ..content = content\n      ..bulletFormat = bulletFormat.deepCopy() as HYBulletFormat;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {}\n}\n\nclass HYBulletFormat extends TarsStruct {\n  int fontColor = 0;\n  int fontSize = 4;\n  int textSpeed = 0;\n  int transitionType = 1;\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    fontColor = _is.read(fontColor, 0, false);\n    fontSize = _is.read(fontSize, 1, false);\n    textSpeed = _is.read(textSpeed, 2, false);\n    transitionType = _is.read(transitionType, 3, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {}\n\n  @override\n  Object deepCopy() {\n    return HYBulletFormat()\n      ..fontColor = fontColor\n      ..fontSize = fontSize\n      ..textSpeed = textSpeed\n      ..transitionType = transitionType;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {}\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/huya_user_id.dart",
    "content": "﻿import 'package:tars_dart/tars/codec/tars_displayer.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_struct.dart';\n\nclass HuyaUserId extends TarsStruct {\n  int lUid = 0;\n  String sGuid = \"\";\n  String sToken = \"\";\n  String sHuYaUA = \"\";\n  String sCookie = \"\";\n  int iTokenType = 0;\n  String sDeviceInfo = \"\";\n  String sQIMEI = \"\";\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    lUid = _is.read(lUid, 0, false);\n    sGuid = _is.read(sGuid, 1, false);\n    sToken = _is.read(sToken, 2, false);\n    sHuYaUA = _is.read(sHuYaUA, 3, false);\n    sCookie = _is.read(sCookie, 4, false);\n    iTokenType = _is.read(iTokenType, 5, false);\n    sDeviceInfo = _is.read(sDeviceInfo, 6, false);\n    sQIMEI = _is.read(sQIMEI, 7, false);\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(lUid, 0);\n    _os.write(sGuid, 1);\n    _os.write(sToken, 2);\n    _os.write(sHuYaUA, 3);\n    _os.write(sCookie, 4);\n    _os.write(iTokenType, 5);\n    _os.write(sDeviceInfo, 6);\n    _os.write(sQIMEI, 7);\n  }\n\n  @override\n  Object deepCopy() {\n    return HuyaUserId()\n      ..lUid = lUid\n      ..sGuid = sGuid\n      ..sToken = sToken\n      ..sHuYaUA = sHuYaUA\n      ..sCookie = sCookie\n      ..iTokenType = iTokenType\n      ..sDeviceInfo = sDeviceInfo\n      ..sQIMEI = sQIMEI;\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {\n    TarsDisplayer _ds = TarsDisplayer(sb, level: level);\n    _ds.DisplayInt(lUid, \"lUid\");\n    _ds.DisplayString(sGuid, \"sGuid\");\n    _ds.DisplayString(sToken, \"sToken\");\n    _ds.DisplayString(sHuYaUA, \"sHuYaUA\");\n    _ds.DisplayString(sCookie, \"sCookie\");\n    _ds.DisplayInt(iTokenType, \"iTokenType\");\n    _ds.DisplayString(sDeviceInfo, \"sDeviceInfo\");\n    _ds.DisplayString(sQIMEI, \"sQIMEI\");\n  }\n}"
  },
  {
    "path": "simple_live_core/lib/src/model/tars/tar2dart.dart",
    "content": "﻿import 'dart:io';\n\n// 需要所有字段有 //tag n 注释方便定位-多行编辑生成\n// 可以自动生成这个tag,懒得弄了\nfinal fieldRegex = RegExp(\n  r'^\\s*(\\w+(?:<[^>]+>)?)\\s+(\\w+)\\s*=\\s*[^;]+;\\s*//\\s*tag\\s*(\\d+)',\n);\nfinal classRegex = RegExp(r'class\\s+(\\w+)\\s+extends\\s+TarsStruct');\n\nvoid main(List<String> args) {\n  if (args.isEmpty) {\n    print('Usage: dart run tars_codegen.dart <file.dart>');\n    exit(1);\n  }\n\n  final file = File(args[0]);\n  final lines = file.readAsLinesSync();\n\n  final fields = <Field>[];\n  for (final line in lines) {\n    final m = classRegex.firstMatch(line);\n    if (m != null) {\n      className = m.group(1);\n      break;\n    }\n  }\n  if (className == null) {\n    throw Exception('No class extends TarsStruct found');\n  }\n  for (final line in lines) {\n    final match = fieldRegex.firstMatch(line);\n    if (match != null) {\n      fields.add(Field(\n        type: match.group(1)!,\n        name: match.group(2)!,\n        tag: int.parse(match.group(3)!),\n      ));\n    }\n  }\n\n  fields.sort((a, b) => a.tag.compareTo(b.tag));\n\n  print(generate(fields));\n}\n\nString generate(List<Field> fields) {\n  final sb = StringBuffer();\n\n  // readFrom\n  sb.writeln('@override');\n  sb.writeln('void readFrom(TarsInputStream _is) {');\n  for (final f in fields) {\n    sb.writeln(\n      '  ${padRight(f.name, 20)} = _is.read(${f.name}, ${f.tag}, false);',\n    );\n  }\n  sb.writeln('}\\n');\n\n  // writeTo\n  sb.writeln('@override');\n  sb.writeln('void writeTo(TarsOutputStream _os) {');\n  for (final f in fields) {\n    sb.writeln('  _os.write(${f.name}, ${f.tag});');\n  }\n  sb.writeln('}\\n');\n\n  // deepCopy\n  sb.writeln('@override');\n  sb.writeln('TarsStruct deepCopy() {');\n  sb.writeln('  return $className()');\n  for (final f in fields) {\n    sb.writeln('    ..${f.name} = ${f.name}');\n  }\n  sb.writeln('  ;');\n  sb.writeln('}\\n');\n\n  // display\n  sb.writeln('@override');\n  sb.writeln('displayAsString(StringBuffer sb, int level) {');\n  sb.writeln('  TarsDisplayer _ds = TarsDisplayer(sb, level: level);');\n\n  for (final f in fields) {\n    sb.writeln(\n      '  _ds.${displayMethod(f.type)}(${f.name}, \"${f.name}\");',\n    );\n  }\n  sb.writeln('}');\n\n  return sb.toString();\n}\n\nString displayMethod(String type) {\n  if (type.startsWith('List')) return 'DisplayList';\n  if (type.startsWith('Map')) return 'DisplayMap';\n  if (type == 'String') return 'DisplayString';\n  if (type == 'int') return 'DisplayInt';\n  return 'DisplayTarsStruct';\n}\n\nString padRight(String s, int width) => s + ' ' * (width - s.length);\n\nlate String? className;\n\nclass Field {\n  final String type;\n  final String name;\n  final int tag;\n\n  Field({\n    required this.type,\n    required this.name,\n    required this.tag,\n  });\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/scripts/douyin_sign.dart",
    "content": "import 'dart:math';\nimport 'package:dart_quickjs/dart_quickjs.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:crypto/crypto.dart';\n\nclass DouyinSign {\n  static const kABogus = r'''\nfunction getABogus(params, userAgent) {\n\n    // All the content in this article is only for learning and communication use, not for any other purpose, strictly prohibited for commercial use and illegal use, otherwise all the consequences are irrelevant to the author!\n    function rc4_encrypt(plaintext, key) {\n        var s = [];\n        for (var i = 0; i < 256; i++) {\n            s[i] = i;\n        }\n        var j = 0;\n        for (var i = 0; i < 256; i++) {\n            j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n            var temp = s[i];\n            s[i] = s[j];\n            s[j] = temp;\n        }\n\n        var i = 0;\n        var j = 0;\n        var cipher = [];\n        for (var k = 0; k < plaintext.length; k++) {\n            i = (i + 1) % 256;\n            j = (j + s[i]) % 256;\n            var temp = s[i];\n            s[i] = s[j];\n            s[j] = temp;\n            var t = (s[i] + s[j]) % 256;\n            cipher.push(String.fromCharCode(s[t] ^ plaintext.charCodeAt(k)));\n        }\n        return cipher.join('');\n    }\n\n    function le(e, r) {\n        return (e << (r %= 32) | e >>> 32 - r) >>> 0\n    }\n\n    function de(e) {\n        return 0 <= e && e < 16 ? 2043430169 : 16 <= e && e < 64 ? 2055708042 : void console['error'](\"invalid j for constant Tj\")\n    }\n\n    function pe(e, r, t, n) {\n        return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | r & n | t & n) >>> 0 : (console['error']('invalid j for bool function FF'),\n            0)\n    }\n\n    function he(e, r, t, n) {\n        return 0 <= e && e < 16 ? (r ^ t ^ n) >>> 0 : 16 <= e && e < 64 ? (r & t | ~r & n) >>> 0 : (console['error']('invalid j for bool function GG'),\n            0)\n    }\n\n    function reset() {\n        this.reg[0] = 1937774191,\n            this.reg[1] = 1226093241,\n            this.reg[2] = 388252375,\n            this.reg[3] = 3666478592,\n            this.reg[4] = 2842636476,\n            this.reg[5] = 372324522,\n            this.reg[6] = 3817729613,\n            this.reg[7] = 2969243214,\n            this[\"chunk\"] = [],\n            this[\"size\"] = 0\n    }\n\n    function write(e) {\n        var a = \"string\" == typeof e ? function (e) {\n            n = encodeURIComponent(e)['replace'](/%([0-9A-F]{2})/g, (function (e, r) {\n                return String['fromCharCode'](\"0x\" + r)\n            }\n            ))\n                , a = new Array(n['length']);\n            return Array['prototype']['forEach']['call'](n, (function (e, r) {\n                a[r] = e.charCodeAt(0)\n            }\n            )),\n                a\n        }(e) : e;\n        this.size += a.length;\n        var f = 64 - this['chunk']['length'];\n        if (a['length'] < f)\n            this['chunk'] = this['chunk'].concat(a);\n        else\n            for (this['chunk'] = this['chunk'].concat(a.slice(0, f)); this['chunk'].length >= 64;)\n                this['_compress'](this['chunk']),\n                    f < a['length'] ? this['chunk'] = a['slice'](f, Math['min'](f + 64, a['length'])) : this['chunk'] = [],\n                    f += 64\n    }\n\n    function sum(e, t) {\n        e && (this['reset'](),\n            this['write'](e)),\n            this['_fill']();\n        for (var f = 0; f < this.chunk['length']; f += 64)\n            this._compress(this['chunk']['slice'](f, f + 64));\n        var i = null;\n        if (t == 'hex') {\n            i = \"\";\n            for (f = 0; f < 8; f++)\n                i += se(this['reg'][f]['toString'](16), 8, \"0\")\n        } else\n            for (i = new Array(32),\n                f = 0; f < 8; f++) {\n                var c = this.reg[f];\n                i[4 * f + 3] = (255 & c) >>> 0,\n                    c >>>= 8,\n                    i[4 * f + 2] = (255 & c) >>> 0,\n                    c >>>= 8,\n                    i[4 * f + 1] = (255 & c) >>> 0,\n                    c >>>= 8,\n                    i[4 * f] = (255 & c) >>> 0\n            }\n        return this['reset'](),\n            i\n    }\n\n    function _compress(t) {\n        if (t < 64)\n            console.error(\"compress error: not enough data\");\n        else {\n            for (var f = function (e) {\n                for (var r = new Array(132), t = 0; t < 16; t++)\n                    r[t] = e[4 * t] << 24,\n                        r[t] |= e[4 * t + 1] << 16,\n                        r[t] |= e[4 * t + 2] << 8,\n                        r[t] |= e[4 * t + 3],\n                        r[t] >>>= 0;\n                for (var n = 16; n < 68; n++) {\n                    var a = r[n - 16] ^ r[n - 9] ^ le(r[n - 3], 15);\n                    a = a ^ le(a, 15) ^ le(a, 23),\n                        r[n] = (a ^ le(r[n - 13], 7) ^ r[n - 6]) >>> 0\n                }\n                for (n = 0; n < 64; n++)\n                    r[n + 68] = (r[n] ^ r[n + 4]) >>> 0;\n                return r\n            }(t), i = this['reg'].slice(0), c = 0; c < 64; c++) {\n                var o = le(i[0], 12) + i[4] + le(de(c), c)\n                    , s = ((o = le(o = (4294967295 & o) >>> 0, 7)) ^ le(i[0], 12)) >>> 0\n                    , u = pe(c, i[0], i[1], i[2]);\n                u = (4294967295 & (u = u + i[3] + s + f[c + 68])) >>> 0;\n                var b = he(c, i[4], i[5], i[6]);\n                b = (4294967295 & (b = b + i[7] + o + f[c])) >>> 0,\n                    i[3] = i[2],\n                    i[2] = le(i[1], 9),\n                    i[1] = i[0],\n                    i[0] = u,\n                    i[7] = i[6],\n                    i[6] = le(i[5], 19),\n                    i[5] = i[4],\n                    i[4] = (b ^ le(b, 9) ^ le(b, 17)) >>> 0\n            }\n            for (var l = 0; l < 8; l++)\n                this['reg'][l] = (this['reg'][l] ^ i[l]) >>> 0\n        }\n    }\n\n    function _fill() {\n        var a = 8 * this['size']\n            , f = this['chunk']['push'](128) % 64;\n        for (64 - f < 8 && (f -= 64); f < 56; f++)\n            this.chunk['push'](0);\n        for (var i = 0; i < 4; i++) {\n            var c = Math['floor'](a / 4294967296);\n            this['chunk'].push(c >>> 8 * (3 - i) & 255)\n        }\n        for (i = 0; i < 4; i++)\n            this['chunk']['push'](a >>> 8 * (3 - i) & 255)\n\n    }\n\n    function SM3() {\n        this.reg = [];\n        this.chunk = [];\n        this.size = 0;\n        this.reset()\n    }\n    SM3.prototype.reset = reset;\n    SM3.prototype.write = write;\n    SM3.prototype.sum = sum;\n    SM3.prototype._compress = _compress;\n    SM3.prototype._fill = _fill;\n\n    function result_encrypt(long_str, num = null) {\n        let s_obj = {\n            \"s0\": \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n            \"s1\": \"Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=\",\n            \"s2\": \"Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=\",\n            \"s3\": \"ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe\",\n            \"s4\": \"Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe\"\n        }\n        let constant = {\n            \"0\": 16515072,\n            \"1\": 258048,\n            \"2\": 4032,\n            \"str\": s_obj[num],\n        }\n\n        let result = \"\";\n        let lound = 0;\n        let long_int = get_long_int(lound, long_str);\n        for (let i = 0; i < long_str.length / 3 * 4; i++) {\n            if (Math.floor(i / 4) !== lound) {\n                lound += 1;\n                long_int = get_long_int(lound, long_str);\n            }\n            let key = i % 4;\n            switch (key) {\n                case 0:\n                    temp_int = (long_int & constant[\"0\"]) >> 18;\n                    result += constant[\"str\"].charAt(temp_int);\n                    break;\n                case 1:\n                    temp_int = (long_int & constant[\"1\"]) >> 12;\n                    result += constant[\"str\"].charAt(temp_int);\n                    break;\n                case 2:\n                    temp_int = (long_int & constant[\"2\"]) >> 6;\n                    result += constant[\"str\"].charAt(temp_int);\n                    break;\n                case 3:\n                    temp_int = long_int & 63;\n                    result += constant[\"str\"].charAt(temp_int);\n                    break;\n                default:\n                    break;\n            }\n        }\n        return result;\n    }\n\n    function get_long_int(round, long_str) {\n        round = round * 3;\n        return (long_str.charCodeAt(round) << 16) | (long_str.charCodeAt(round + 1) << 8) | (long_str.charCodeAt(round + 2));\n    }\n\n    function gener_random(random, option) {\n        return [\n            (random & 255 & 170) | option[0] & 85, // 163\n            (random & 255 & 85) | option[0] & 170, //87\n            (random >> 8 & 255 & 170) | option[1] & 85, //37\n            (random >> 8 & 255 & 85) | option[1] & 170, //41\n        ]\n    }\n\n    //////////////////////////////////////////////\n    function generate_rc4_bb_str(url_search_params, user_agent, window_env_str, suffix = \"cus\", Arguments = [0, 1, 14]) {\n        let sm3 = new SM3()\n        let start_time = Date.now()\n        /**\n         * 进行3次加密处理\n         * 1: url_search_params两次sm3之的结果\n         * 2: 对后缀两次sm3之的结果\n         * 3: 对ua处理之后的结果\n         */\n        // url_search_params两次sm3之的结果\n        let url_search_params_list = sm3.sum(sm3.sum(url_search_params + suffix))\n        // 对后缀两次sm3之的结果\n        let cus = sm3.sum(sm3.sum(suffix))\n        // 对ua处理之后的结果\n        let ua = sm3.sum(result_encrypt(rc4_encrypt(user_agent, String.fromCharCode.apply(null, [0.00390625, 1, 14])), \"s3\"))\n        //\n        let end_time = Date.now()\n        // b\n        let b = {\n            8: 3, // 固定\n            10: end_time, //3次加密结束时间\n            15: {\n                \"aid\": 6383,\n                \"pageId\": 6241,\n                \"boe\": false,\n                \"ddrt\": 7,\n                \"paths\": {\n                    \"include\": [\n                        {},\n                        {},\n                        {},\n                        {},\n                        {},\n                        {},\n                        {}\n                    ],\n                    \"exclude\": []\n                },\n                \"track\": {\n                    \"mode\": 0,\n                    \"delay\": 300,\n                    \"paths\": []\n                },\n                \"dump\": true,\n                \"rpU\": \"\"\n            },\n            16: start_time, //3次加密开始时间\n            18: 44, //固定\n            19: [1, 0, 1, 5],\n        }\n\n        //3次加密开始时间\n        b[20] = (b[16] >> 24) & 255\n        b[21] = (b[16] >> 16) & 255\n        b[22] = (b[16] >> 8) & 255\n        b[23] = b[16] & 255\n        b[24] = (b[16] / 256 / 256 / 256 / 256) >> 0\n        b[25] = (b[16] / 256 / 256 / 256 / 256 / 256) >> 0\n\n        // 参数Arguments [0, 1, 14, ...]\n        // let Arguments = [0, 1, 14]\n        b[26] = (Arguments[0] >> 24) & 255\n        b[27] = (Arguments[0] >> 16) & 255\n        b[28] = (Arguments[0] >> 8) & 255\n        b[29] = Arguments[0] & 255\n\n        b[30] = (Arguments[1] / 256) & 255\n        b[31] = (Arguments[1] % 256) & 255\n        b[32] = (Arguments[1] >> 24) & 255\n        b[33] = (Arguments[1] >> 16) & 255\n\n        b[34] = (Arguments[2] >> 24) & 255\n        b[35] = (Arguments[2] >> 16) & 255\n        b[36] = (Arguments[2] >> 8) & 255\n        b[37] = Arguments[2] & 255\n\n        // (url_search_params + \"cus\") 两次sm3之的结果\n        /**let url_search_params_list = [\n         91, 186,  35,  86, 143, 253,   6,  76,\n         34,  21, 167, 148,   7,  42, 192, 219,\n         188,  20, 182,  85, 213,  74, 213, 147,\n         37, 155,  93, 139,  85, 118, 228, 213\n         ]*/\n        b[38] = url_search_params_list[21]\n        b[39] = url_search_params_list[22]\n\n        // (\"cus\") 对后缀两次sm3之的结果\n        /**\n         * let cus = [\n         136, 101, 114, 147,  58,  77, 207, 201,\n         215, 162, 154,  93, 248,  13, 142, 160,\n         105,  73, 215, 241,  83,  58,  51,  43,\n         255,  38, 168, 141, 216, 194,  35, 236\n         ]*/\n        b[40] = cus[21]\n        b[41] = cus[22]\n\n        // 对ua处理之后的结果\n        /**\n         * let ua = [\n         129, 190,  70, 186,  86, 196, 199,  53,\n         99,  38,  29, 209, 243,  17, 157,  69,\n         147, 104,  53,  23, 114, 126,  66, 228,\n         135,  30, 168, 185, 109, 156, 251,  88\n         ]*/\n        b[42] = ua[23]\n        b[43] = ua[24]\n\n        //3次加密结束时间\n        b[44] = (b[10] >> 24) & 255\n        b[45] = (b[10] >> 16) & 255\n        b[46] = (b[10] >> 8) & 255\n        b[47] = b[10] & 255\n        b[48] = b[8]\n        b[49] = (b[10] / 256 / 256 / 256 / 256) >> 0\n        b[50] = (b[10] / 256 / 256 / 256 / 256 / 256) >> 0\n\n\n        // object配置项\n        b[51] = b[15]['pageId']\n        b[52] = (b[15]['pageId'] >> 24) & 255\n        b[53] = (b[15]['pageId'] >> 16) & 255\n        b[54] = (b[15]['pageId'] >> 8) & 255\n        b[55] = b[15]['pageId'] & 255\n\n        b[56] = b[15]['aid']\n        b[57] = b[15]['aid'] & 255\n        b[58] = (b[15]['aid'] >> 8) & 255\n        b[59] = (b[15]['aid'] >> 16) & 255\n        b[60] = (b[15]['aid'] >> 24) & 255\n\n        // 中间进行了环境检测\n        // 代码索引:  2496 索引值:  17 （索引64关键条件）\n        // '1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32'.charCodeAt()得到65位数组\n        /**\n         * let window_env_list = [49, 53, 51, 54, 124, 55, 52, 55, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 48, 124, 51,\n         * 48, 124, 48, 124, 48, 124, 49, 53, 51, 54, 124, 56, 51, 52, 124, 49, 53, 51, 54, 124, 56,\n         * 54, 52, 124, 49, 53, 50, 53, 124, 55, 52, 55, 124, 50, 52, 124, 50, 52, 124, 87, 105, 110,\n         * 51, 50]\n         */\n        let window_env_list = [];\n        for (let index = 0; index < window_env_str.length; index++) {\n            window_env_list.push(window_env_str.charCodeAt(index))\n        }\n        b[64] = window_env_list.length\n        b[65] = b[64] & 255\n        b[66] = (b[64] >> 8) & 255\n\n        b[69] = [].length\n        b[70] = b[69] & 255\n        b[71] = (b[69] >> 8) & 255\n\n        b[72] = b[18] ^ b[20] ^ b[26] ^ b[30] ^ b[38] ^ b[40] ^ b[42] ^ b[21] ^ b[27] ^ b[31] ^ b[35] ^ b[39] ^ b[41] ^ b[43] ^ b[22] ^\n            b[28] ^ b[32] ^ b[36] ^ b[23] ^ b[29] ^ b[33] ^ b[37] ^ b[44] ^ b[45] ^ b[46] ^ b[47] ^ b[48] ^ b[49] ^ b[50] ^ b[24] ^\n            b[25] ^ b[52] ^ b[53] ^ b[54] ^ b[55] ^ b[57] ^ b[58] ^ b[59] ^ b[60] ^ b[65] ^ b[66] ^ b[70] ^ b[71]\n        let bb = [\n            b[18], b[20], b[52], b[26], b[30], b[34], b[58], b[38], b[40], b[53], b[42], b[21], b[27], b[54], b[55], b[31],\n            b[35], b[57], b[39], b[41], b[43], b[22], b[28], b[32], b[60], b[36], b[23], b[29], b[33], b[37], b[44], b[45],\n            b[59], b[46], b[47], b[48], b[49], b[50], b[24], b[25], b[65], b[66], b[70], b[71]\n        ]\n        bb = bb.concat(window_env_list).concat(b[72])\n        return rc4_encrypt(String.fromCharCode.apply(null, bb), String.fromCharCode.apply(null, [121]));\n    }\n\n    function generate_random_str() {\n        let random_str_list = []\n        random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [3, 45]))\n        random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 0]))\n        random_str_list = random_str_list.concat(gener_random(Math.random() * 10000, [1, 5]))\n        return String.fromCharCode.apply(null, random_str_list)\n    }\n\n    function generate_a_bogus(url_search_params, user_agent) {\n        /**\n         * url_search_params：\"device_platform=webapp&aid=6383&channel=channel_pc_web&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=123.0.0.0&browser_online=true&engine_name=Blink&engine_version=123.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7362810250930783783&msToken=VkDUvz1y24CppXSl80iFPr6ez-3FiizcwD7fI1OqBt6IICq9RWG7nCvxKb8IVi55mFd-wnqoNkXGnxHrikQb4PuKob5Q-YhDp5Um215JzlBszkUyiEvR\"\n         * user_agent：\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"\n         */\n        let result_str = generate_random_str() + generate_rc4_bb_str(\n            url_search_params,\n            user_agent,\n            \"1536|747|1536|834|0|30|0|0|1536|834|1536|864|1525|747|24|24|Win32\"\n        );\n        return result_encrypt(result_str, \"s4\") + \"=\";\n    }\n\n    //测试调用\n    // console.log(generate_a_bogus(\n    //     \"device_platform=webapp&aid=6383&channel=channel_pc_web&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=123.0.0.0&browser_online=true&engine_name=Blink&engine_version=123.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7362810250930783783&msToken=VkDUvz1y24CppXSl80iFPr6ez-3FiizcwD7fI1OqBt6IICq9RWG7nCvxKb8IVi55mFd-wnqoNkXGnxHrikQb4PuKob5Q-YhDp5Um215JzlBszkUyiEvR\",\n    //     \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"\n    // ));\n    return generate_a_bogus(params, userAgent);\n\n}\n''';\n\n  static const kWebMsSDK = r'''\nfunction getMSSDKSignature(msStub, userAgent) {\n    document = {}\n    window = {}\n    navigator = {\n        userAgent: userAgent\n    }\n\n    var crawler\n\n    /** 1.0.0.53 */\n    if (!window.byted_acrawler) {\n        function w_0x25f3(_0x545d0a, _0xb73ac6) {\n            var _0x4173a9 = w_0x42f5()\n            return (\n                (w_0x25f3 = function (_0x138003, _0x35a375) {\n                    _0x138003 = _0x138003 - (-0x1 * -0xd15 + -0x1044 + 0x48d)\n                    var _0x484578 = _0x4173a9[_0x138003]\n                    return _0x484578\n                }),\n                w_0x25f3(_0x545d0a, _0xb73ac6)\n            )\n        }\n\n        ; (function (_0x2afeae, _0x11644f) {\n            var _0x34f31d = w_0x25f3,\n                _0x222a7c = _0x2afeae()\n            while (!![]) {\n                try {\n                    var _0x5a962 =\n                        (-parseInt(_0x34f31d(0x31b)) / (-0x1c * 0xac + 0x22 * 0x121 + 0x1 * -0x1391)) *\n                        (-parseInt(_0x34f31d(0x26a)) / (0xa27 * -0x1 + 0x683 * -0x5 + 0x4 * 0xaae)) +\n                        parseInt(_0x34f31d(0x296)) / (-0x18c1 + 0xa9a + 0x715 * 0x2) +\n                        (-parseInt(_0x34f31d(0x1f3)) / (0x446 * 0x4 + 0x649 + -0x175d)) *\n                        (parseInt(_0x34f31d(0x31c)) / (0x3 * -0xbbf + 0xf67 * 0x1 + -0x12b * -0x11)) +\n                        (parseInt(_0x34f31d(0x347)) / (-0x102f * 0x2 + 0x9e * 0x19 + 0x10f6)) *\n                        (-parseInt(_0x34f31d(0x28f)) / (-0x1 * 0x1817 + -0x1 * -0x184d + -0x2f)) +\n                        (-parseInt(_0x34f31d(0x241)) / (0x779 * -0x1 + -0x1e1d + 0x259e)) *\n                        (-parseInt(_0x34f31d(0x2b9)) / (-0x435 + -0x8c9 * 0x2 + 0x1 * 0x15d0)) +\n                        (-parseInt(_0x34f31d(0x295)) / (0x246e + 0x1 * -0x1c79 + 0x7eb * -0x1)) *\n                        (-parseInt(_0x34f31d(0x291)) / (-0x1b67 + -0x3c3 * -0x3 + 0x1029)) +\n                        (parseInt(_0x34f31d(0x307)) / (0x1c3d + -0xaa0 + 0x3 * -0x5db)) *\n                        (-parseInt(_0x34f31d(0x39d)) / (-0x18de + -0x3 * -0x6f7 + 0x406))\n                    if (_0x5a962 === _0x11644f) break\n                    else _0x222a7c['push'](_0x222a7c['shift']())\n                } catch (_0x4c4ab0) {\n                    _0x222a7c['push'](_0x222a7c['shift']())\n                }\n            }\n        })(w_0x42f5, -0x131739 + 0x156382 + -0x7 * -0x144df)\n\n        function w_0x42f5() {\n            var _0x458f30 = [\n                '\\x20can\\x27t\\x20have\\x20a\\x20.',\n                '484e4f4a403f5243001f3009ad9ffc90000000dc0b1204fb00000477110001033f2e17000135491102004a120000110001110001031a2747000503414500201100010334274700050347450012110001033e2747000603041d45000303111d184301421101021400020211000211000103182c43010211000211000103122c43011802110002110001030c2c4301180211000211000103062c43011802110002110001430118421100011401010211010311000103022c430142110101031c2b11000103042d2f1400021100011401010211010311000243014202110103110101031a2b11000103062d2f4301021101021100014301184205000000003b0114000205000000473b01140003050000008b3b01140004050000009e3b0114000505000000be3b0114000603001400010300140007030014000811010144004a12000143000403e81b03002d14000911010212000232330033021101030211010303001100090700031843021101041200044a12000511010412000612000703021843014302050000fff11c140008110009110008050000fff11a3103002d4a1200080302430114000a11000a14000b11000a12000703202947001811000a4a12000511000a120007032019430114000b45004511000a12000703202747003907000314000c030014000d11000d032011000a120007192747001411000c0700091817000c354917000d214945ffdc11000c11000b1814000b07000a11000b18140007021101051100070302430214000702110103030011000707000318430214000e02110106430014000f11011807000b25470004014500010011000f07000c1607000314001011011612000d3300131101074a12000e11011612000d430107000f2647006503001400111101161200104700290211010803001101074a12000e0211010911011612000d1101161200104302430143021400114500200211010803001101074a12000e0211010a11011612000d43014301430214001107001111001118070012181400100211010b110116120013430114001211011612001447001511010c4a12001511001211011612001443024500031100121400121100100211010d110012430118140010110010070016180211010e1101161200134301180700121814001011001007001718070018181400100211010f11000f4301140013110102120002323300060211011043001400141101021200023233001811011112001934000f021101120211011307001a430143011400150211000411000743010211000511000706001b1b03002d4301180211000611001411000731430118021100040211010311000e1101021200023233000611011412001c4a12000843004302050000fff11c03102b0211010311000e110010070003184302050000fff11c2f4301180211000511001303082b11010212001d03042b2f110007314301180211000311000843011814001602110006030043014911001547000a1100161100151814001607001e1100161814001702110108030011001743024a120008031043011400181100184a12001f1100181200070302191100181200074302140019110017110019181400171100174200200c6b7f62604e656c7f4e626968076a6879596460680b6962604362795b6c6164690004657f686b097e786f7e797f64636a087d7f6279626e6261066168636a79650879625e797f64636a013d0e3c3d3d3d3d3d3d3d3c3c3d3d3d3d076b627f7f686c610a69647f686e795e646a63046f626974097e797f64636a646b740276700b6f6269745b6c613f7e797f0a6f62697452656c7e6530012b03787f61057c78687f740a6c7e626169527e646a63097d6c7965636c606830097979527a686f646930062b78786469300e526f74796869527e686e52696469077979527e6e64690a393f3439343b3a3f343b09787e687f4c6a686379096b685b687f7e6462630e523d3f4f39573b7a623d3d3d3d3c057e61646e68',\n                '484e4f4a403f5243003c01321067d4bc00000824ebfd74540000087f0211010311000111000243024a12000505000000213b0105000001533b014302421100011200064701251100011200073300191100011200074a12000811030112000912000a430103011d2634000c0211030211000112000743014700f111000112000b4a12000c07000d43011400021100024700d902110303110001120007430114000311000311030412000e2547005511000211030515000f1100031103051500100211030607000f110002430249021103071100024301491100031101032947001f1103051200111200120300294700100211030811030903020403e81a4302494500161101031103051200102a47000911000211030515000f1101031103041200132533000c110305120011120012030a274700361103051200114a120014110002430149110305120011120012030125470017021103071100024301490211030607000f110002430249110001421100014008421100023400010d14000211020a33000711000111020b3714000307001514000407001614000507001514000611020c33000711000111020d374701c411000112000a14000411000212001747000f1100021200174a12001843004500030700161400050211020e1100044301330011110005070016253400071100050700192547017d11020512001014000711020512001a1400081100080700152347000f07000f11020512000f0c000245001207000f11020512000f07001a1100080c00041400090211020f021102101100044301110009430214000a0211021111000a430114000b0211021211000b11000212001b430214000c0211020f11000a11010111000c0c0002430214000d07001514000e11021312001c47000911000d14000e4500b10d021102140211000d43020e000714000f110005070019254700710211021511000111000243024a12001d07001e43010300134a12001f430014000602110216110006430147003b0211021711000f11000611000212001b4303490211021811000f0807002043031400100211020f11000d1101021100100c0002430214000e45000611000d14000e4500250211021811000f0807002043031400110211020f11000d1101021100110c0002430214000e1102131200214700130211021a430011000212000b110219120022160211010411000e1100021100074303421100034701e91100011200071400041100011200174700091100011200174500030700161400050211020e1100044301330011110005070016253400071100050700192547019811020512001014001211020512001a1400131100130700152347000f07000f11020512000f0c000245001207000f11020512000f07001a1100130c00041400140211020f021102101100044301110014430214001502110211110015430114001611000112000b1400171102131200214700161100174a1200231102191200220211021a4300430249110005070019254700480211021511000111000243024a12001d07001e43010300134a12001f43001400061100014a12002443004a12002543004a12000505000007293b01050000081e3b014302424500bd021102121100160243021400180211020f1100151101011100180c000243021400190d021102140211001943020e000714001a0211021811001a08070020430314001b0211020f11001911010211001b0c0002430214001c11020b11001c0d1100170e000b080e001b1100011200260e00261100011200270e00271100011200280e00281100011200290e002911000112002a0e002a11000112002b0e002b11000112002c0e002c440214001d0211010411001d110002110012430342021101031100011100024302424501df11000212000b324700070d11000215000b11000114000411000212001747000f1100021200174a12001843004500030700161400050211020e1100044301330011110005070016253400071100050700192547017d11020512001014001e11020512001a14001f11001f0700152347000f07000f11020512000f0c000245001207000f11020512000f07001a11001f0c00041400200211020f02110210110004430111002043021400210211021111002143011400220211021211002211000212001b43021400230211020f1100211101011100230c0002430214002407001514002511021312001c4700091100241400254500b10d021102140211002443020e0007140026110005070019254700710211021511000111000243024a12001d07001e43010300134a12001f430014000602110216110006430147003b0211021711002611000611000212001b430349021102181100260807002043031400270211020f1100241101021100270c00024302140025450006110024140025450025021102181100260807002043031400280211020f1100241101021100280c000243021400251102131200214700130211021a430011000212000b110219120022160211010411002511000211001e4303420211010311000111000243024208420700151400020211031211011611000143021400030211030f1101151102011100030c000243021400040211031611010643014700490d021103140211000443020e000714000502110317110005110106110001430349021103181100050807002043031400060211030f1100041102021100060c0002430214000245000611000414000211030b1100020d1101011200170e00171101170e000b1100010e001b1101011200260e00261101011200270e00271101011200280e00281101011200290e002911010112002a0e002a11010112002b0e002b11010112002c0e002c44021400070211020411000711010211011243034211000140084205000000003b0314000405000001593b021400050700001400010700011400020211010043003247000208421101011200024700020842001101011500021101011200031400031100031101011500041100051101011500030842002d0754214e636b797f0a537f656b626d78797e691653536d6f53656278697e6f697c786968536a69786f64056a69786f6406536a69786f64047864696202636703797e60076562686974436a0860636f6d7865636204647e696a0764696d68697e7f036b69780a7421617f217863676962037f696f07617f586367696208617f5f786d78797f0e617f42697b586367696240657f78066069626b78640465626578047c797f6400034b4958066169786463680b7863597c7c697e4f6d7f69045c435f580b53536d6f5378697f786568046e636875017a057f7c60657801370b786340637b697e4f6d7f69076a637e7e696d60037f68650d7f696f45626a6344696d68697e037f6978056f606362690478697478087e696a697e7e697e0e7e696a697e7e697e5c6360656f7504616368690b6f7e6968696278656d607f056f6d6f6469087e6968657e696f7809656278696b7e657875',\n                'own',\n                'Super\\x20expression\\x20must\\x20either\\x20be\\x20null\\x20or\\x20a\\x20function',\n                'getTimezoneOffset',\n                'array',\n                'toDataURL',\n                'enumerable',\n                'setPrototypeOf',\n                'field',\n                'WEBGL',\n                'wID',\n                'illegal\\x20catch\\x20attempt',\n                'TouchEvent',\n                '3160hBpQVk',\n                '484e4f4a403f5243000d0a13c08652000000000f3be74070000003930211021611010111000143024908421101003300031101013300031101023247000208420d0700000e000103040e00021101181200000e00030d0700040e000103030e00021101030e00050d0700060e000103030e00021101040e00050d0700070e000103030e00021101050e00050d0700080e000103030e00021101030e00050d0700090e000103000e00020d07000a0e000103000e00020d07000b0e000103000e00020d07000c0e000103000e00020d07000d0e000103000e00020d07000e0e000103030e00021101060e00050d07000f0e000103030e00021101070e00050d0700100e000103010e00020d0700110e000103010e00020d0700120e000103010e00020d0700130e000103000e00020d0700140e000103030e00021101080e000503010e00150d0700160e000103030e00021101090e00050d0700170e000103030e000211010a0e00050d0700180e000103030e00021101030e00050d0700190e000103030e000211010b0e00050d07001a0e000103030e000211010c0e00050d07001b0e000103030e000211010d0e00050d07001c0e000103030e00021101030e00050d07001d0e000103000e00020d07001e0e000103030e000211010e0e000507001f0e00200d0700210e000103030e000211010f0e00050d0700220e000103030e00021101100e00050d0700230e000103030e00021101110e000503010e00150d0700240e000103010e00020d0700250e000103040e00021101121200260e00030d0700270e000103030e00021101130e00050d0700280e000103030e00021101030e00050d0700290e000103040e00020c00221400010c0000140002030014000311000311000112002a274700eb110001110003131200020300480013030148002f0302480045030348005b494500be0211011411010011000111000313120001134301110001110003131500034500a011010111000111000313120001131100011100031315000345008511010211000111000313120001131100011100031315000345006a110001110003131200154700321101153a07002b264700241100024a12002c110001110003131200054a12002d110001110003131200204301430149450025110001110003131200054a12002d0211000111000313120020430211000111000313150003450003450000170003214945ff081101153a07002b2647001d1101154a12002e11000243014a12002f05000000003b0143014945000a02110116110001430149084200300349414c0146014e015a095b5c495a5c7c41454d015c09494a4144415c414d5b064b49465e495b0a5c41454d5b5c49455819085844495c4e475a451340495a4c5f495a4d6b47464b5d5a5a4d464b510c4c4d5e414b4d654d45475a51084449464f5d494f4d094449464f5d494f4d5b0a5a4d5b47445d5c4147460f495e4941447a4d5b47445d5c414746095b4b5a4d4d467c47580a5b4b5a4d4d46644d4e5c104c4d5e414b4d7841504d447a495c41470a585a474c5d4b5c7b5d4a074a495c5c4d5a510158095c475d4b4061464e47085c41454d5247464d0a5c41454d5b5c4945581a074f585d61464e470b425b6e47465c5b64415b5c0b58445d4f41465b64415b5c0a5c41454d5b5c4945581b095d5b4d5a694f4d465c0a4d5e4d5a6b474743414d075c5c775b4b414c01450b5b51465c49506d5a5a475a0c46495c415e4d644d464f5c40055a5c4b61780844474b495c414746094e587e4d5a5b4147460b77775e4d5a5b4147467777084b44414d465c614c0a5c41454d5b5c4945581c0b4d505c4d464c6e414d444c06444d464f5c40095d464c4d4e41464d4c04585d5b40044b49444403494444045c404d46',\n                'rewriteUrl\\x20',\n                'setTTWid',\n                'height',\n                'product',\n                'Vrinda',\n                'X-Mssdk-Info',\n                'arrayBuffer',\n                'vibrate',\n                'sendBeacon',\n                '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',\n                'canvas',\n                'Character\\x20outside\\x20valid\\x20Unicode\\x20range:\\x200x',\n                'join',\n                'throw',\n                'iterator\\x20result\\x20is\\x20not\\x20an\\x20object',\n                'DEPTH_BITS',\n                'compatMode',\n                'forEach',\n                'Attempted\\x20to\\x20access\\x20private\\x20element\\x20on\\x20non-instance',\n                'unsupport\\x20type',\n                'attempted\\x20to\\x20call\\x20addInitializer\\x20after\\x20decoration\\x20was\\x20finished',\n                'pageXOffset',\n                'length',\n                'method',\n                'bytes',\n                'charAt',\n                'Sylfaen',\n                'toElementDescriptor',\n                'base64',\n                'createElement',\n                'private',\n                'ttcid',\n                'msStatus',\n                'MAX_VARYING_VECTORS',\n                'elements',\n                '484e4f4a403f524300232a0d2ebaf9a00000000042410a740000019d110100002347000200421101011200004700020042070001110102364700351101024a12000111010143011400011100014a120002070000430103002a34000f1100014a120002070003430103002a470002004211010333000611010312000433000911010312000412000533000c1101031200041200051200064700213e000414000c413d00171101031200041200054a1200064300082547000200424107000707000807000907000a07000b07000c07000d07000e07000f0700100700110c000b1400020700120700130700140c000314000303001400041100041100031200152747001e11000311000413140005110103110005134700020042170004214945ffd503001400061100061100021200152747002111000211000613140007110103120016110007134700020042170006214945ffd21101024a1200171101031200164301140008030014000911000814000a11000911000a1200152747003911000a1100091314000b11000b4a1200181101050700194401430133000e11010312001611000b1307001a134700020042170009214945ffba0142001b096d7f787e68736c7f68137d7f6e556d744a68756a7f686e63547b777f690773747e7f62557c09767b747d6f7b7d7f690679726875777f07686f746e73777f07797574747f796e1445456d7f787e68736c7f68457f6c7b766f7b6e7f134545697f767f74736f77457f6c7b766f7b6e7f1b45456d7f787e68736c7f6845697968736a6e457c6f74796e7375741745456d7f787e68736c7f6845697968736a6e457c6f74791545456d7f787e68736c7f6845697968736a6e457c741345457c627e68736c7f68457f6c7b766f7b6e7f1245457e68736c7f68456f746d687b6a6a7f7e1545456d7f787e68736c7f68456f746d687b6a6a7f7e1145457e68736c7f68457f6c7b766f7b6e7f144545697f767f74736f77456f746d687b6a6a7f7e1445457c627e68736c7f68456f746d687b6a6a7f7e0945697f767f74736f770c797b7676497f767f74736f771645497f767f74736f7745535e5f45487f7975687e7f6806767f747d6e72087e75796f777f746e04717f636905777b6e79720a463e417b3760477e794506797b79727f45',\n                'pop',\n                'showOffsetX',\n                'MAX_TEXTURE_IMAGE_UNITS',\n                '2571598OPFKfY',\n                'webgl',\n                'appendChild',\n                'outerHeight',\n                'screenX',\n                'kind',\n                'navigator',\n                'attempted\\x20to\\x20use\\x20private\\x20field\\x20on\\x20non-instance',\n                'cookie',\n                'AsyncIterator',\n                'crypto',\n                'buffer',\n                'availHeight',\n                'The\\x20property\\x20descriptor\\x20of\\x20a\\x20field\\x20descriptor',\n                'resolve',\n                'react.element',\n                'close',\n                'monospace',\n                'stun:stun.l.google.com:19302',\n                'acc',\n                'BLUE_BITS',\n                'Arguments',\n                'style',\n                'nextLoc',\n                'pageYOffset',\n                '72px',\n                'webkitRequestAnimationFrame',\n                'hidden',\n                'MAX_FRAGMENT_UNIFORM_VECTORS',\n                'node',\n                'Parchment',\n                'kWebsocket',\n                'xmst',\n                'number',\n                'altKey',\n                'A\\x20method\\x20descriptor',\n                'Leelawadee',\n                '6300OtYFrs',\n                'href',\n                '1155KnHwvu',\n                'storage',\n                'sTm',\n                'setMonth',\n                '20690wmYtVy',\n                '266076LNZfld',\n                'Malformed\\x20string',\n                'setConfig',\n                'touchmove',\n                'rval',\n                'unload',\n                'from',\n                'Image',\n                'tryLoc',\n                'ActiveXObject',\n                'assign',\n                '\\x20property.',\n                '_sent',\n                'mmmmmmmmmmlli',\n                'offsetHeight',\n                'slice',\n                'getOwnPropertyDescriptor',\n                'mhe',\n                'utf8',\n                'Object\\x20is\\x20not\\x20async\\x20iterable',\n                'reset',\n                'raw',\n                'constructor',\n                'attempted\\x20to\\x20',\n                'Invalid\\x20attempt\\x20to\\x20iterate\\x20non-iterable\\x20instance.\\x0aIn\\x20order\\x20to\\x20be\\x20iterable,\\x20non-array\\x20objects\\x20must\\x20have\\x20a\\x20[Symbol.iterator]()\\x20method.',\n                'isArray',\n                'chargingTime',\n                '__await',\n                '484e4f4a403f524300071336bc6677450000001613b112b6000003090b4a12000911021607000a07000b4402070001430242070000140001110115082633000511011502263300071101150700012647001d3e000a140029070002140001413d000d021101001101154301140001411101013234000611010212000347000b001401010211010343004902110104430049110105120004140002110106120005140003030214000411000414000503401400060211010011011443011400071101074a120006021101001101074a1200061100074301430143011400081101074a120006021101001101074a1200061100014301430143011400091101081200071200083247001005000000003b0011010812000715000811010912000c14000a11000a33000811000a3a07000d2547000c11000a4a120008430014000a0211010a110003110002430214000b0211010b11000b11000a430214000c0211010c11000c07000e430214000d1101074a1200060211010011000d4301430114000e11010d44004a12000f43000403e81b14000f0211010e43001400101100061400111100030401001b1400121100030401001c140013110002140014110008030e13140015110008030f13140016110009030e13140017110009030f1314001811000e030e1314001911000e030f1314001a11000f03182c0400ff2e14001b11000f03102c0400ff2e14001c11000f03082c0400ff2e14001d11000f03002c0400ff2e14001e11001003182c0400ff2e14001f11001003102c0400ff2e14002011001003082c0400ff2e14002111001003002c0400ff2e140022110011110012311100133111001431110015311100163111001731110018311100193111001a3111001b3111001c3111001d3111001e3111001f311100203111002131110022311400230400ff1400240211010f11001111001311001511001711001911001b11001d11001f11002111002311001211001411001611001811001a11001c11001e11002011002243131400250211010b0211011011002443011100254302140026021101111100051100241100264303140027021101121100270700104302140028110028420011201c4c491c401b1c41401e48481a4a484c1d414048484141401d1b1e404c4a4f1d00201e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e010e060d1a1b171c1d071d160e1b171c1d061c1d1b171c1d09080a170c170c01081d040c0a1115070a1d0814191b1d212623240b240d3e3d3e3e2400394825530423240b240d3e3d3e3e2400394825535c011f090d0b1d0a391f1d160c060b0c0a11161f020b48071f1d0c2c11151d020b4a',\n                'Arial\\x20Hebrew',\n                'msToken',\n                'An\\x20element\\x20descriptor\\x27s\\x20.placement\\x20property\\x20must\\x20be\\x20one\\x20of\\x20\\x22static\\x22,\\x20\\x22prototype\\x22\\x20or\\x20\\x22own\\x22,\\x20but\\x20a\\x20decorator\\x20created\\x20an\\x20element\\x20descriptor\\x20with\\x20.placement\\x20\\x22',\n                'visible',\n                'decode',\n                'concat',\n                '30762fvQkGV',\n                'hash',\n                'STENCIL_BITS',\n                'configurable',\n                '\\x20private\\x20field\\x20on\\x20non-instance',\n                'T_MOVE',\n                'clientX',\n                'images',\n                'version',\n                'renderer',\n                'removeItem',\n                'catchLoc',\n                'indexOf',\n                'msHidden',\n                'isView',\n                'toLocaleString',\n                'https://mssdk.bytedance.com',\n                'B4Z6wo',\n                'dispatchException',\n                'msvisibilitychange',\n                '\\x20decorators\\x20must\\x20return\\x20a\\x20function\\x20or\\x20void\\x200',\n                'Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe',\n                'Cannot\\x20convert\\x20undefined\\x20or\\x20null\\x20to\\x20object',\n                'initializer',\n                'awrap',\n                'continue',\n                'mousedown',\n                'mousemove',\n                'update',\n                '__ac_blank',\n                '0123456789abcdef',\n                'getItem',\n                'Futura',\n                'MAX_RENDERBUFFER_SIZE',\n                'GPUINFO',\n                'host',\n                '484e4f4a403f524300010a1106afb0650000000079a66ec20000008c1101001200004a12000143001400011100014a120002070003430103002a470002014211010307000444011400021101013300061101011200053300091101011200051200064700411101011200051200061400031100034a120002070007430103002534000f1100034a120002070008430103002534000c1100024a120009110003430147000200420142000a093b3d2b3c0f292b203a0b3a210221392b3c0d2f3d2b0727202a2b360128082b222b2d3a3c21204a10263a3a3e3d71741261126166157e637713357f627d33661260157e637713357f627d3367357d3332152f63287e637713357f627a336674152f63287e637713357f627a3367357933670822212d2f3a27212004263c2b28042827222b10263a3a3e74616122212d2f2226213d3a043a2b3d3a',\n                'BluetoothUUID',\n                'decorateClass',\n                'mozRTCPeerConnection',\n                'defineClassElement',\n                'credentials',\n                'writable',\n                'value',\n                'WEBKIT_EXT_texture_filter_anisotropic',\n                'JS_MD5_NO_ARRAY_BUFFER',\n                'Metadata\\x20keys\\x20must\\x20be\\x20symbols,\\x20received:\\x20',\n                'getReferer',\n                'indexDB',\n                '__proto__',\n                'Object',\n                'splice',\n                'symbol',\n                'offsetWidth',\n                'executing',\n                'mozBattery',\n                'normal',\n                'kFakeOperations',\n                'reverse',\n                'finisher',\n                'createOffer',\n                'addEventListener',\n                'Cannot\\x20call\\x20a\\x20class\\x20as\\x20a\\x20function',\n                '\\x20must\\x20be\\x20a\\x20function',\n                'getContext',\n                'referrer',\n                'afterLoc',\n                'has',\n                'return',\n                'kNoMove',\n                'netscape',\n                'MAX_CUBE_MAP_TEXTURE_SIZE',\n                'bind',\n                'width',\n                'valueOf',\n                'off',\n                'JS_MD5_NO_ARRAY_BUFFER_IS_VIEW',\n                'innerWidth',\n                '257232gkndOM',\n                'null',\n                'isSecureContext',\n                'pixelDepth',\n                '.initializer\\x20has\\x20been\\x20renamed\\x20to\\x20.init\\x20as\\x20of\\x20March\\x202022',\n                '/web/report',\n                'removeChild',\n                '[object\\x20Boolean]',\n                'getSupportedExtensions',\n                'error',\n                'GeneratorFunction',\n                'message',\n                'initializeInstanceElements',\n                'systemLanguage',\n                'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n                'tt_webid',\n                'sqrt',\n                '__ac_referer',\n                'blocks',\n                'MOZ_EXT_texture_filter_anisotropic',\n                '1hcbEHL',\n                '308350OyvEoV',\n                '484e4f4a403f5243003a20169967f185000000000b49c93c000000761101001200004a12000143001400011100014a120002070003430103002a47000201421101013a070004263300191101021200051200064a12000711010112000843010700092534002b1101033a0700042547000607000445000902110104110103430107000a2533000a11010312000b07000c2542000d09282e382f1c3a3833290b293211322a382f1e3c2e38073433393825123b083831383e292f323309283339383b34333839092d2f32293229242d380829320e292f34333a043e3c3131072d2f323e382e2e1006323f37383e297d2d2f323e382e2e0006323f37383e290529342931380433323938',\n                'for',\n                'break',\n                'construct',\n                'Constantia',\n                'webkitvisibilitychange',\n                'activeState',\n                'toClassDescriptor',\n                'layers',\n                'bogusIndex',\n                'arg',\n                'screen',\n                'buffer8',\n                'getOwnPropertyNames',\n                'get',\n                'prev',\n                'buildID',\n                'lastByteIndex',\n                '\\x27\\x20method',\n                'Bad\\x20UTF-8\\x20encoding\\x200x',\n                '[object\\x20Array]',\n                'add',\n                '484e4f4a403f5243000027194f9666590000000044a16fed000000270700001400013e000a140002070001140001413d000d0211010011010243011400014111000142000200200d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d',\n                'call',\n                'characterSet',\n                'bodyVal2str',\n                'tryEntries',\n                '\\x22\\x20is\\x20read-only',\n                'tt_webid_v2',\n                'locationbar',\n                'maxTouchPoints',\n                'string',\n                'addElementPlacement',\n                'try\\x20statement\\x20without\\x20catch\\x20or\\x20finally',\n                'mozVisibilityState',\n                'showColor',\n                'name',\n                'split',\n                'xmstr',\n                'prototype',\n                'AcroPDF.PDF.1',\n                'Tunga',\n                '4218tDAtHd',\n                'AVENIR',\n                'getMetadata',\n                'track',\n                'touchEvent',\n                'decorateConstructor',\n                'now',\n                'failed\\x20to\\x20set\\x20property',\n                '484e4f4a403f524300263203ec75a3740000000817718683000003051100011100022e4211011507000013002547000a070001110115070002160d03000e0003000e00040c00000e00050c00000e0006010e0007010e00000700080e0002010e00090d0305033c1a0e000a03020e000b0305033c1a0e000c0e000d0700080e000e000e000f03030e00101400011101004a1200111100011101154302491100011200030300253400161101014a120012110001120003430111000112000326470009110102070013440140110001120014330007110001120015324700091101020700164401401101031200174a12001811000112000343014911010412000303002547000c1100011200031101041500031100011200043247009c110001120002070008254700091101020700194401401100011200020700012447000911010207001a44014011000112000211010415000202110105110001430111010415001b021101061101071100011200100403e81a43024911000112001c0826330005110001022647002e11010412001d4a12001811000112001c43014911010412001d4a12001e05000000003b024301323211010415001c11000112000d4700a60011010415001f11010847006411000112000d12000a33001311000112000d12000a11010412000d12000a2947003f021101091101084301491101004a1200110d11010412000d11000112000d430311010415000d0211010a11010b11010412000d12000a0403e81a43021401084500351101004a1200110d11010412000d11000112000d430311010415000d0211010a11010b11010412000d12000a0403e81a430214010811000112002047001c1100011200201101041500200211010611010c03050403e81a4302491100010b1500210211010d4300490211010e1100011200054301490211010f1100011200064301490211011043004911011132330006110001120007470020001401111100011200071101041500070211010611011203050403e81a43024911000112000f4700241101041200223247001a0011010415002202110106110113030a0403e81a11000143034900110104150023084200240350524402575a064651535d5b5a03555d50055d4767707f0e515a555658516455405c785d47400f414658665143465d405166415851470347505d0003505142035246510a415a5d4075595b415a4008415a5d40605d595105404655575f04595b5051044c4c56530450504640065547475d535a0552585b5b461e5b44405d5b5a14555d501c7d5a40515351461d145d47145a51515051501503565b5107565b517c5b474024565b517c5b474014594147401456511444465b425d505150145d5a14565b5114595b505107555d50785d4740044441475c0f4651535d5b5a145d47145a41585815124651535d5b5a145d47145d5a4255585d50150a4651535d5b5a775b5a520142106b515a55565851675d535a5540414651064651504157510b515a55565851604655575f0444514652075b44405d5b5a47046b5052440b5d5a5d405d55585d4e5150',\n                'appMinorVersion',\n                'Attempted\\x20to\\x20decorate\\x20a\\x20public\\x20method/accessor\\x20that\\x20has\\x20the\\x20same\\x20name\\x20as\\x20a\\x20previously\\x20decorated\\x20public\\x20method/accessor.\\x20This\\x20is\\x20not\\x20currently\\x20supported\\x20by\\x20the\\x20decorators\\x20plugin.\\x20Property\\x20name\\x20was:\\x20',\n                'hex',\n                'dischargingTime',\n                'PLUGIN',\n                'T_KEYBOARD',\n                'ret_code',\n                '\\x22.\\x20Please\\x20configure\\x20the\\x20dynamicRequireTargets\\x20or/and\\x20ignoreDynamicRequires\\x20option\\x20of\\x20@rollup/plugin-commonjs\\x20appropriately\\x20for\\x20this\\x20require\\x20call\\x20to\\x20work.',\n                '@@toPrimitive\\x20must\\x20return\\x20a\\x20primitive\\x20value.',\n                'battery',\n                'Generator\\x20is\\x20already\\x20running',\n                'headers',\n                'md5',\n                'setter',\n                '=;\\x20expires=Mon,\\x2020\\x20Sep\\x202010\\x2000:00:00\\x20UTC;\\x20path=/;',\n                '_raw_sec_did',\n                'hardwareConcurrency',\n                'script',\n                'fontSize',\n                '_byted_sec_did',\n                'keydown',\n                '__private_',\n                'screenY',\n                'Duplicated\\x20element\\x20(',\n                '484e4f4a403f524300211209597bcccc0000053aae77fba6000005e50b1200093247004e0b12000a4a12000b0d0700050e000c1100000e000d43014911021607000e07000f44024a120010110001430147001f1100024a12001143004a12001243004a12001307001443010300130b1500151101054a1200160b1100004302421100000b1500171101074a1200160b1100004302420c00000b15000a0b12000a4a12000b0d0700040e000c1100000e000d4301491100014a12001843000b1500191100020b15001a1101044a1200160b1100004302421101094a1200240b120019430103011d26140002021102010b12001a43013300031100024702fe0b12001a4a120024070025430103011d2947000e1101064a1200160b1100004302421100010b1500260b1200271400030b12001b1400040b12001c1400050b12001d1400060b12001e1400070b12001f1400080b1200201400090b12002114000a0d14000b030014000c11000c1101081200282747001f0b12002911010811000c131311000b11010811000c131617000c214945ffd411020212002a14000d11020212002b14000e11000e07002c2347000f07002d11020212002d0c000245001207002d11020212002d07002b11000e0c000414000f02110203021102040b12001a430111000f4302140010021102051100104301140011021102061100110b1200264302140012021102031100101101011100120c0002430214001307002c14001411020712002e4700091100131400144500910d021102080211001343020e002f1400150b12001907002325470050021102090b120015430147003a0211020a1100150b1200150b1200264303490211020b110015080700304303140016021102031100131101021100160c000243021400144500061100131400144500250211020b110015080700304303140017021102031100131101021100170c000243021400140b12000a33000f0b12000a03001307000c130700042647000202420b12000a14001803001400191100191100181200282747005d11001903002547002d1100141100181100191312000d030116000b1500091101044a1200160b1100181100191312000d43024945001f0b1100181100191307000c13134a1200160b1100181100191312000d430249170019214945ff960b1200174700100b1200074a1200160b0b1200174302490b07000a39491102071200314700140b4a12000511020c1200320211020d43004302491100030b1500271100040b15001b1100050b15001c05000003ed3b010b15001d1100070b15001e1100080b15001f1100090b15002011000a0b150021030014001a11001a1101081200282747001f11000b11010811001a13130b12002911010811001a131617001a214945ffd41101064a1200160b11000043024203001400020b1200333400040b12001a34000307002c1400030211030e110003430147000503011400021100034a120024110300120034120035430103011d2647000503021400021100020300294700ea0b4a12003607003743011400041100044700d70211030f0b12001a43011400051100051103101200382547005511000411030215002d11000511030215002a0211031107002d1100044302490211031211000443014911000511010d2947001f1103021200391200280300294700100211031311031403020403e81a43024945001611010d11030212002a2a47000911000411030215002d11010d11031012003a2533000c110302120039120028030a274700361103021200394a12000b110004430149110302120039120028030125470017021103121100044301490211031107002d11000443024911010647000a02110106110001430149084207000014000107000114000211010012000212000314000311000312000414000411000312000514000511000312000614000611000312000714000711000312000847000208420011000315000805000000003b0211000315000505000000643b0011000315000705000000793b0211000315000407001b07001c07001d07001e07001f0700200700210c00071400080700220700230c000214000905000000ba3b011100031500060842003b0755204f626a787e0a527e646a636c79787f680e5540414579797d5f687c78687e79097d7f62796279747d6804627d6863107e68795f687c78687e7945686c69687f047e68636910627b687f7f6469684064606859747d680f526c6e52646379687f6e687d79686905527e68636915526f7479686952646379687f6e687d795261647e79047d787e65046b78636e096c7f6a78606863797e0e536e6263796863792079747d682901640479687e790879625e797f64636a0b796241627a687f4e6c7e68057e7d61647901360e526f74796869526e626379686379056c7d7d61741552627b687f7f6469684064606859747d684c7f6a7e0b7962587d7d687f4e6c7e680d526f74796869526068796562690a526f7479686952787f610762636c6f627f79076263687f7f627f06626361626c6909626361626c696863690b626361626c697e796c7f790a62637d7f626a7f687e7e09626379646068627879034a4859045d425e59076463696875426b0b527e646a636c79787f68300b526f74796869526f6269741262637f686c69747e796c79686e656c636a68066168636a796506787d61626c6908607e5e796c79787e0b52526c6e5279687e7964690007607e5962666863017b03787f61076b627f7f686c61037e69640d7e686e44636b6245686c69687f0b7f687e7d62637e68585f410861626e6c796462630465627e79116a68795f687e7d62637e6845686c69687f0a7520607e207962666863037e686e0e607e43687a596266686341647e790464636479',\n                'round',\n                'innerHTML',\n                'appCodeName',\n                'defineProperties',\n                'Could\\x20not\\x20dynamically\\x20require\\x20\\x22',\n                'push',\n                '__destrObj',\n                'toElementDescriptors',\n                'defaultProps',\n                'fromElementDescriptor',\n                'documentMode',\n                'Object.keys\\x20called\\x20on\\x20non-object',\n                'WEBGL_debug_renderer_info',\n                'reduce',\n                'replace',\n                'setUserMode',\n                'changedTouches',\n                'JS_MD5_NO_WINDOW',\n                '[object\\x20Object]',\n                'item',\n                'beforeunload',\n                '%27',\n                'enableTrack',\n                'envcode',\n                'gpu',\n                'ubcode',\n                'getParameter',\n                'undefined',\n                'start',\n                'isGeneratorFunction',\n                'completion',\n                'getOwnPropertySymbols',\n                'next',\n                'availWidth',\n                'values',\n                'oscpu',\n                'Tw\\x20Cen\\x20MT',\n                'sort',\n                'bluetooth',\n                'requestMediaKeySystemAccess',\n                'keyboardList',\n                'key',\n                'window',\n                'Unfinished\\x20UTF-8\\x20octet\\x20sequence',\n                'setMetadata',\n                'static',\n                'debug',\n                'languages',\n                'toolbar',\n                'msDoNotTrack',\n                'reject',\n                'finishers',\n                '208XZrBOJ',\n                'UNMASKED_RENDERER_WEBGL',\n                'external',\n                'shadowBlur',\n                'POST',\n                '484e4f4a403f5243003e0d23e5c579310000006248d1745c000002cc0d140001110200070000131400021100020700012447000a11000211000107000016110200070002131400031100030700012447000a11000311000107000316110200070004131400041100040700012447000a110004110001070005161100014205000000003b001400010114000211010f3247000911010112000614010f11010f110101120007254700040014000211010244004a12000843001400030d1101001200094a12000a030043010e000b11010012000c4a12000a030043010e000d11010012000e4a12000a030043010e000f1101001200104a12000a030043010e001114000411000412000b12001203002533000c11000412000d12001203002533000c11000412000f12001203002533000c110004120011120012030025470002084211000412000b12001203101a11000412000d120012030c1a1811000412000f12001203041a1811000412001112001203081a181400051100031101031200131101041200141200150403e81a182747003a1101031200161101041200141200170404001a27470020110103120016110005181101030700163549021101054300490014000245000045001d11000311010315001311000511010315001602110105430049001400021100024700f703021400060d1100040e00181100060e00191400070d11000707001a1611010412001b11000707001a1307001b1607000111010244004a12000843001811000707001a1307001c1611010012001d11000707001a1307001d16030011000707001a1307001e160d11000707001f161101064a12002011000707001f13021100014300430249021101071101081200210211010911010a4a120022110007430111010b120023430243021400081101041200240700251314000911000932470002084211010f110101120026254700190211010c110009110008430214000a11000a3247000045000f0211010d1100091100080d0043044908420027052121223c31000821210a2230373c310721210230371c310b21210a2230373c310a23670921210230373c3103670727203b3b3c3b3205333920263d07323021013c383008383a2330193c2621062625393c3630063730183a23300936393c363e193c262107373016393c363e0c3e302c373a342731193c26210a37301e302c373a3427310b3436213c233006213421300b223c3b313a2206213421300639303b32213d0326013805212734363e08203b3c21013c3830033436360a203b3c2114383a203b210837303d34233c3a2707382632012c253003221c1103343c3109213c3830262134382507343c31193c26210b25273c2334362c183a313006362026213a38063426263c323b0f0210170a1110031c16100a1c1b131a092621273c3b323c332c043f263a3b0a2730323c3a3b163a3b33092730253a272100273904302d3c21',\n                'metadata',\n                'productSub',\n                'mark',\n                '\\x20is\\x20not\\x20an\\x20object.',\n                'substr',\n                'Invalid\\x20attempt\\x20to\\x20spread\\x20non-iterable\\x20instance.\\x0aIn\\x20order\\x20to\\x20be\\x20iterable,\\x20non-array\\x20objects\\x20must\\x20have\\x20a\\x20[Symbol.iterator]()\\x20method.',\n                'Gulim',\n                'experimental-webgl',\n                'setRequestHeader',\n                'charging',\n                '484e4f4a403f52430031032581faca6c0000000093505d60000001c60700001400010d1400020700011100020700021607000311000207000416070005110002070006161100021101021314000307000714000403001400061101011200081100060303182a4700b11101014a1200091700062143010400ff2e03102b1101014a1200091700062143010400ff2e03082b2f1101014a1200091700062143010400ff2e2f1400051100041100034a12000a1100050500fc00002e03122c43011817000435491100041100034a12000a110005050003f0002e030c2c43011817000435491100041100034a12000a110005040fc02e03062c43011817000435491100041100034a12000a110005033f2e430118170004354945ff3f110101120008110006190300294700b41101014a1200091700062143010400ff2e03102b110101120008110006294700161101014a12000911000643010400ff2e03082b45000203002f1400051100041100034a12000a1100050500fc00002e03122c43011817000435491100041100034a12000a110005050003f0002e030c2c4301181700043549110004110101120008110006294700161100034a12000a110005040fc02e03062c430145000311000118170004354911000411000118170004354911000442000b011441686b6a6d6c6f6e616063626564676679787b7a7d7c7f7e717073484b4a4d4c4f4e414043424544474659585b5a5d5c5f5e51505319181b1a1d1c1f1e1110020614025a19416d424d594e411d73625a786b111906644f5f5e1a1f7160187b1b1c027e7c68456c401e67654b4658707d66795c53446f4363475b505110617f6e4a487a5d6a4c14025a18416d424d594e411d73625a786b111906644f5f5e1a1f7160187b1b1c047e7c68456c401e67654b4658707d66795c53446f4363475b505110617f6e4a487a5d6a4c14025a1b0006454c474e5d410a4a41485b6a464d4c685d064a41485b685d',\n                'toString',\n                'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx',\n                'warn',\n                'parse',\n                'sent',\n                'iterator',\n                'PDF.PdfCtrl.',\n                '__ac_testid',\n                'clickList',\n                'create',\n                'hasOwnProperty',\n                'init',\n                'An\\x20initializer',\n                'clientHeight',\n                'extras',\n                '__esModule',\n                'sessionStorage',\n                'kKeyboardFast',\n                'devicePixelRatio',\n                ';\\x20path=/;',\n                'location',\n                'GREEN_BITS',\n                '484e4f4a403f524300192d11257a6fc000000000d4cf00750000006703011400011101004a12000011010603062b1100012f43011400021101004a1200001101014a1200011101014a12000243000401001a4301430114000302110102110003110105430214000411000211000318110004181400050211010311000507000343024200040c5f4b56547a51584b7a565d5c055f5556564b064b58575d5654024a08',\n                'Castellar',\n                'toGMTString',\n                'mozHidden',\n                'Set',\n                '[native\\x20code]',\n                'complete',\n                '484e4f4a403f52430012270f0b8aa329000000005cddda270000008a0211010043003247007e1101014a12000007000143011400011100011200024a12000343004a120004110104070005070006440207000743024a120008070009430103002734002c1101021200034a12000343004a120004110104070005070006440207000743024a120008070009430103002734001011010212000a4a120003430007000b26420142000c0d18091e1a0f1e3e171e161e150f06181a150d1a08090f143f1a0f1a2e2937080f14280f0912151c07091e0b171a181e03270851011c000712151f1e03341d0a151a0f120d1e18141f1e070b170e1c12150814201419111e180f5b2b170e1c12153a09091a0226',\n                'filter',\n                'runClassFinishers',\n                'webkitVisibilityState',\n                '2.11.0',\n                '\\x20after\\x20decoration\\x20was\\x20finished',\n                'suffixes',\n                'completed',\n                'src',\n                'Cannot\\x20instantiate\\x20an\\x20arrow\\x20function',\n                'getTime',\n                'resultName',\n                'children',\n                'accessor.get',\n                '484e4f4a403f52430024153c4037f00000000009d722c1e5000000d200110208150002084202110100430047001c1101014a120000070001430114000105000000003b001100011500030211010243004700553e002b140002110002120004110104070005132533000c11010312000612000703002547000700110108150002413d00241101031200064a12000807000907000a4302491101031200064a12000b0700094301494102110105430047002311010312000c3233000f11010312000d34000611010312000e4700070011010815000211010612000f11010812000203022b2f11010607000f35490842001004637c69620478697f780965626f636b62657863076362697e7e637e046f636869125d5943584d5349544f494948494853495e5e0e7f697f7f6563625f78637e6d6b69066069626b7864077f697845786961107f63616947697544697e694e75786968000a7e6961637a69457869610965626869746968484e0c5c63656278697e497a6962780e415f5c63656278697e497a6962780769627a6f636869',\n                'https://mssdk.bytedance.com/websdk/v1/getInfo',\n                '?q=',\n                '484e4f4a403f5243003e19390bcd41790000000084fc29f10000006111010012000033000d1101001200001200010700022347000303014211010112000311010112000412000326470003030142110101120005110101120006264700030301421101011200071200081101021200071200082447000303014203024200090c3125363a32123b323a3239230723363019363a32061e1105161a12083b383436233e3839062736253239230424323b3103233827063125363a3224063b323930233f',\n                'defineProperty',\n                '[object\\x20Generator]',\n                'Wingdings',\n                'hasInstance',\n                'SHADING_LANGUAGE_VERSION',\n                'platform',\n                '484e4f4a403f52430007152cc2c1a53c00000061235466970000007f1100010700022534000711000107000325340007110001070004253400071100010700052547000200423e0004140002413d002b1102021100011333001b11020211000113120006082634000c11020211000113120007082647000200424108421101014a12000011010243014a12000105000000003b0143011401000842000813717362596178466479667364626f58777b73650465797b7308757370457e77646608557370457e77646605737977667f16737941737454647961657364527f65667762757e73640f747f787259747c73756257656f78750e7f65535941737454647961657364',\n                'asyncIterator',\n                'object',\n                'colorDepth',\n                'keys',\n                'wrapped',\n                'getter',\n                'finalized',\n                'all',\n                'appName',\n                'regionConf',\n                'application/x-www-form-urlencoded',\n                'attempted\\x20to\\x20get\\x20private\\x20field\\x20on\\x20non-instance',\n                'createEvent',\n                'body',\n                'toElementFinisherExtras',\n                'open',\n                'displayName',\n                '_urlRewriteRules',\n                'random',\n                'font',\n                '484e4f4a403f52430031033191576c4000000000940c5eb50000005302110100430032470047070000110101363234000b110101120000110102373234000707000111010336340007070002110103363400070700031101033634000f0700041101033607000511010336274201420006077d61786a64637e08527d656c637962600b6e6c61615d656c637962600b525263646a6579606c7f68054c78696462184e6c637b6c7e5f686369687f64636a4e6263796875793f49',\n                'discharingTime',\n                'SimSun-ExtB',\n                'fromClassDescriptor',\n                'versions',\n                'charCodeAt',\n                'fillText',\n                'fetch',\n                'freeze',\n                'Create\\x20WebSocket',\n                'webkitRTCPeerConnection',\n                'digest',\n                'class',\n                'MAX_VERTEX_UNIFORM_VECTORS',\n                'filename',\n                'first',\n                'visibilitychange',\n                'A\\x20class\\x20descriptor',\n                'clientWidth',\n                'frontierSign',\n                'msVisibilityState',\n                'antialias',\n                '484e4f4a403f5243002a3d04fa03273900000000b93145d7000004061101001200004a12000143001400011101001200024a120001430014000203001400030301140004030214000503031400060304140007030514000811000814000907000314000a07000414000b07000514000c07000614000d07000714000e07000814000f07000914001007000a1400111100014a12000b07000c430103002a34000f1100014a12000b07000d430103002a4700091100071400094500de1100014a12000b11000a430103002a4700091100031400094500c31100014a12000b11000c430103002a4700091100041400094500a81100014a12000b11000d430103002a34000f1100014a12000b07000e430103002a34000f1100014a12000b07000f430103002a4700091100051400094500691100014a12000b11000e430103002a34000f1100014a12000b11000f430103002a34000f1100014a12000b110010430103002a34000f1100014a12000b070010430103002a34000f1100014a12000b070011430103002a4700091100061400094500061100081400091100024a12000b11000b430103002a33000711000911000326470005004245012c1100024a12000b11000d430103002a34000f1100024a12000b11000c430103002a34000f1100024a12000b070012430103002a330007110009110005263300071100091100042647000500424500dd1100024a12000b110011430103002a34000f1100024a12000b11000f430103002a34000f1100024a12000b110010430103002a34000f1100024a12000b11000e430103002a3300071100091100072633000711000911000626470005004245007c1100024a12000b11000b430103002733000f1100024a12000b11000d430103002733000f1100024a12000b110011430103002733000f1100024a12000b11000e430103002733000f1100024a12000b11000f430103002733000f1100024a12000b1100104301030027140012110012110009110008252647000200420300140013030114001403021400150303140016030414001703051400181100181400191100014a12000b070013430103002a47000911001514001945008a1100014a12000b070014430103002a34000f1100014a12000b070015430103002a34000c1100014a12000b070016430147000911001414001945004e1100014a12000b070017430103002a4700091100131400194500331100014a12000b070018430103002a34000f1100014a12000b070019430103002a4700091100171400194500061100181400190211010143004a120001430014001a110019110013243300071100191100142433002111010212001a34001811010012001b4a12001c43004a12000b07001d430103002a4700020042110019110013243300071100191100142433000f11001a4a12000b07001a430103002a47000200420142001e090b0d1b0c3f191b100a0b0a113211091b0c3d1f0d1b080e121f0a18110c13070917101a11090d03091710071f101a0c11171a051217100b0606170e1611101b04170e1f1a04170e111a03131f1d0717101a1b06311809131f1d17100a110d160c131f1d210e11091b0c0e1d57041d0c110d03064f4f051d0c17110d05180617110d040e17151b0818170c1b1811065106110e1b0c1f51055e110e0c51055e110e0a51071d160c11131b51080a0c171a1b100a5104130d171b061d160c11131b06081b101a110c080a112d0a0c1710190639111119121b',\n                'setTTWebid',\n                'Buffer',\n                '_enablePathListRegex',\n                'outerWidth',\n                'type',\n                'decorateElement',\n                '484e4f4a403f524300040e131c85d3950000064d665eaab9000007ca05000001d03b0014000105000003953b00140002050000046a3b001400031102084400140004021100024300490211000343004907004b07004c07004d07004e07004f07005007005107005207005307005407005507005607005707005807005907005a07005b07005c0c001214000702110209110200110007030043031400051100050211020911020007005d1307005e0c000111000712005f43032f17000535490700600c00011400080211020911020607006113110008030043031400060d1400090211020a4300110009070062160211020b4300110009070063160211020c43001100090700641607001811020844004a1200654300181100090700661611020d4a1200671100044a12006843001d033c1b4301110009070069160211020e430011000907006a160211020f43004a120008430011000907001d1611000511000907006b1611000611000907006c1602110210430011000907006d1602110001430011000907006e1602110211430011000907006f16030114000a11021212007011000907007016021102130700714301110009070072160211021307007343011100090700741611000a1100090700751603001100090700761611021412007711000907007716110009423e000714000a030042413d01b6030014000111030007000013340014110301070001134a07000213070003430103002a47000607000445000203001400020700051103023a24470006070006450002030014000311030307000713070008134a0700091311030007000a1343014a0700021307000b430103002934002e11030007000c1333000b11030007000c1307000d1333001607000e11030007000c1307000d134a0700081343002534000711030007000f131400041100044700060700104500020300140004110004330011110301070001134a0700111307001243014700060700134500020300140005110300070014133300041100023247000607001545000203001400060211030443001400071100073233000711030007001613470006070017450002030014000807001814000911000247000b11000103012f170001354911000347000e110001030103012b2f170001354911000847000e110001030103022b2f170001354911000747000e110001030103032b2f170001354911000647000e110001030103042b2f170001354911000547000e110001030103052b2f170001354911000447000e110001030103062b2f17000135491100014241084211030512001907001a133247000c030011030512001907001a163e0010140003030111030512001907001a16413d004911030007001b1347003e11030007001b1344001400011103064a07001c1307001d43014a07001e1307001f430114000205000004103b0011000107002316070024110001070025164108423e0010140002030111040512001907001a16413d00421101024a070020131101010300030043034903001101024a0700211303000300030103014304070022130303132514000103021100011811040512001907001a164108420c000014000107002607002707002807002907002a07002b07002c07002d07002e07002f0700300700310700320700330700340700350700360700370700380700390c001414000211030107003a133247000e07003b11030512001907003c35423e001214000507003d11030512001907003c3542413d003b05000005203c021400031100024a0700481305000005c63b0243011400041103074a0700491311000443014a0700401305000005d33b0043014941084211050107003a134a07003e130d1100010e003f43014a0700401305000005523b0143014a07004513050000059e3b014301421100010700411307004248001007004348001607004448001c49450024030111030111010216450021030211030111010216450015030011030111010216450009030511030111010216084203011d110001070046134a0700021307004743012647000503044500020303110301110102160842021101031100011100024302421101014a07004a13070018430111040512001907003c35420d140001110214070078131400021100020700182447000a11000211000107007816110214070079131400031100030700182447000a11000311000107007a1611021407007b131400041100040700182447000a11000411000107007c161100014205000000003b0014000105000005eb3b0014000202110115430049021101164300490211011743004902110118430049021101194300491101034a12007d1101051200190211000143004302491101034a12007d11010512007e0211011a43004302491101034a12007d11010512007f0211011b43004302491101034a12007d1101051200800211000243004302491101141200814a120082030043011400030d1100030e00831400040700841400050211011c0211011d1100054301030a430214000611000647000e110006030118170006354945000503011400060211011e11000511000643024911000611010507001913070085161101034a12007d1100041101054302490211011f1101204a1200861100044301110121120087430214000702110122110123120088110007430214000811011212008907008a1314000911000932470002084211012447001b1101244a120040021101251100091100080d00430443014945000f021101251100091100080d004304490842008b051b0411061509010711063513111a00071d1a10110c3b1205543b24265b053b0411061509011a1011121d1a111007321d0611121b0c0904061b001b000d041108001b2700061d1a1304171518180b3c20393831181119111a000b371b1a0700060117001b060607151215061d100401071c3a1b001d121d1715001d1b1a212f1b161e1117005427151215061d2611191b00113a1b001d121d1715001d1b1a290f350404181124150d271107071d1b1a0627151215061d05191500171c0537061d3b270a371c061b1911543d3b2706171c061b191106371c061b19110a27000d18113911101d1504311013110003033d3004181b1510053d191513110d17061115001131181119111a000617151a0215070a131100371b1a00110c0002461009100615033d191513110c1311003d19151311301500150410150015061b1a181b15104e101500154e1d191513115b131d124f16150711424058264418333b30181c35253536353d35353535353535245b5b5b0d3c41363531353535353538353535353535363535313535353d3626353543030706170b13111b181b1715001d1b1a0d1a1b001d121d1715001d1b1a07040401071c04191d101d061715191106150a191d17061b041c1b1a1107070411151f11060b1011021d1711591d1a121b0f1615171f13061b011a1059070d1a170916180111001b1b001c12041106071d0700111a005907001b06151311141519161d111a0059181d131c005907111a071b060d151717111811061b191100110609130d061b07171b04110c1915131a11001b19110011060917181d04161b150610141517171107071d161d181d000d591102111a00070e17181d04161b15061059061115100f17181d04161b1506105903061d00110f04150d19111a00591c151a101811060b041106191d07071d1b1a070142031a1504014305050111060d041a15191104001c111a0507001500110604061b190400071306151a0011100610111a1d111005171500171c0719110707151311301d07541a1b005415540215181d1054111a0119540215180111541b1254000d041154241106191d07071d1b1a3a1519110319150403151818041e1b1d1a0e2c301b19151d1a261105011107000b170611150011241b040104130611191b02113102111a00381d0700111a11060d13181b16151827001b061513110c1b04111a3015001516150711091d1a10110c111030360b15000015171c3102111a000d3517001d02112c3b161e1117000d101d07041500171c3102111a000b15101036111c15021d1b06101510103102111a00381d0700111a11060b10110015171c3102111a0009121d06113102111a001039010015001d1b1a3b16071106021106133c20393839111a013d00111931181119111a00093d1a004c350606150d0b041b0700391107071513110d050111060d2711181117001b060b041106121b0619151a1711031a1b030618111a13001c0b171b1a00110c0039111a010f101b170119111a0031181119111a000c1a15001d021138111a13001c0b1e07321b1a0007381d07000b070d1a00150c3106061b0607131100201d191109001d191107001519040512181b1b0611131100201d19110e1b1a113b121207110008001d19110e1b1a11051915131d17060324061b0407061024061b0407031e07020b16061b03071106200d0411061d120615191103151d10050000171d100617181d111a000700002b07171d1005001b1f111a07190713200d04110b04061d0215170d391b101107151d10381d0700050000031d100800002b0311161d100700002311163d100b00002b0311161d102b02460900002311161d102246061507071d131a07041801131d1a070607170611111a06170107001b190e19073a1103201b1f111a381d0700060704181d171109001b1f111a381d0700040c19071d051d1a10110c090700061d1a131d120d041e071b1a0f2331362b3031223d37312b3d3a323b0a0611131d1b1a371b1a12090611041b0600210618',\n                'dev',\n                '[object\\x20Function]',\n                'substring',\n                '_invoke',\n                'getBattery',\n                'boeHost',\n                'asgw',\n                'Generator',\n                'boe',\n                'decorators',\n                'exports',\n                'accessor',\n                'plugins',\n                'this\\x20hasn\\x27t\\x20been\\x20initialised\\x20-\\x20super()\\x20hasn\\x27t\\x20been\\x20called',\n                'delegate',\n                'attempted\\x20to\\x20set\\x20read\\x20only\\x20static\\x20private\\x20field',\n                'callback=',\n                'MAX_TEXTURE_MAX_ANISOTROPY_EXT',\n                'toStringTag',\n                ';\\x20expires=',\n                'match',\n                'root',\n                'setItem',\n                'getContextAttributes',\n                'withCredentials',\n                'Class\\x20\\x22',\n                'mozvisibilitychange',\n                'userLanguage',\n                'createHash',\n                'map',\n                'Cannot\\x20destructure\\x20',\n                'hBytes',\n                '[object\\x20Number]',\n                'floor',\n                'access',\n                '484e4f4a403f5243001a3309b621c6a00000000048c0ec7f000000650d14000111010012000047000c1101001200001400014500090211010143001400011101024a1200014300110001150002021101030304430114000211000202110104021101051101064a12000311000143011100024302070004430218140003110003420005077563656f6860690348495109524f4b435552474b56095552544f48414f405f40676465626360616e6f6c6d6a6b686976777475727370717e7f7c474445424340414e4f4c4d4a4b484956575455525350515e5f5c16171415121310111e1f0b08',\n                'MAX_COMBINED_TEXTURE_IMAGE_UNITS',\n                'default',\n                'public',\n                'vendorSub',\n                'touchstart',\n                'getExtension',\n                'Aparajita',\n                'finalize',\n                'propertyIsEnumerable',\n                'end',\n                'localStorage',\n                '@@iterator',\n                'deviceMemory',\n                'kHttp',\n                '@@toStringTag',\n                'cookieEnabled',\n                'fromCharCode',\n                'done',\n                'set',\n                'createDataChannel',\n                'stringify',\n                'async',\n                'Descriptor',\n                'hashed',\n                'ontouchstart',\n                'onicegatheringstatechange',\n                'getOwnPropertyDescriptors',\n                'then',\n                'function',\n                'CordiaUPC',\n                'T_CLICK',\n                'EXT_texture_filter_anisotropic',\n                'MS\\x20Outlook',\n                '80pSJSjK',\n                'Jokerman',\n                'byted_acrawler',\n                'visibilityState',\n                'span',\n                'isWebmssdk',\n                '__web_idontknowwhyiwriteit__',\n                'cpuClass',\n                'serif',\n                'initialized',\n                'accessor\\x20decorators\\x20must\\x20return\\x20an\\x20object\\x20with\\x20get,\\x20set,\\x20or\\x20init\\x20properties\\x20or\\x20void\\x200',\n                '[object\\x20HTMLAllCollection]',\n                'Decorating\\x20class\\x20property\\x20failed.\\x20Please\\x20ensure\\x20that\\x20proposal-class-properties\\x20is\\x20enabled\\x20and\\x20runs\\x20after\\x20the\\x20decorators\\x20transform.',\n                '\\x27\\x20to\\x20be\\x20a\\x20function',\n                'VERSION',\n                'toLowerCase',\n                'MAX_TEXTURE_SIZE',\n                'triggerUnload',\n                'MAX_VERTEX_TEXTURE_IMAGE_UNITS',\n                'element',\n                'apply',\n                'document',\n                'exec',\n                'send',\n                ')\\x20can\\x27t\\x20be\\x20decorated.',\n                'min',\n                '484e4f4a403f5243002814122ddd79950000009eb285a1cb000000e811000114000402110201110001430147007c1102021200041400051100050700052347000f0700061102021200060c00024500120700061102021200060700041100050c0004140006021102030211020411000143011100064302140007021102051100074301140008021102061100080700054302140009021102031100071101011100090c000243021400040211010211000411000211000343034205000000003b03140003070000140001110100120001082334000611010012000247000208421101001200011400021100021101001500030011010015000211000311010015000108420007070d78173a322026043a25303b150a0a34360a3c3b2130273630252130310a3a25303b050a3a25303b0b0a0a34360a213026213c3100073826013a3e303b',\n                'vivobrowser',\n                'descriptor',\n                'language',\n                '484e4f4a403f524300023a25866a0150000000002b0aa01b000001541101001200004a12000143001400011100014a120002070003430103002a47000201420700041400021101013a070004254700060700044500090211010211010143011100022534000d1101014a1200054300070006263400161101031200071200054a12000811010143010700062634001e1101043a07000425470006070004450009021101021101044301110002253400151101044a12000543004a120002070009430103002734001e1101003a070004254700060700044500090211010211010043011100022534000d1101004a120005430007000a263400121101001200004a12000207000b430103002a34001e1101053a07000425470006070004450009021101021101054301110002254700020042021101064300324700331101073a070004254700060700044500090211010211010743011100022534000d1101074a120005430007000c2647000200420142000d096f697f685b7d7f746e0b6e7556756d7f68597b697f0773747e7f62557c087f767f796e687574096f747e7f7c73747f7e086e75496e6873747d0f417578707f796e3a4d73747e756d47096a68756e756e636a7f04797b7676085e75796f777f746e12417578707f796e3a547b6c737d7b6e7568470570697e757710417578707f796e3a5273696e75686347',\n                'vendor',\n                'level',\n                'attempted\\x20to\\x20call\\x20',\n                'placement',\n                'JS_MD5_NO_NODE_JS',\n                'initializeClassElements',\n                'indexedDB',\n                'perf',\n                'disallowProperty',\n                'lime',\n                '484e4f4a403f524300341b3e336a785800000000dbd5951f000001b50114000111010012000000254700070014000145001b1101001200000125470007011400014500090211010143001400010d010e0001010e0002010e00031100010e0004010e0005010e0006010e0007010e0008010e0009010e000a010e000b000e000c1400020211010243001100021500051100021200053247005c021101031100024301490211010411000243014902110105430011000215000702110106430011000215000802110107430011000215000902110108430011000215000b0211010943001100021500030211010a4300110002150002030014000311000303012f170003354911000311000212000b03012b2f170003354911000311000212000a03022b2f170003354911000311000212000903032b2f170003354911000311000212000803042b2f170003354911000311000212000703052b2f17000335491100031100020700061303062b2f170003354911000311000212000503072b2f17000335491100031100020700041303082b2f170003354911000311000212000303092b2f1700033549110003110002120002030a2b2f170003354911010b12000d1100032f11010b07000d354911000242000e0e547b6a796a66587c627f686344650a6f62796e687f58626c650a6864657862787f6e657f086764686a7f62646506787c627f6863036f6466086f6e697e6c6c6e790465646f6e077b636a657f6466097c6e696f79627d6e7909626568646c65627f640463646460047f6e787f076e657d68646f6e',\n                'moveList',\n                'MYRIAD\\x20PRO',\n                'An\\x20element\\x20descriptor',\n                'finallyLoc',\n                'head',\n                'innerHeight',\n                'ORIGIN:\\x20',\n                'region',\n                'addInitializer',\n                '[object\\x20SafariRemoteNotification]',\n                'candidate',\n                'content-type',\n                'userAgent',\n                'webkitHidden',\n                'test',\n                'getPrototypeOf',\n                'setDate',\n                'shiftKey',\n                'accessor.init',\n                '@@asyncIterator',\n                'accessor.set'\n            ]\n            w_0x42f5 = function () {\n                return _0x458f30\n            }\n            return w_0x42f5()\n        }\n\n        function w_0x5c3140(_0x41676a, _0x3f9548, _0x39b0b8) {\n            var _0x2145df = w_0x25f3\n\n            function _0x467cb0(_0x174e0d, _0x4ea737) {\n                var _0x569e4c = w_0x25f3,\n                    _0x3ed868 = parseInt(\n                        _0x174e0d[_0x569e4c(0x2a5)](_0x4ea737, _0x4ea737 + (0x30 * 0x1a + 0x1 * 0x1424 + -0xc2 * 0x21)),\n                        -0x253b + -0x1ce1 + -0x974 * -0x7\n                    )\n                return _0x3ed868 >>> (0x23ca + 0x882 + 0x2c45 * -0x1) == 0x11cb + -0x5c7 * 0x3 + 0x2 * -0x3b\n                    ? [-0xc * 0x300 + 0x1 * 0x1067 + 0x139a, _0x3ed868]\n                    : _0x3ed868 >>> (-0x3 * 0x3b9 + 0x4a * 0x75 + -0x16a1) == -0x742 + -0x429 + 0xb6d\n                        ? ((_0x3ed868 = ((-0x1eee + 0x1175 + 0xdb8) & _0x3ed868) << (0x2 * 0x108d + 0x2 * -0x5e6 + 0x1 * -0x1546)),\n                            [\n                                -0x949 + 0xe2f + -0x4 * 0x139,\n                                (_0x3ed868 += parseInt(\n                                    _0x174e0d['slice'](_0x4ea737 + (0x5 * -0x643 + -0x1 * 0x95 + -0x1fe6 * -0x1), _0x4ea737 + (0x9b6 + 0x8 * 0x24a + -0x1c02)),\n                                    -0xa6 * 0x11 + -0x3f * -0x1 + 0x6f * 0x19\n                                ))\n                            ])\n                        : ((_0x3ed868 = ((0x1af1 + 0x1442 + -0x964 * 0x5) & _0x3ed868) << (0x3f3 + -0xd93 + 0x9b0)),\n                            [\n                                -0x13 * -0x192 + -0x1588 + 0xc1 * -0xb,\n                                (_0x3ed868 += parseInt(\n                                    _0x174e0d[_0x569e4c(0x2a5)](\n                                        _0x4ea737 + (-0x8 * 0x39c + 0x59 * 0x35 + 0x1 * 0xa75),\n                                        _0x4ea737 + (0x1 * -0xad6 + -0x326 + 0x16 * 0xa3)\n                                    ),\n                                    0x20b0 + -0x7d + -0x1b1 * 0x13\n                                ))\n                            ])\n            }\n\n            var _0x450bf1,\n                _0x55d729 = 0x242c + 0x150c * 0x1 + -0x4 * 0xe4e,\n                _0x26f45f = [],\n                _0x408609 = [],\n                _0x5e254d = parseInt(\n                    _0x41676a[_0x2145df(0x2a5)](-0x43 * 0x7a + 0xbac * -0x1 + 0x2 * 0x15cd, -0x18c6 + -0x1515 + 0x2de3),\n                    -0x17e6 + 0x4 * -0x269 + 0x1fa * 0x11\n                ),\n                _0x56844b = parseInt(\n                    _0x41676a[_0x2145df(0x2a5)](0x262 * -0x3 + 0x19e0 + -0x12b2, 0x5 * 0x3e + 0xd * -0x2ec + -0x73 * -0x52),\n                    0x1 * 0xd69 + 0x1 * 0xb9 + -0xe12\n                )\n            if (-0x5eec40a * 0xd + 0x353b2368 + 0x60332064 !== _0x5e254d || 0x7b7 * 0x44245 + -0x712c7271 + 0x1ce9b3ad * 0x5 !== _0x56844b)\n                throw new Error(_0x2145df(0x2a7))\n            if (\n                0x2 * 0xae1 + -0x1e47 + 0x885 !==\n                parseInt(\n                    _0x41676a[_0x2145df(0x2a5)](0x1 * 0x45 + 0x149 * -0x1 + 0x114, -0x1d69 * -0x1 + 0xf47 * 0x1 + -0x2c9e),\n                    -0x59 * 0x4b + -0xfdb + -0xd7 * -0x32\n                )\n            )\n                throw new Error('ve')\n            for (_0x450bf1 = 0x2 * 0xe7d + -0xdf * -0x19 + 0x3d * -0xd5; _0x450bf1 < -0x22db * -0x1 + -0xf98 * -0x1 + -0x1 * 0x326f; ++_0x450bf1) {\n                _0x55d729 +=\n                    ((-0x1a7 * 0x3 + 0x17 * -0x47 + 0xb59) &\n                        parseInt(\n                            _0x41676a[_0x2145df(0x2a5)](\n                                0x751 * -0x4 + 0x1d * 0xfd + 0xb3 + (-0x44b * 0x7 + -0x100 + 0x1f0f) * _0x450bf1,\n                                0x8 * 0x3ae + 0x128d + -0xd * 0x3af + (0x2 * -0x80f + -0xd * 0x24a + 0x2de2) * _0x450bf1\n                            ),\n                            -0x14d6 + -0x255 + 0x173b\n                        )) <<\n                    ((-0x1ce2 * -0x1 + 0x11e3 + -0x2ec3) * _0x450bf1)\n            }\n            var _0x537efa = parseInt(\n                _0x41676a[_0x2145df(0x2a5)](0x13 * -0x209 + 0x116b + 0xc * 0x1c8, -0x26a0 + 0x10d * -0x12 + 0x39b2),\n                0x154e + -0x25e * -0xf + 0xe3 * -0x40\n            ),\n                _0x3d66d8 =\n                    (0x1bdb * 0x1 + -0x4e9 * 0x3 + -0xd1e) *\n                    parseInt(\n                        _0x41676a[_0x2145df(0x2a5)](-0x1 * -0x24f5 + 0x2279 + 0x67a * -0xb, -0x2 * -0x1083 + -0x5 * 0x185 + 0xef * -0x1b),\n                        -0x82 + 0x8e6 + 0x4 * -0x215\n                    )\n            for (\n                _0x450bf1 = -0x2471 + -0x116 * -0x7 + 0x1d0f * 0x1;\n                _0x450bf1 < _0x3d66d8 + (-0x1c * -0x106 + 0x370 + -0x8 * 0x3fc);\n                _0x450bf1 += 0x13ac * 0x1 + 0x9bd * 0x1 + -0x1 * 0x1d67\n            )\n                _0x26f45f[_0x2145df(0x36e)](\n                    parseInt(\n                        _0x41676a[_0x2145df(0x2a5)](_0x450bf1, _0x450bf1 + (0x7 * 0x539 + 0x3cb * -0x2 + -0x1 * 0x1cf7)),\n                        0x23fc + -0xa45 + -0x3 * 0x88d\n                    )\n                )\n            var _0x50f001 = _0x3d66d8 + (-0x1429 + -0x69d * -0x1 + 0x371 * 0x4),\n                _0x23f32e = parseInt(\n                    _0x41676a[_0x2145df(0x2a5)](_0x50f001, _0x50f001 + (-0x179c + -0x3f + -0x61 * -0x3f)),\n                    -0x2a * 0x65 + -0x20e5 + 0x3187\n                )\n            for (_0x50f001 += -0x20c6 + 0x3 * -0x1a5 + 0x25b9, _0x450bf1 = -0x2 * -0x766 + 0x127e + -0x214a; _0x450bf1 < _0x23f32e; ++_0x450bf1) {\n                var _0x37a7c1 = _0x467cb0(_0x41676a, _0x50f001)\n                _0x50f001 += (0xcfd + 0x399 * -0x3 + -0x7 * 0x50) * _0x37a7c1[-0x14ee + -0x912 + 0x1e00]\n                for (\n                    var _0x13d988 = '', _0x4b0c3a = -0x1bcf + 0x16cf + 0x10 * 0x50;\n                    _0x4b0c3a < _0x37a7c1[-0x476 * 0x3 + -0x112b + 0x2 * 0xf47];\n                    ++_0x4b0c3a\n                ) {\n                    var _0x49abb4 = _0x467cb0(_0x41676a, _0x50f001)\n                        ; (_0x13d988 += String[_0x2145df(0x1e2)](_0x55d729 ^ _0x49abb4[0x18f1 * -0x1 + -0x17e5 * 0x1 + -0x30d7 * -0x1])),\n                            (_0x50f001 += (0x2dd * -0xd + -0x8 * 0x227 + 0x3673) * _0x49abb4[-0xd9 + 0x1702 + -0x763 * 0x3])\n                }\n                _0x408609['push'](_0x13d988)\n            }\n            return (\n                (_0x3f9548['p'] = null),\n                (function _0x970e7(_0x3e87c6, _0x536685, _0xecd4ef, _0x5acf67, _0x560641) {\n                    var _0x261736 = _0x2145df,\n                        _0x1fc1ed,\n                        _0x281ec0,\n                        _0x5c0f33,\n                        _0xd55c82,\n                        _0x37b70b,\n                        _0x12cd72 = -(0x1bdd + -0x8 * 0x116 + -0x3 * 0x664),\n                        _0x27fcf3 = [],\n                        _0x42ef1a = [-0x5 * -0x2b6 + 0x1d6c + -0x2afa, null],\n                        _0x428c87 = null,\n                        _0x4444cf = [_0x536685]\n                    for (\n                        _0x281ec0 = Math['min'](_0x536685[_0x261736(0x259)], _0xecd4ef), _0x5c0f33 = -0x90b + -0x1 * 0x1e2f + 0x273a;\n                        _0x5c0f33 < _0x281ec0;\n                        ++_0x5c0f33\n                    )\n                        _0x4444cf[_0x261736(0x36e)](_0x536685[_0x5c0f33])\n                    _0x4444cf['p'] = _0x5acf67\n                    for (var _0x4b7ccd = []; ;)\n                        try {\n                            var _0x5cd5b9 = _0x26f45f[_0x3e87c6++]\n                            if (_0x5cd5b9 < -0x788 + 0x18c7 + 0x1 * -0x1118) {\n                                if (_0x5cd5b9 < 0x208d + -0x1031 + -0x1049 * 0x1) {\n                                    if (_0x5cd5b9 < 0x1a1c + -0xbff * 0x3 + 0x27a * 0x4)\n                                        _0x5cd5b9 < 0x3ee + 0x1 * 0x21c3 + -0x2e6 * 0xd\n                                            ? (_0x27fcf3[++_0x12cd72] =\n                                                _0x5cd5b9 < -0x61 * 0x61 + 0x1115 + 0x13ad ||\n                                                (-0x1d * -0x4f + 0x11c9 + 0x3 * -0x8e9 !== _0x5cd5b9 && null))\n                                            : _0x5cd5b9 < -0x783 + 0xa0d + -0x285\n                                                ? -0xb * 0x24f + 0x141a + 0x54e === _0x5cd5b9\n                                                    ? ((_0x1fc1ed = _0x26f45f[_0x3e87c6++]),\n                                                        (_0x27fcf3[++_0x12cd72] =\n                                                            (_0x1fc1ed << (0x12b * 0x1f + 0x5 * 0x70c + -0x4759)) >> (-0x352 + 0x7 * 0x58f + -0x237f)))\n                                                    : ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (0xb02 + 0x2af + -0xda9)) +\n                                                        _0x26f45f[_0x3e87c6 + (0x220e + 0x1 * -0x1175 + -0x1098)]),\n                                                        (_0x3e87c6 += -0x325 * 0x3 + 0xafe + -0x18d),\n                                                        (_0x27fcf3[++_0x12cd72] =\n                                                            (_0x1fc1ed << (-0xe7c * -0x1 + -0xe17 * -0x2 + -0x2a9a)) >>\n                                                            (-0x23ae * 0x1 + -0x1f8f + -0x434d * -0x1)))\n                                                : -0xa * 0x15c + 0x24bc + -0x1 * 0x171f === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            ((_0x1fc1ed = _0x26f45f[_0x3e87c6++]) << (-0x1f87 + -0xda8 + 0x2d37)) + _0x26f45f[_0x3e87c6++]) <<\n                                                            (-0x1d32 + -0x2 * 0x124 + 0x1f82)) +\n                                                        _0x26f45f[_0x3e87c6++]),\n                                                        (_0x27fcf3[++_0x12cd72] = (_0x1fc1ed << (0xc * -0x8 + -0x25f7 + 0x265f)) + _0x26f45f[_0x3e87c6++]))\n                                                    : ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (0x1bf7 + 0x4e9 * 0x7 + -0xc76 * 0x5)) +\n                                                        _0x26f45f[_0x3e87c6 + (0xba7 + -0x1611 + 0xa6b)]),\n                                                        (_0x3e87c6 += 0xa1e + -0x1a21 + 0x557 * 0x3),\n                                                        (_0x27fcf3[++_0x12cd72] = +_0x408609[_0x1fc1ed]))\n                                    else {\n                                        if (_0x5cd5b9 < 0x369 * -0x9 + 0x20de + -0x220)\n                                            _0x5cd5b9 < -0x2626 + 0x336 * -0x5 + 0x363f\n                                                ? 0x12b * -0x15 + -0x2 * -0x11f5 + 0x5ae * -0x2 === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (0x8 * 0x2 + 0x35 * 0x18 + -0x500)) +\n                                                        _0x26f45f[_0x3e87c6 + (-0x330 + -0xec * -0x5 + -0x16b)]),\n                                                        (_0x3e87c6 += 0x224 + -0x19 * -0xb3 + -0x1 * 0x139d),\n                                                        (_0x27fcf3[++_0x12cd72] = _0x408609[_0x1fc1ed]))\n                                                    : (_0x27fcf3[++_0x12cd72] = void (0x5 * 0x1ef + 0x2493 * -0x1 + -0x35d * -0x8))\n                                                : 0x1abb + 0x191 * 0xd + -0x3 * 0xfaf === _0x5cd5b9\n                                                    ? (_0x27fcf3[++_0x12cd72] = _0x560641)\n                                                    : ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (-0x20b0 + -0x3da + 0x2492)) +\n                                                        _0x26f45f[_0x3e87c6 + (-0x129d * 0x1 + 0x1 * -0x2316 + 0x35b4)]),\n                                                        (_0x3e87c6 += -0xcb8 + 0x1bb * -0xa + -0x2 * -0xf04),\n                                                        (_0x12cd72 = _0x12cd72 - _0x1fc1ed + (0xb3 * 0x1 + -0x2018 * 0x1 + 0x1 * 0x1f66)),\n                                                        (_0x281ec0 = _0x27fcf3[_0x261736(0x2a5)](_0x12cd72, _0x12cd72 + _0x1fc1ed)),\n                                                        (_0x27fcf3[_0x12cd72] = _0x281ec0))\n                                        else {\n                                            if (_0x5cd5b9 < 0x2 * -0xf38 + 0xdd0 + 0x10b1)\n                                                -0x15d2 + 0x26f0 + 0x11 * -0x101 === _0x5cd5b9\n                                                    ? (_0x27fcf3[++_0x12cd72] = {})\n                                                    : ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (-0x9ac + 0x1201 * 0x1 + -0x84d)) +\n                                                        _0x26f45f[_0x3e87c6 + (0x1ecb + -0x1bdd + 0x7 * -0x6b)]),\n                                                        (_0x3e87c6 += 0x6a4 + -0x922 + 0x280),\n                                                        (_0x281ec0 = _0x408609[_0x1fc1ed]),\n                                                        (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x27fcf3[_0x12cd72][_0x281ec0] = _0x5c0f33))\n                                            else {\n                                                if (0x17 * -0xc3 + 0x1da5 + 0x3 * -0x405 === _0x5cd5b9) {\n                                                    for (\n                                                        _0x281ec0 = _0x26f45f[_0x3e87c6++], _0x5c0f33 = _0x26f45f[_0x3e87c6++], _0xd55c82 = _0x4444cf;\n                                                        _0x281ec0 > -0x3 * 0x4ba + -0x12 * 0xb1 + 0x1aa0;\n                                                        --_0x281ec0\n                                                    )\n                                                        _0xd55c82 = _0xd55c82['p']\n                                                    _0x27fcf3[++_0x12cd72] = _0xd55c82[_0x5c0f33]\n                                                } else\n                                                    (_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (0x15c3 + -0x453 + -0x1168)) +\n                                                        _0x26f45f[_0x3e87c6 + (-0x1f3f * 0x1 + 0x1f6a + 0x6 * -0x7)]),\n                                                        (_0x3e87c6 += 0x1 * -0x1f4e + -0x118f * 0x1 + 0x30df),\n                                                        (_0x281ec0 = _0x408609[_0x1fc1ed]),\n                                                        (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72][_0x281ec0])\n                                            }\n                                        }\n                                    }\n                                } else {\n                                    if (_0x5cd5b9 < -0xf5c + -0x6d7 + 0x164e) {\n                                        if (_0x5cd5b9 < 0xc8 * -0x2f + 0xee * -0x9 + -0xf * -0x303) {\n                                            if (_0x5cd5b9 < 0x1 * -0x2426 + 0x224e + 0x11 * 0x1d) {\n                                                if (-0xb15 + 0x2d5 * 0x1 + -0x853 * -0x1 === _0x5cd5b9)\n                                                    (_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72][_0x281ec0])\n                                                else {\n                                                    for (\n                                                        _0x281ec0 = _0x26f45f[_0x3e87c6++], _0x5c0f33 = _0x26f45f[_0x3e87c6++], _0xd55c82 = _0x4444cf;\n                                                        _0x281ec0 > 0x2 * -0x11b8 + 0x240a + -0x9a;\n                                                        --_0x281ec0\n                                                    )\n                                                        _0xd55c82 = _0xd55c82['p']\n                                                    _0xd55c82[_0x5c0f33] = _0x27fcf3[_0x12cd72--]\n                                                }\n                                            } else\n                                                0x1 * 0x17f1 + 0x115 * -0x9 + 0x2d3 * -0x5 === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        (_0x26f45f[_0x3e87c6] << (0x16ff + 0x158a + -0x2c81 * 0x1)) +\n                                                        _0x26f45f[_0x3e87c6 + (0x88f * -0x3 + 0x1c82 + 0x16a * -0x2)]),\n                                                        (_0x3e87c6 += 0x1 * -0xa7 + 0x18d4 + 0x1 * -0x182b),\n                                                        (_0x281ec0 = _0x408609[_0x1fc1ed]),\n                                                        (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0xd55c82 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x5c0f33[_0x281ec0] = _0xd55c82))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0xd55c82 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x5c0f33[_0x281ec0] = _0xd55c82))\n                                        } else {\n                                            if (_0x5cd5b9 < -0x19f3 + 0x1c6b + -0x25f) {\n                                                if (0x1b * -0xbd + -0x84a * -0x2 + -0x126 * -0x3 === _0x5cd5b9) {\n                                                    for (\n                                                        _0x281ec0 = _0x26f45f[_0x3e87c6++],\n                                                        _0x5c0f33 = _0x26f45f[_0x3e87c6++],\n                                                        _0xd55c82 = _0x4444cf,\n                                                        _0xd55c82 = _0x4444cf;\n                                                        _0x281ec0 > 0x3 * -0x65a + 0xe28 + 0x4e6;\n                                                        --_0x281ec0\n                                                    )\n                                                        _0xd55c82 = _0xd55c82['p']\n                                                            ; (_0x27fcf3[++_0x12cd72] = _0xd55c82), (_0x27fcf3[++_0x12cd72] = _0x5c0f33)\n                                                } else (_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] += _0x281ec0)\n                                            } else\n                                                0x44b * -0x9 + 0x61 * -0xa + -0x2a86 * -0x1 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] -= _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] *= _0x281ec0))\n                                        }\n                                    } else\n                                        _0x5cd5b9 < 0x3 * -0x7ce + 0x907 * -0x1 + -0x1 * -0x2094\n                                            ? _0x5cd5b9 < 0xa68 + -0xc5f + 0x214\n                                                ? 0x3e * -0x7d + 0x13d1 + 0xa90 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] /= _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] %= _0x281ec0))\n                                                : -0x171d * -0x1 + -0x6a2 * -0x3 + -0x2ae6 === _0x5cd5b9\n                                                    ? (_0x27fcf3[_0x12cd72] = -_0x27fcf3[_0x12cd72])\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x27fcf3[++_0x12cd72] = _0x5c0f33[_0x281ec0]++))\n                                            : _0x5cd5b9 < 0x2565 + -0x2 * -0xd76 + -0x1bc * 0x25\n                                                ? 0x951 + 0x13da + -0x1d08 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] == _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] != _0x281ec0))\n                                                : -0x144c * -0x1 + 0xd01 + -0x2128 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] === _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] !== _0x281ec0))\n                                }\n                            } else {\n                                if (_0x5cd5b9 < -0x3bb + 0xdb6 + -0x9c2 * 0x1)\n                                    _0x5cd5b9 < -0xe16 + -0x2 * -0x409 + 0x633\n                                        ? _0x5cd5b9 < 0x1 * 0xeea + -0x3 * 0x863 + 0x2b * 0x3e\n                                            ? _0x5cd5b9 < -0x2f * -0x15 + 0x185 * 0x2 + -0x35e * 0x2\n                                                ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] < _0x281ec0))\n                                                : -0x2152 + -0x1853 + 0x39ce === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] > _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] >= _0x281ec0))\n                                            : _0x5cd5b9 < 0x3 * -0x822 + 0xc76 + 0x1bb * 0x7\n                                                ? 0x20ae + -0x21ca + -0x6d * -0x3 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] << _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] >> _0x281ec0))\n                                                : -0x10 * 0x1a + -0x1431 + 0xa * 0x233 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] >>> _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] & _0x281ec0))\n                                        : _0x5cd5b9 < 0x1 * 0x1ca7 + 0x1ea1 * 0x1 + -0x31c * 0x13\n                                            ? _0x5cd5b9 < -0xa63 * -0x2 + -0x114d + -0x1 * 0x347\n                                                ? -0x12b5 + -0x153 * 0x4 + 0x8 * 0x306 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] | _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] ^ _0x281ec0))\n                                                : -0xab + 0x10c1 + 0x9 * -0x1c4 === _0x5cd5b9\n                                                    ? (_0x27fcf3[_0x12cd72] = !_0x27fcf3[_0x12cd72])\n                                                    : ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (0x9 * -0xd0 + -0x1 * -0xa04 + 0x2 * -0x156)) +\n                                                            _0x26f45f[_0x3e87c6 + (0xa6a + 0x113c + 0x1ba5 * -0x1)]) <<\n                                                            (0x2 * -0x41b + -0x1bf1 + 0x7f * 0x49)) >>\n                                                        (-0x1bc0 + 0x232e + -0x75e)),\n                                                        (_0x3e87c6 += -0x62 * 0x31 + 0x26b * 0x7 + 0x1d7 * 0x1),\n                                                        _0x27fcf3[_0x12cd72] ? --_0x12cd72 : (_0x3e87c6 += _0x1fc1ed))\n                                            : _0x5cd5b9 < 0x8 * 0x493 + -0x6c * 0x49 + 0x1a * -0x37\n                                                ? -0x21 * 0x1 + -0x3 * -0xc19 + 0x2 * -0x11fb === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (-0x2 * 0x11ff + 0x9d3 + 0x1a33)) +\n                                                            _0x26f45f[_0x3e87c6 + (0x1ba6 + -0x134f * -0x1 + -0x2ef4)]) <<\n                                                            (0x10dc * -0x1 + -0x1130 + 0x221c)) >>\n                                                        (-0x5 * 0x685 + 0x1a23 + 0x686)),\n                                                        (_0x3e87c6 += 0x4 * 0xf9 + -0x21c5 + 0x1de3),\n                                                        _0x27fcf3[_0x12cd72] ? (_0x3e87c6 += _0x1fc1ed) : --_0x12cd72)\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        ((_0x5c0f33 = _0x27fcf3[_0x12cd72--])[_0x281ec0] = _0x27fcf3[_0x12cd72]))\n                                                : -0x5 * -0x65c + 0x15 * 0x17b + -0x3ead === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] in _0x281ec0))\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72--]), (_0x27fcf3[_0x12cd72] = _0x27fcf3[_0x12cd72] instanceof _0x281ec0))\n                                else {\n                                    if (_0x5cd5b9 < 0x52 + 0x7 * 0x102 + -0x2 * 0x38f) {\n                                        if (_0x5cd5b9 < -0x1887 + -0x303 + 0x1bc7)\n                                            _0x5cd5b9 < 0x2132 + -0x592 * 0x2 + -0x15d3\n                                                ? -0x136b + -0x21cd + 0x3571 * 0x1 === _0x5cd5b9\n                                                    ? ((_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0x27fcf3[++_0x12cd72] = delete _0x5c0f33[_0x281ec0]))\n                                                    : (_0x27fcf3[_0x12cd72] = typeof _0x27fcf3[_0x12cd72])\n                                                : 0xeed * 0x1 + -0xa1e + 0x2 * -0x24a === _0x5cd5b9\n                                                    ? ((_0x1fc1ed = _0x26f45f[_0x3e87c6++]),\n                                                        (_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        ((_0x5c0f33 = function _0x3b7712() {\n                                                            var _0x295f58 = _0x3b7712['_u'],\n                                                                _0x29116a = _0x3b7712['_v']\n                                                            return _0x295f58(\n                                                                _0x29116a[0x28c * 0x4 + -0x6 * 0x1d6 + 0xd4],\n                                                                arguments,\n                                                                _0x29116a[0x1d72 * 0x1 + 0x7b * -0x1b + -0x1078],\n                                                                _0x29116a[0x11e6 + 0x1a1f * -0x1 + 0x83b],\n                                                                this\n                                                            )\n                                                        })['_v'] = [_0x281ec0, _0x1fc1ed, _0x4444cf]),\n                                                        (_0x5c0f33['_u'] = _0x970e7),\n                                                        (_0x27fcf3[++_0x12cd72] = _0x5c0f33))\n                                                    : ((_0x1fc1ed = _0x26f45f[_0x3e87c6++]),\n                                                        (_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        ((_0xd55c82 = [\n                                                            (_0x5c0f33 = function _0x465123() {\n                                                                var _0x2f6d57 = _0x465123['_u'],\n                                                                    _0x399ae1 = _0x465123['_v']\n                                                                return _0x2f6d57(\n                                                                    _0x399ae1[-0x113b + 0xb * 0x71 + 0xc60],\n                                                                    arguments,\n                                                                    _0x399ae1[0xa13 + 0x24b0 + -0x9 * 0x532],\n                                                                    _0x399ae1[0x1 * 0x463 + -0x56 * -0x49 + -0x1ce7],\n                                                                    this\n                                                                )\n                                                            })\n                                                        ])['p'] = _0x4444cf),\n                                                        (_0x5c0f33['_v'] = [_0x281ec0, _0x1fc1ed, _0xd55c82]),\n                                                        (_0x5c0f33['_u'] = _0x970e7),\n                                                        (_0x27fcf3[++_0x12cd72] = _0x5c0f33))\n                                        else {\n                                            if (_0x5cd5b9 < 0x62 * -0xd + 0xae3 + -0x5a9)\n                                                0x9d1 * -0x1 + 0x2425 + -0x1 * 0x1a17 === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (0xd1 * 0x2 + -0xe5 * 0x7 + 0x4a9)) +\n                                                            _0x26f45f[_0x3e87c6 + (0x33a + -0xb14 + 0x7db * 0x1)]) <<\n                                                            (-0xb * -0xde + 0x1199 + -0x1b13)) >>\n                                                        (-0xa3d + 0xc * 0x2aa + -0x15ab)),\n                                                        (_0x3e87c6 += -0x2f * 0x3 + 0x2 * 0x9a3 + -0x12b7),\n                                                        ((_0x281ec0 = _0x4b7ccd[_0x4b7ccd['length'] - (0x427 + 0xa54 + -0xda * 0x11)])[\n                                                            0x5d4 + 0x14f2 + -0x4d * 0x59\n                                                        ] = _0x3e87c6 + _0x1fc1ed))\n                                                    : ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (0x349 * -0x2 + 0xa4 * -0x17 + 0x1556)) +\n                                                            _0x26f45f[_0x3e87c6 + (-0x86 * -0x2 + -0x1c9 + -0xbe * -0x1)]) <<\n                                                            (0x14bf + -0x1aec + -0x1 * -0x63d)) >>\n                                                        (0x2 * 0x17b + -0x1e3c + 0x1b56)),\n                                                        (_0x3e87c6 += -0x1 * -0x1052 + 0x10 * -0x17e + 0x790),\n                                                        (_0x281ec0 = _0x4b7ccd[_0x4b7ccd['length'] - (-0x1ad2 + 0x1b9 * 0x2 + 0x39 * 0x69)]) &&\n                                                            !_0x281ec0[-0x3 * 0xe8 + -0x5 * -0x142 + -0x1 * 0x391]\n                                                            ? ((_0x281ec0[0x25 * -0x7a + 0x21ec + -0x104a] = 0x7bf + -0x3 * -0xa43 + -0x2685),\n                                                                _0x281ec0[_0x261736(0x36e)](_0x3e87c6))\n                                                            : _0x4b7ccd[_0x261736(0x36e)]([\n                                                                -0x1d * 0x82 + -0x11f4 + 0x20af,\n                                                                0x15ac + -0x399 * -0x9 + -0x360d,\n                                                                _0x3e87c6\n                                                            ]),\n                                                        (_0x3e87c6 += _0x1fc1ed))\n                                            else {\n                                                if (0x2263 * -0x1 + -0x689 + 0x292c === _0x5cd5b9) throw (_0x281ec0 = _0x27fcf3[_0x12cd72--])\n                                                if (\n                                                    ((_0x5c0f33 = (_0x281ec0 = _0x4b7ccd['pop']())[0x1 * 0x6a1 + 0x1ceb + -0x238c]),\n                                                        (_0xd55c82 = _0x42ef1a[-0x1b8 + 0x1d25 + -0x3eb * 0x7]),\n                                                        0x751 * 0x1 + -0xa4b + 0x7 * 0x6d === _0x5c0f33)\n                                                )\n                                                    _0x3e87c6 = _0x281ec0[0x1 * 0x8e + 0x128c + -0x1319]\n                                                else {\n                                                    if (0x11f4 + 0x3 * 0x95 + -0x13b3 === _0x5c0f33) {\n                                                        if (-0x2607 + -0xdc8 + -0x1145 * -0x3 === _0xd55c82)\n                                                            _0x3e87c6 = _0x281ec0[-0x262 + -0x12bf * -0x2 + 0x13 * -0x1d9]\n                                                        else {\n                                                            if (0x6d * 0x2 + 0x2ff * -0x9 + 0x1a1e !== _0xd55c82)\n                                                                throw _0x42ef1a[0x3 * 0xced + 0x1dd7 + 0x16df * -0x3]\n                                                            if (!_0x428c87) return _0x42ef1a[0x21b7 + 0x20a5 * -0x1 + -0x5b * 0x3]\n                                                                ; (_0x3e87c6 = _0x428c87[-0x4bd + -0x3 * -0x353 + 0x53b * -0x1]),\n                                                                    (_0x560641 = _0x428c87[0x149e + 0x1 * -0x751 + -0xd4b]),\n                                                                    (_0x4444cf = _0x428c87[-0x2 * 0x94d + -0x7bf * -0x1 + 0x2 * 0x56f]),\n                                                                    (_0x4b7ccd = _0x428c87[0x15c3 * 0x1 + -0x4 * 0x82e + -0x35 * -0x35]),\n                                                                    (_0x27fcf3[++_0x12cd72] = _0x42ef1a[0x3 * 0xaf3 + -0x983 + -0x1755]),\n                                                                    (_0x42ef1a = [-0x1c1c + -0x14c * 0x1a + 0x3dd4, null]),\n                                                                    (_0x428c87 = _0x428c87[0x1a3 + 0x1 * -0x1e23 + 0x1c80])\n                                                        }\n                                                    } else\n                                                        (_0x3e87c6 = _0x281ec0[-0x1 * -0x953 + 0x159 * 0x1 + -0xaaa]),\n                                                            (_0x281ec0[0x26ad * -0x1 + 0x2 * -0xe4b + 0x4343] = 0x100d + -0x19cc + 0x5 * 0x1f3),\n                                                            _0x4b7ccd[_0x261736(0x36e)](_0x281ec0)\n                                                }\n                                            }\n                                        }\n                                    } else {\n                                        if (_0x5cd5b9 < 0x195 + -0x3b * -0x9d + -0x3 * 0xc7f) {\n                                            if (_0x5cd5b9 < 0xd * -0x1 + 0x229 + -0x1d8) {\n                                                if (-0x949 + 0x13f8 + -0xa6d === _0x5cd5b9) {\n                                                    for (\n                                                        _0x281ec0 = _0x27fcf3[_0x12cd72--], _0x5c0f33 = null;\n                                                        (_0xd55c82 = _0x4b7ccd[_0x261736(0x267)]());\n\n                                                    )\n                                                        if (\n                                                            0x1e97 + 0x31 * -0x5e + -0xc97 === _0xd55c82[0x150 + 0x6 * 0x645 + -0x26ee] ||\n                                                            0xb29 * -0x3 + -0x333 * 0x3 + 0x2b17 === _0xd55c82[0x1 * -0x22c2 + -0x187b + 0x3b3d]\n                                                        ) {\n                                                            _0x5c0f33 = _0xd55c82\n                                                            break\n                                                        }\n                                                    if (_0x5c0f33)\n                                                        (_0x42ef1a = [-0x11 * 0x14d + 0x1492 * 0x1 + 0x18c, _0x281ec0]),\n                                                            (_0x3e87c6 = _0x5c0f33[0xc28 * -0x3 + -0x8 * 0x4e1 + 0x4b82]),\n                                                            (_0x5c0f33[0x51e * 0x1 + 0x755 * -0x5 + 0x1f8b] = 0x1875 * 0x1 + 0x146 + -0x19bb),\n                                                            _0x4b7ccd[_0x261736(0x36e)](_0x5c0f33)\n                                                    else {\n                                                        if (!_0x428c87) return _0x281ec0\n                                                            ; (_0x3e87c6 = _0x428c87[0x1 * 0x15be + -0x2639 + 0x107c]),\n                                                                (_0x560641 = _0x428c87[-0x1 * 0xe1e + 0x2042 + 0x2 * -0x911]),\n                                                                (_0x4444cf = _0x428c87[0x25fd + 0x1cfe + -0x42f8]),\n                                                                (_0x4b7ccd = _0x428c87[0x3 * 0xa76 + 0x17ce + -0x372c]),\n                                                                (_0x27fcf3[++_0x12cd72] = _0x281ec0),\n                                                                (_0x42ef1a = [-0x7 * 0x4a6 + -0x12d3 + -0x3 * -0x111f, null]),\n                                                                (_0x428c87 = _0x428c87[-0x29 * 0x1e + 0x9d * -0x2f + 0x21a1])\n                                                    }\n                                                } else\n                                                    (_0x12cd72 -= _0x1fc1ed = _0x26f45f[_0x3e87c6++]),\n                                                        (_0x5c0f33 = _0x27fcf3['slice'](\n                                                            _0x12cd72 + (0xf4f * -0x1 + 0x1af9 * 0x1 + -0xba9),\n                                                            _0x12cd72 + _0x1fc1ed + (0x230 + 0x1e17 * -0x1 + 0x6fa * 0x4)\n                                                        )),\n                                                        (_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        (_0xd55c82 = _0x27fcf3[_0x12cd72--]),\n                                                        _0x281ec0['_u'] === _0x970e7\n                                                            ? ((_0x281ec0 = _0x281ec0['_v']),\n                                                                (_0x428c87 = [_0x428c87, _0x3e87c6, _0x560641, _0x4444cf, _0x4b7ccd]),\n                                                                (_0x3e87c6 = _0x281ec0[0x190c + 0x3 * 0x89b + 0x32dd * -0x1]),\n                                                                null == _0xd55c82 &&\n                                                                (_0xd55c82 = (function () {\n                                                                    return this\n                                                                })()),\n                                                                (_0x560641 = _0xd55c82),\n                                                                ((_0x4444cf = [_0x5c0f33]['concat'](_0x5c0f33))[_0x261736(0x259)] =\n                                                                    Math[_0x261736(0x20c)](_0x281ec0[-0x1 * 0x170b + -0x936 + 0x1 * 0x2042], _0x1fc1ed) +\n                                                                    (0x3 * -0x4fa + 0x21ed + -0x12fe)),\n                                                                (_0x4444cf['p'] = _0x281ec0[-0x16 * -0x1af + 0x35f * 0x1 + 0x2867 * -0x1]),\n                                                                (_0x4b7ccd = []))\n                                                            : (_0x27fcf3[++_0x12cd72] = _0x281ec0[_0x261736(0x207)](_0xd55c82, _0x5c0f33))\n                                            } else {\n                                                if (0x60a + -0xf05 * -0x1 + 0x14cb * -0x1 === _0x5cd5b9) {\n                                                    for (\n                                                        _0x1fc1ed = _0x26f45f[_0x3e87c6++],\n                                                        _0xd55c82 = [void (-0x1b5d + 0x22a1 + 0x26c * -0x3)],\n                                                        _0x37b70b = _0x1fc1ed;\n                                                        _0x37b70b > 0x1 * 0xd7e + -0x25f1 + 0x1873;\n                                                        --_0x37b70b\n                                                    )\n                                                        _0xd55c82[_0x37b70b] = _0x27fcf3[_0x12cd72--]\n                                                            ; (_0x5c0f33 = _0x27fcf3[_0x12cd72--]),\n                                                                (_0x281ec0 = Function['bind'][_0x261736(0x207)](_0x5c0f33, _0xd55c82)),\n                                                                (_0x27fcf3[++_0x12cd72] = new _0x281ec0())\n                                                } else\n                                                    _0x3e87c6 +=\n                                                        (_0x1fc1ed =\n                                                            ((_0x1fc1ed =\n                                                                (_0x26f45f[_0x3e87c6] << (0x1f7 + 0x1 * -0x7d0 + 0x7 * 0xd7)) +\n                                                                _0x26f45f[_0x3e87c6 + (0x264a + 0xc3c + -0x3285)]) <<\n                                                                (0x4 * 0x3ee + 0x45 * 0x51 + -0x15 * 0x1c9)) >>\n                                                            (0x5 * 0x199 + -0x24f * -0x2 + -0xc8b)) +\n                                                        (-0x1f3 * 0x6 + 0x24f7 + -0x1943)\n                                            }\n                                        } else\n                                            _0x5cd5b9 < -0x45d * -0x2 + -0x1e51 + 0x15e0\n                                                ? 0x125b + 0x198a + -0x2b9e === _0x5cd5b9\n                                                    ? ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (-0x269 * -0xe + 0x1 * -0x225 + -0x1f91)) +\n                                                            _0x26f45f[_0x3e87c6 + (-0x23bd * -0x1 + 0x1ce2 + 0x12 * -0x397)]) <<\n                                                            (0xc61 + -0x133b + 0x6ea)) >>\n                                                        (0x10dc + -0x30a * 0x1 + -0xdc2)),\n                                                        (_0x3e87c6 += -0xc5 * -0x9 + -0x252f + 0x1e44),\n                                                        (_0x281ec0 = _0x27fcf3[_0x12cd72--]) || (_0x3e87c6 += _0x1fc1ed))\n                                                    : ((_0x1fc1ed =\n                                                        ((_0x1fc1ed =\n                                                            (_0x26f45f[_0x3e87c6] << (0x55 * 0x14 + 0x1 * 0x1e18 + -0x3 * 0xc3c)) +\n                                                            _0x26f45f[_0x3e87c6 + (-0x22a3 + -0x5bf * -0x2 + 0x1726)]) <<\n                                                            (-0x98e * 0x4 + 0x8a1 * 0x1 + 0x1da7)) >>\n                                                        (-0x72 * -0x26 + 0x2b * -0x51 + -0x341)),\n                                                        (_0x3e87c6 += 0x47 * 0x1d + 0x137 * -0x1d + 0x1b32),\n                                                        (_0x281ec0 = _0x27fcf3[_0x12cd72--]),\n                                                        _0x27fcf3[_0x12cd72] === _0x281ec0 && (--_0x12cd72, (_0x3e87c6 += _0x1fc1ed)))\n                                                : -0xb * 0x33d + 0x23 * -0xf2 + 0x44fe === _0x5cd5b9\n                                                    ? --_0x12cd72\n                                                    : ((_0x281ec0 = _0x27fcf3[_0x12cd72]), (_0x27fcf3[++_0x12cd72] = _0x281ec0))\n                                    }\n                                }\n                            }\n                        } catch (_0x111ea4) {\n                            for (\n                                _0x42ef1a = [-0x392 * -0x4 + 0x1a0 + -0xfe8, null];\n                                (_0x1fc1ed = _0x4b7ccd[_0x261736(0x267)]()) && !_0x1fc1ed[0x126a + -0x1 * 0x227c + 0x1012 * 0x1];\n\n                            );\n                            if (!_0x1fc1ed) {\n                                _0x489bfb: for (; _0x428c87;) {\n                                    for (_0x281ec0 = _0x428c87[0x10da * -0x1 + -0x539 + 0x1617 * 0x1]; (_0x1fc1ed = _0x281ec0[_0x261736(0x267)]());)\n                                        if (_0x1fc1ed[0xaf4 * -0x2 + -0x2 * 0x132d + -0x2 * -0x1e21]) break _0x489bfb\n                                    _0x428c87 = _0x428c87[0x1381 + 0x193e + -0x4f * 0x91]\n                                }\n                                if (!_0x428c87) throw _0x111ea4\n                                    ; (_0x3e87c6 = _0x428c87[0xb * -0x277 + 0x14ac + -0x226 * -0x3]),\n                                        (_0x560641 = _0x428c87[0x153e + 0x1fd * -0xf + 0x897]),\n                                        (_0x4444cf = _0x428c87[-0x1 * -0xa2e + 0xcd6 + 0x3 * -0x7ab]),\n                                        (_0x4b7ccd = _0x428c87[-0x2 * 0x1145 + 0x2 * 0x293 + -0x3ad * -0x8]),\n                                        (_0x428c87 = _0x428c87[-0x8e7 + 0x247f + -0x1b98])\n                            }\n                            ; -0xe * 0x277 + -0x3db + -0x665 * -0x6 === (_0x281ec0 = _0x1fc1ed[-0xe65 + 0x11d1 + -0x36c])\n                                ? ((_0x3e87c6 = _0x1fc1ed[-0x7 * -0x1c + 0x2fe * 0xa + -0x1eae]),\n                                    (_0x1fc1ed[0x3f5 * 0x1 + 0x9e4 + 0x1 * -0xdd9] = -0x1622 * -0x1 + -0x1 * -0x1736 + -0x2d58),\n                                    _0x4b7ccd['push'](_0x1fc1ed),\n                                    (_0x27fcf3[++_0x12cd72] = _0x111ea4))\n                                : 0x1a52 + -0xfc4 + 0x2d * -0x3c === _0x281ec0\n                                    ? ((_0x3e87c6 = _0x1fc1ed[-0x19 * 0xfe + 0x1f98 + -0x6c8]),\n                                        (_0x1fc1ed[0x5 * -0x33f + 0x11d * -0x1 + 0x1158] = 0x3ac * 0x1 + 0x2 * -0x1300 + 0x152 * 0x1a),\n                                        _0x4b7ccd['push'](_0x1fc1ed),\n                                        (_0x42ef1a = [0x8f * 0x1d + -0x1c4b + 0xc1b, _0x111ea4]))\n                                    : ((_0x3e87c6 = _0x1fc1ed[0x31f * -0x5 + -0xae7 + -0x1 * -0x1a85]),\n                                        (_0x1fc1ed[0x27 * -0xb3 + -0x186 * 0xa + 0x2a81] = 0xf9 + 0x164a + -0x1741),\n                                        _0x4b7ccd[_0x261736(0x36e)](_0x1fc1ed),\n                                        (_0x27fcf3[++_0x12cd72] = _0x111ea4))\n                        }\n                })(_0x537efa, [], -0x1e + 0x2631 + -0x2613, _0x3f9548, _0x39b0b8)\n            )\n        }\n\n        !(function (_0xe67213, _0x19937e) {\n            _0x19937e((window.byted_acrawler = {}))\n            // var _0x40472c = w_0x25f3;\n            // 'object' == typeof exports && _0x40472c(0x384) != typeof module ? _0x19937e(exports) : _0x40472c(0x1ee) == typeof define && define['amd'] ? define([_0x40472c(0x1b8)], _0x19937e) : _0x19937e((_0xe67213 = _0x40472c(0x384) != typeof globalThis ? globalThis : _0xe67213 || self)[_0x40472c(0x1f5)] = {});\n        })(this, function (_0x1d18f2) {\n            'use strict'\n            var _0x5612de = w_0x25f3\n\n            function _0x137ba2(_0x383b51) {\n                var _0x382940 = w_0x25f3,\n                    _0x2e23ce,\n                    _0x2c2004\n\n                function _0x3a4f3f(_0x5a726e, _0x520718) {\n                    var _0x480686 = w_0x25f3\n                    try {\n                        var _0x4a8345 = _0x383b51[_0x5a726e](_0x520718),\n                            _0x8d9d0a = _0x4a8345[_0x480686(0x2e4)],\n                            _0x32f534 = _0x8d9d0a instanceof _0x59d886\n                        Promise[_0x480686(0x278)](_0x32f534 ? _0x8d9d0a['v'] : _0x8d9d0a)[_0x480686(0x1ed)](\n                            function (_0x5047be) {\n                                var _0x2a7bf3 = _0x480686\n                                if (_0x32f534) {\n                                    var _0x1c15d7 = 'return' === _0x5a726e ? _0x2a7bf3(0x2fd) : _0x2a7bf3(0x389)\n                                    if (!_0x8d9d0a['k'] || _0x5047be['done']) return _0x3a4f3f(_0x1c15d7, _0x5047be)\n                                    _0x5047be = _0x383b51[_0x1c15d7](_0x5047be)[_0x2a7bf3(0x2e4)]\n                                }\n                                _0x396815(_0x4a8345[_0x2a7bf3(0x1e3)] ? _0x2a7bf3(0x2fd) : _0x2a7bf3(0x2f1), _0x5047be)\n                            },\n                            function (_0x55c002) {\n                                var _0x11b83e = _0x480686\n                                _0x3a4f3f(_0x11b83e(0x250), _0x55c002)\n                            }\n                        )\n                    } catch (_0x5e07d1) {\n                        _0x396815(_0x480686(0x250), _0x5e07d1)\n                    }\n                }\n\n                function _0x396815(_0x189a93, _0x2988d2) {\n                    var _0x557617 = w_0x25f3\n                    switch (_0x189a93) {\n                        case _0x557617(0x2fd):\n                            _0x2e23ce[_0x557617(0x278)]({\n                                value: _0x2988d2,\n                                done: !(-0x252f + 0x1b60 + 0x9cf)\n                            })\n                            break\n                        case 'throw':\n                            _0x2e23ce[_0x557617(0x39b)](_0x2988d2)\n                            break\n                        default:\n                            _0x2e23ce[_0x557617(0x278)]({\n                                value: _0x2988d2,\n                                done: !(-0x18ec + -0x12dc + 0x2bc9)\n                            })\n                    }\n                    ; (_0x2e23ce = _0x2e23ce['next']) ? _0x3a4f3f(_0x2e23ce[_0x557617(0x392)], _0x2e23ce[_0x557617(0x327)]) : (_0x2c2004 = null)\n                }\n\n                ; (this['_invoke'] = function (_0xd1d2b8, _0x168b0a) {\n                    return new Promise(function (_0x1a939a, _0x9b7633) {\n                        var _0x1f7808 = w_0x25f3,\n                            _0x270c76 = {\n                                key: _0xd1d2b8,\n                                arg: _0x168b0a,\n                                resolve: _0x1a939a,\n                                reject: _0x9b7633,\n                                next: null\n                            }\n                        _0x2c2004\n                            ? (_0x2c2004 = _0x2c2004[_0x1f7808(0x389)] = _0x270c76)\n                            : ((_0x2e23ce = _0x2c2004 = _0x270c76), _0x3a4f3f(_0xd1d2b8, _0x168b0a))\n                    })\n                }),\n                    _0x382940(0x1ee) != typeof _0x383b51[_0x382940(0x2fd)] && (this[_0x382940(0x2fd)] = void (-0xe73 + -0xe * 0x24b + 0x2e8d))\n            }\n\n            function _0x59d886(_0x53e3a8, _0x594492) {\n                ; (this['v'] = _0x53e3a8), (this['k'] = _0x594492)\n            }\n\n            function _0x1d9867(_0x38463f, _0x559d1b, _0x1b2c54, _0x595501) {\n                return {\n                    getMetadata: function (_0x397823) {\n                        var _0x2d4b6b = w_0x25f3\n                        _0x1fca4f(_0x595501, _0x2d4b6b(0x349)), _0x525dc3(_0x397823)\n                        var _0x18296f = _0x38463f[_0x397823]\n                        if (void (-0x15d1 + 0x4d8 + -0xb * -0x18b) !== _0x18296f) {\n                            if (-0x1fa5 * -0x1 + 0x6b8 + -0x265c === _0x559d1b) {\n                                var _0x192f00 = _0x18296f[_0x2d4b6b(0x1d4)]\n                                if (void (-0x1 * 0x46d + -0x74 * 0x6 + 0x1f * 0x3b) !== _0x192f00) return _0x192f00[_0x1b2c54]\n                            } else {\n                                if (0x409 * 0x8 + 0x53 * -0x3e + -0xc2c === _0x559d1b) {\n                                    var _0x6d3fe1 = _0x18296f[_0x2d4b6b(0x261)]\n                                    if (void (0x1c7c + 0x8b0 + -0x7a * 0x4e) !== _0x6d3fe1) return _0x6d3fe1[_0x2d4b6b(0x32b)](_0x1b2c54)\n                                } else {\n                                    if (Object[_0x2d4b6b(0x3b8)][_0x2d4b6b(0x334)](_0x18296f, _0x2d4b6b(0x2ac))) return _0x18296f[_0x2d4b6b(0x2ac)]\n                                }\n                            }\n                        }\n                    },\n                    setMetadata: function (_0x3ee519, _0x4e53ba) {\n                        var _0x22e2d1 = w_0x25f3\n                        _0x1fca4f(_0x595501, _0x22e2d1(0x395)), _0x525dc3(_0x3ee519)\n                        var _0x39b490 = _0x38463f[_0x3ee519]\n                        if (\n                            (void (0x181 * -0x1 + 0x102 * 0x9 + -0x791) === _0x39b490 && (_0x39b490 = _0x38463f[_0x3ee519] = {}),\n                                -0x97e + -0x39 * -0x22 + 0x11 * 0x1d === _0x559d1b)\n                        ) {\n                            var _0x38c721 = _0x39b490[_0x22e2d1(0x1d4)]\n                            void (-0x2f9 * -0x7 + 0x8fe + -0x1dcd * 0x1) === _0x38c721 && (_0x38c721 = _0x39b490[_0x22e2d1(0x1d4)] = {}),\n                                (_0x38c721[_0x1b2c54] = _0x4e53ba)\n                        } else {\n                            if (-0x4dc + 0xbb0 + -0x6d2 === _0x559d1b) {\n                                var _0x4ca087 = _0x39b490['priv']\n                                void (0x29 * 0xb9 + -0x24a + -0x1b57) === _0x4ca087 && (_0x4ca087 = _0x39b490[_0x22e2d1(0x261)] = new Map()),\n                                    _0x4ca087[_0x22e2d1(0x1e4)](_0x1b2c54, _0x4e53ba)\n                            } else _0x39b490[_0x22e2d1(0x2ac)] = _0x4e53ba\n                        }\n                    }\n                }\n            }\n\n            function _0x43bce4(_0x282431, _0x336297) {\n                var _0xd4a703 = w_0x25f3,\n                    _0x2b5c4b = _0x282431[Symbol['metadata'] || Symbol[_0xd4a703(0x31e)]('Symbol.metadata')],\n                    _0x191a7e = Object[_0xd4a703(0x388)](_0x336297)\n                if (-0x22cd + -0x378 + -0x65 * -0x61 !== _0x191a7e[_0xd4a703(0x259)]) {\n                    for (var _0x434093 = 0x1d66 + -0x2 * 0xa03 + -0x960; _0x434093 < _0x191a7e[_0xd4a703(0x259)]; _0x434093++) {\n                        var _0x720e9a = _0x191a7e[_0x434093],\n                            _0x14e145 = _0x336297[_0x720e9a],\n                            _0x2965bc = _0x2b5c4b ? _0x2b5c4b[_0x720e9a] : null,\n                            _0x530b43 = _0x14e145[_0xd4a703(0x1d4)],\n                            _0x36f2c2 = _0x2965bc ? _0x2965bc[_0xd4a703(0x1d4)] : null\n                        _0x530b43 && _0x36f2c2 && Object['setPrototypeOf'](_0x530b43, _0x36f2c2)\n                        var _0x1732ba = _0x14e145[_0xd4a703(0x261)]\n                        if (_0x1732ba) {\n                            var _0x550c9f = Array[_0xd4a703(0x29c)](_0x1732ba['values']()),\n                                _0x5cb426 = _0x2965bc ? _0x2965bc[_0xd4a703(0x261)] : null\n                            _0x5cb426 && (_0x550c9f = _0x550c9f[_0xd4a703(0x2b8)](_0x5cb426)), (_0x14e145[_0xd4a703(0x261)] = _0x550c9f)\n                        }\n                        _0x2965bc && Object[_0xd4a703(0x23b)](_0x14e145, _0x2965bc)\n                    }\n                    _0x2b5c4b && Object['setPrototypeOf'](_0x336297, _0x2b5c4b),\n                        (_0x282431[Symbol[_0xd4a703(0x3a3)] || Symbol['for']('Symbol.metadata')] = _0x336297)\n                }\n            }\n\n            function _0x26f5a8(_0x4a45da, _0x3cff50) {\n                return function (_0x346098) {\n                    var _0x33211b = w_0x25f3\n                    _0x1fca4f(_0x3cff50, 'addInitializer'), _0x3ccc16(_0x346098, _0x33211b(0x3ba)), _0x4a45da[_0x33211b(0x36e)](_0x346098)\n                }\n            }\n\n            function _0x2bb58f(_0x256829, _0x48125d, _0x3ef27c, _0x2a2bd4, _0x3688dc, _0x348e43, _0x559d92, _0x5a7ba4, _0x9da1fe) {\n                var _0x2a79c7 = w_0x25f3,\n                    _0x2e3577\n                switch (_0x348e43) {\n                    case 0xf31 + -0x3 * 0x2dd + -0x699:\n                        _0x2e3577 = _0x2a79c7(0x1b9)\n                        break\n                    case 0x269d + -0x1291 + -0x140a:\n                        _0x2e3577 = _0x2a79c7(0x25a)\n                        break\n                    case 0x24f * -0x9 + 0x12b3 + 0x217:\n                        _0x2e3577 = _0x2a79c7(0x181)\n                        break\n                    case 0xee9 + -0xe3b * 0x1 + -0xaa:\n                        _0x2e3577 = _0x2a79c7(0x35d)\n                        break\n                    default:\n                        _0x2e3577 = _0x2a79c7(0x23c)\n                }\n                var _0x12a0c0,\n                    _0x433c00,\n                    _0x37f6a8 = {\n                        kind: _0x2e3577,\n                        name: _0x5a7ba4 ? '#' + _0x48125d : _0x48125d,\n                        isStatic: _0x559d92,\n                        isPrivate: _0x5a7ba4\n                    },\n                    _0x71731a = {\n                        v: !(-0x1b16 * -0x1 + 0x1 * 0x1fe1 + -0x2 * 0x1d7b)\n                    }\n                if ((0x15e0 + -0xdfe + -0x7e2 !== _0x348e43 && (_0x37f6a8['addInitializer'] = _0x26f5a8(_0x3688dc, _0x71731a)), _0x5a7ba4)) {\n                    ; (_0x12a0c0 = -0x2 * 0xd69 + 0x2a1 * 0x1 + 0x1833), (_0x433c00 = Symbol(_0x48125d))\n                    var _0x18857b = {}\n                    0x2b + 0x9ef * 0x1 + -0x1 * 0xa1a === _0x348e43\n                        ? ((_0x18857b[_0x2a79c7(0x32b)] = _0x3ef27c[_0x2a79c7(0x32b)]), (_0x18857b['set'] = _0x3ef27c['set']))\n                        : -0x2 * 0xd06 + 0x1816 + 0x1f8 === _0x348e43\n                            ? (_0x18857b[_0x2a79c7(0x32b)] = function () {\n                                var _0x14604b = _0x2a79c7\n                                return _0x3ef27c[_0x14604b(0x2e4)]\n                            })\n                            : ((0x6bc + 0x1 * 0x2095 + 0x10 * -0x275 !== _0x348e43 && -0x1207 + 0x31f + 0x13 * 0xc9 !== _0x348e43) ||\n                                (_0x18857b[_0x2a79c7(0x32b)] = function () {\n                                    var _0x290422 = _0x2a79c7\n                                    return _0x3ef27c[_0x290422(0x32b)][_0x290422(0x334)](this)\n                                }),\n                                (0x1296 + -0x1481 + 0x1ec !== _0x348e43 && -0x1892 + -0xfa7 + 0x283d * 0x1 !== _0x348e43) ||\n                                (_0x18857b[_0x2a79c7(0x1e4)] = function (_0x4e18b8) {\n                                    var _0x7e7883 = _0x2a79c7\n                                    _0x3ef27c['set'][_0x7e7883(0x334)](this, _0x4e18b8)\n                                })),\n                        (_0x37f6a8[_0x2a79c7(0x1d0)] = _0x18857b)\n                } else (_0x12a0c0 = 0xca0 * 0x1 + 0x83 + -0x52 * 0x29), (_0x433c00 = _0x48125d)\n                try {\n                    return _0x256829(_0x9da1fe, Object[_0x2a79c7(0x2a0)](_0x37f6a8, _0x1d9867(_0x2a2bd4, _0x12a0c0, _0x433c00, _0x71731a)))\n                } finally {\n                    _0x71731a['v'] = !(0x6ad + -0x17a9 + 0x10fc)\n                }\n            }\n\n            function _0x1fca4f(_0x322983, _0x544667) {\n                var _0x43acb9 = w_0x25f3\n                if (_0x322983['v']) throw new Error(_0x43acb9(0x214) + _0x544667 + _0x43acb9(0x168))\n            }\n\n            function _0x525dc3(_0x3ef577) {\n                var _0x42d9e9 = w_0x25f3\n                if (_0x42d9e9(0x2ed) != typeof _0x3ef577) throw new TypeError(_0x42d9e9(0x2e7) + _0x3ef577)\n            }\n\n            function _0x3ccc16(_0x56cd04, _0x56ab29) {\n                var _0x12ff08 = w_0x25f3\n                if ('function' != typeof _0x56cd04) throw new TypeError(_0x56ab29 + _0x12ff08(0x2f8))\n            }\n\n            function _0x32dfd4(_0x43869e, _0x434307) {\n                var _0x3fc8b9 = w_0x25f3,\n                    _0xd7b002 = typeof _0x434307\n                if (-0x1116 + 0x183f + 0x2 * -0x394 === _0x43869e) {\n                    if (_0x3fc8b9(0x17d) !== _0xd7b002 || null === _0x434307) throw new TypeError(_0x3fc8b9(0x1fd))\n                    void (-0x39e * -0x9 + -0x1 * 0x1241 + -0x7 * 0x20b) !== _0x434307[_0x3fc8b9(0x32b)] &&\n                        _0x3ccc16(_0x434307[_0x3fc8b9(0x32b)], _0x3fc8b9(0x170)),\n                        void (0xeff * 0x1 + 0x2673 + 0x1 * -0x3572) !== _0x434307[_0x3fc8b9(0x1e4)] &&\n                        _0x3ccc16(_0x434307[_0x3fc8b9(0x1e4)], _0x3fc8b9(0x231)),\n                        void (-0x1558 + -0x1b41 * 0x1 + 0x57 * 0x8f) !== _0x434307['init'] && _0x3ccc16(_0x434307['init'], _0x3fc8b9(0x22f)),\n                        void (-0x148f + 0xfa3 * 0x1 + 0x4ec) !== _0x434307[_0x3fc8b9(0x2d0)] &&\n                        _0x3ccc16(_0x434307[_0x3fc8b9(0x2d0)], 'accessor.initializer')\n                } else {\n                    if (_0x3fc8b9(0x1ee) !== _0xd7b002)\n                        throw new TypeError(\n                            (0xf1a + 0xce * 0x1f + -0x280c === _0x43869e\n                                ? _0x3fc8b9(0x23c)\n                                : 0x2428 + -0x6 * -0x635 + -0x495c === _0x43869e\n                                    ? _0x3fc8b9(0x19c)\n                                    : _0x3fc8b9(0x25a)) + _0x3fc8b9(0x2cd)\n                        )\n                }\n            }\n\n            function _0x372120(_0x40b476) {\n                var _0x3e830c = w_0x25f3,\n                    _0x49c5be\n                return (\n                    null == (_0x49c5be = _0x40b476['init']) &&\n                    (_0x49c5be = _0x40b476[_0x3e830c(0x2d0)]) &&\n                    _0x3e830c(0x384) != typeof console &&\n                    console[_0x3e830c(0x3b0)](_0x3e830c(0x30b)),\n                    _0x49c5be\n                )\n            }\n\n            function _0x481bfe(_0x40006c, _0xdbd444, _0x2c21df, _0x2a4c98, _0x438b52, _0x13e34d, _0x5ae545, _0xa813f0, _0x4c4bfe) {\n                var _0x2ee2fe = w_0x25f3,\n                    _0x2f4463,\n                    _0x470ce0,\n                    _0x5e0119,\n                    _0x2b261c,\n                    _0x52c40b,\n                    _0x4e02cf,\n                    _0x1fa0af = _0x2c21df[-0x987 + 0x27 * -0xdf + -0x40 * -0xae]\n                if (\n                    (_0x5ae545\n                        ? (_0x2f4463 =\n                            -0xa89 * 0x1 + -0xd71 + 0x17fa === _0x438b52 || -0x272 * -0xd + -0x1c * 0xb2 + -0xc51 === _0x438b52\n                                ? {\n                                    get: _0x2c21df[0xefd + 0x232b + -0x3225],\n                                    set: _0x2c21df[0x21b5 * -0x1 + -0x1015 + 0x31ce]\n                                }\n                                : 0x17ef + -0x1d3 + 0x1619 * -0x1 === _0x438b52\n                                    ? {\n                                        get: _0x2c21df[-0x1e92 + 0xff * -0xe + 0x2c87]\n                                    }\n                                    : -0x2211 + 0x1568 + 0xcad === _0x438b52\n                                        ? {\n                                            set: _0x2c21df[-0xcd2 + 0x126e + 0x1 * -0x599]\n                                        }\n                                        : {\n                                            value: _0x2c21df[0x2293 + -0x1815 + -0xa7b * 0x1]\n                                        })\n                        : 0x23f1 + -0x93b * -0x4 + 0x1 * -0x48dd !== _0x438b52 && (_0x2f4463 = Object[_0x2ee2fe(0x2a6)](_0xdbd444, _0x2a4c98)),\n                        -0x9a5 + 0x2cc * -0x5 + -0xb * -0x226 === _0x438b52\n                            ? (_0x5e0119 = {\n                                get: _0x2f4463['get'],\n                                set: _0x2f4463[_0x2ee2fe(0x1e4)]\n                            })\n                            : -0xb5c + 0x210d + -0x1ab * 0xd === _0x438b52\n                                ? (_0x5e0119 = _0x2f4463[_0x2ee2fe(0x2e4)])\n                                : -0x12e2 * -0x2 + 0x1 * 0x815 + -0x2dd6 === _0x438b52\n                                    ? (_0x5e0119 = _0x2f4463['get'])\n                                    : 0x6 * 0x182 + 0x15fd + -0x1f05 * 0x1 === _0x438b52 && (_0x5e0119 = _0x2f4463[_0x2ee2fe(0x1e4)]),\n                        _0x2ee2fe(0x1ee) == typeof _0x1fa0af)\n                )\n                    void (0x12b3 * -0x2 + 0x1229 * 0x1 + 0x133d) !==\n                        (_0x2b261c = _0x2bb58f(_0x1fa0af, _0x2a4c98, _0x2f4463, _0xa813f0, _0x4c4bfe, _0x438b52, _0x13e34d, _0x5ae545, _0x5e0119)) &&\n                        (_0x32dfd4(_0x438b52, _0x2b261c),\n                            -0x655 + -0xb75 + 0x9 * 0x1fa === _0x438b52\n                                ? (_0x470ce0 = _0x2b261c)\n                                : 0x2239 + -0x9 * -0x42b + -0x47bb === _0x438b52\n                                    ? ((_0x470ce0 = _0x372120(_0x2b261c)),\n                                        (_0x52c40b = _0x2b261c[_0x2ee2fe(0x32b)] || _0x5e0119[_0x2ee2fe(0x32b)]),\n                                        (_0x4e02cf = _0x2b261c['set'] || _0x5e0119['set']),\n                                        (_0x5e0119 = {\n                                            get: _0x52c40b,\n                                            set: _0x4e02cf\n                                        }))\n                                    : (_0x5e0119 = _0x2b261c))\n                else\n                    for (\n                        var _0x5801c7 = _0x1fa0af['length'] - (0x2435 + 0x18d0 + 0x16 * -0x2c6);\n                        _0x5801c7 >= 0x3ab + 0x58e * -0x6 + 0x1da9;\n                        _0x5801c7--\n                    ) {\n                        var _0x2c9ee5\n                        void (0x11 * -0x22 + -0x29 * -0x45 + 0x8cb * -0x1) !==\n                            (_0x2b261c = _0x2bb58f(\n                                _0x1fa0af[_0x5801c7],\n                                _0x2a4c98,\n                                _0x2f4463,\n                                _0xa813f0,\n                                _0x4c4bfe,\n                                _0x438b52,\n                                _0x13e34d,\n                                _0x5ae545,\n                                _0x5e0119\n                            )) &&\n                            (_0x32dfd4(_0x438b52, _0x2b261c),\n                                -0x220e + 0x3 * 0x4d5 + 0x138f === _0x438b52\n                                    ? (_0x2c9ee5 = _0x2b261c)\n                                    : -0x2 * -0x1281 + 0x48f * 0x7 + -0x44ea === _0x438b52\n                                        ? ((_0x2c9ee5 = _0x372120(_0x2b261c)),\n                                            (_0x52c40b = _0x2b261c[_0x2ee2fe(0x32b)] || _0x5e0119[_0x2ee2fe(0x32b)]),\n                                            (_0x4e02cf = _0x2b261c[_0x2ee2fe(0x1e4)] || _0x5e0119[_0x2ee2fe(0x1e4)]),\n                                            (_0x5e0119 = {\n                                                get: _0x52c40b,\n                                                set: _0x4e02cf\n                                            }))\n                                        : (_0x5e0119 = _0x2b261c),\n                                void (0x204c + -0x2618 + 0x7 * 0xd4) !== _0x2c9ee5 &&\n                                (void (0x3b3 * 0x9 + -0x2709 + 0x69 * 0xe) === _0x470ce0\n                                    ? (_0x470ce0 = _0x2c9ee5)\n                                    : _0x2ee2fe(0x1ee) == typeof _0x470ce0\n                                        ? (_0x470ce0 = [_0x470ce0, _0x2c9ee5])\n                                        : _0x470ce0['push'](_0x2c9ee5)))\n                    }\n                if (-0x236c + 0xbb8 + 0x17b4 === _0x438b52 || 0x1 * 0x13e5 + -0x73 * -0xd + -0x1 * 0x19bb === _0x438b52) {\n                    if (void (0x213e + 0xef + -0x222d) === _0x470ce0)\n                        _0x470ce0 = function (_0x2f3a47, _0x29873e) {\n                            return _0x29873e\n                        }\n                    else {\n                        if (_0x2ee2fe(0x1ee) != typeof _0x470ce0) {\n                            var _0x41d3b0 = _0x470ce0\n                            _0x470ce0 = function (_0x434b4b, _0x5f49e4) {\n                                var _0x463980 = _0x2ee2fe\n                                for (\n                                    var _0x99d6c0 = _0x5f49e4, _0x29ba97 = -0x120f * 0x1 + 0x1241 + -0x1 * 0x32;\n                                    _0x29ba97 < _0x41d3b0['length'];\n                                    _0x29ba97++\n                                )\n                                    _0x99d6c0 = _0x41d3b0[_0x29ba97][_0x463980(0x334)](_0x434b4b, _0x99d6c0)\n                                return _0x99d6c0\n                            }\n                        } else {\n                            var _0x58c0cd = _0x470ce0\n                            _0x470ce0 = function (_0x15ad86, _0x1885c8) {\n                                return _0x58c0cd['call'](_0x15ad86, _0x1885c8)\n                            }\n                        }\n                    }\n                    _0x40006c[_0x2ee2fe(0x36e)](_0x470ce0)\n                }\n                0x1 * -0x241 + 0xf4f + -0xd0e !== _0x438b52 &&\n                    (0x1 * 0x10e7 + -0x47c + -0x2 * 0x635 === _0x438b52\n                        ? ((_0x2f4463[_0x2ee2fe(0x32b)] = _0x5e0119[_0x2ee2fe(0x32b)]), (_0x2f4463[_0x2ee2fe(0x1e4)] = _0x5e0119[_0x2ee2fe(0x1e4)]))\n                        : -0x53 * 0x6b + 0x16e * 0x8 + 0x1743 === _0x438b52\n                            ? (_0x2f4463[_0x2ee2fe(0x2e4)] = _0x5e0119)\n                            : 0x4 * -0x4cd + -0x1 * -0x211a + 0x1 * -0xde3 === _0x438b52\n                                ? (_0x2f4463['get'] = _0x5e0119)\n                                : -0x1d4b * 0x1 + 0x1853 + 0x4fc === _0x438b52 && (_0x2f4463[_0x2ee2fe(0x1e4)] = _0x5e0119),\n                        _0x5ae545\n                            ? 0x5 * -0x28 + 0xcfd + -0xc34 * 0x1 === _0x438b52\n                                ? (_0x40006c[_0x2ee2fe(0x36e)](function (_0x21a97b, _0x5eb78e) {\n                                    var _0x40880e = _0x2ee2fe\n                                    return _0x5e0119[_0x40880e(0x32b)][_0x40880e(0x334)](_0x21a97b, _0x5eb78e)\n                                }),\n                                    _0x40006c[_0x2ee2fe(0x36e)](function (_0x2fa7d1, _0x120ab2) {\n                                        var _0x14b22a = _0x2ee2fe\n                                        return _0x5e0119[_0x14b22a(0x1e4)][_0x14b22a(0x334)](_0x2fa7d1, _0x120ab2)\n                                    }))\n                                : -0x4 * 0x64c + -0x1 * 0xe54 + 0x13c3 * 0x2 === _0x438b52\n                                    ? _0x40006c['push'](_0x5e0119)\n                                    : _0x40006c[_0x2ee2fe(0x36e)](function (_0xcb08af, _0x156de1) {\n                                        var _0x327ef4 = _0x2ee2fe\n                                        return _0x5e0119[_0x327ef4(0x334)](_0xcb08af, _0x156de1)\n                                    })\n                            : Object[_0x2ee2fe(0x175)](_0xdbd444, _0x2a4c98, _0x2f4463))\n            }\n\n            function _0xa6bc9e(_0x4ceb2c, _0x1b99e7, _0xa8afec, _0x19fdc6, _0x501635) {\n                var _0x4c0532 = w_0x25f3\n                for (\n                    var _0xcd77fa, _0x29d8ee, _0x1865b0 = new Map(), _0x4b9277 = new Map(), _0xbb3086 = 0x8 * 0x5e + 0x1f79 + -0x17 * 0x17f;\n                    _0xbb3086 < _0x501635[_0x4c0532(0x259)];\n                    _0xbb3086++\n                ) {\n                    var _0x58c865 = _0x501635[_0xbb3086]\n                    if (Array['isArray'](_0x58c865)) {\n                        var _0x203b06,\n                            _0x4069ae,\n                            _0x479925,\n                            _0x2ccf6e = _0x58c865[-0x3f4 + -0x1cc4 + -0x1 * -0x20b9],\n                            _0x138f67 = _0x58c865[0x17b7 + 0x1 * 0x1525 + -0x2cda],\n                            _0xf00e58 = _0x58c865[_0x4c0532(0x259)] > -0x9f5 + -0xd * -0x103 + -0x5 * 0xa3,\n                            _0x356344 = _0x2ccf6e >= -0x14cc + -0xe02 + 0x6f7 * 0x5\n                        if (\n                            (_0x356344\n                                ? ((_0x203b06 = _0x1b99e7),\n                                    (_0x4069ae = _0x19fdc6),\n                                    0x7 * -0x3c7 + -0x225e + 0x3ccf != (_0x2ccf6e -= -0xdf * 0x17 + -0xb0c + 0x1f1a) &&\n                                    (_0x479925 = _0x29d8ee = _0x29d8ee || []))\n                                : ((_0x203b06 = _0x1b99e7[_0x4c0532(0x344)]),\n                                    (_0x4069ae = _0xa8afec),\n                                    -0xc0c + 0x1a8e + -0x2 * 0x741 !== _0x2ccf6e && (_0x479925 = _0xcd77fa = _0xcd77fa || [])),\n                                -0x135b + 0xba6 + -0x7b5 * -0x1 !== _0x2ccf6e && !_0xf00e58)\n                        ) {\n                            var _0x5ef9f5 = _0x356344 ? _0x4b9277 : _0x1865b0,\n                                _0x4ff161 = _0x5ef9f5[_0x4c0532(0x32b)](_0x138f67) || 0x2 * 0x27b + 0x137 * 0x1d + -0x2831\n                            if (\n                                !(-0xea4 + 0x2178 + 0x96a * -0x2) === _0x4ff161 ||\n                                (-0x1dce + 0x245d + -0x346 * 0x2 === _0x4ff161 && -0x6 * -0x38f + -0x4 * 0x179 + 0xf72 * -0x1 !== _0x2ccf6e) ||\n                                (0x1265 + -0x40 * 0x6a + -0x21 * -0x3f === _0x4ff161 && -0x14bf + -0x1fa6 + 0x3468 !== _0x2ccf6e)\n                            )\n                                throw new Error(_0x4c0532(0x351) + _0x138f67)\n                            !_0x4ff161 && _0x2ccf6e > -0x895 * 0x1 + 0x9fa + -0x163\n                                ? _0x5ef9f5[_0x4c0532(0x1e4)](_0x138f67, _0x2ccf6e)\n                                : _0x5ef9f5['set'](_0x138f67, !(-0x1a * 0x12 + 0xa1 * 0x1d + -0x1069 * 0x1))\n                        }\n                        _0x481bfe(_0x4ceb2c, _0x203b06, _0x58c865, _0x138f67, _0x2ccf6e, _0x356344, _0xf00e58, _0x4069ae, _0x479925)\n                    }\n                }\n                _0x3657e2(_0x4ceb2c, _0xcd77fa), _0x3657e2(_0x4ceb2c, _0x29d8ee)\n            }\n\n            function _0x3657e2(_0x27f72c, _0x8206e1) {\n                var _0x4690f1 = w_0x25f3\n                _0x8206e1 &&\n                    _0x27f72c[_0x4690f1(0x36e)](function (_0x5a459a) {\n                        var _0x25d832 = _0x4690f1\n                        for (var _0x3abe8d = -0x2d8 + -0x38c + 0x664; _0x3abe8d < _0x8206e1['length']; _0x3abe8d++)\n                            _0x8206e1[_0x3abe8d][_0x25d832(0x334)](_0x5a459a)\n                        return _0x5a459a\n                    })\n            }\n\n            function _0x5f3676(_0x5c13b5, _0x4779ee, _0x3479c8, _0x3cb840) {\n                var _0x5df6f5 = w_0x25f3\n                if (_0x3cb840['length'] > -0x1744 + -0xfb * 0xd + 0x2403) {\n                    for (\n                        var _0x3c4c21 = [],\n                        _0x504436 = _0x4779ee,\n                        _0x1b5d8b = _0x4779ee['name'],\n                        _0x38689d = _0x3cb840[_0x5df6f5(0x259)] - (-0x1f5e + 0x1e2c * 0x1 + 0x133);\n                        _0x38689d >= 0x878 + -0x1269 * 0x2 + 0x1c5a;\n                        _0x38689d--\n                    ) {\n                        var _0x2bbf37 = {\n                            v: !(0x1 * -0x17dc + -0x1f4 * -0x10 + -0x3d * 0x1f)\n                        }\n                        try {\n                            var _0x175a61 = Object['assign'](\n                                {\n                                    kind: _0x5df6f5(0x19c),\n                                    name: _0x1b5d8b,\n                                    addInitializer: _0x26f5a8(_0x3c4c21, _0x2bbf37)\n                                },\n                                _0x1d9867(_0x3479c8, -0x1dfa + -0x1517 + 0x3311, _0x1b5d8b, _0x2bbf37)\n                            ),\n                                _0x23fff7 = _0x3cb840[_0x38689d](_0x504436, _0x175a61)\n                        } finally {\n                            _0x2bbf37['v'] = !(0x1 * -0x1e5d + -0xba7 * 0x2 + 0x35ab)\n                        }\n                        void (-0x2bf + -0x103d * -0x1 + -0xd7e) !== _0x23fff7 && (_0x32dfd4(0xcf3 + -0x9f8 + -0x2f1, _0x23fff7), (_0x504436 = _0x23fff7))\n                    }\n                    _0x5c13b5[_0x5df6f5(0x36e)](_0x504436, function () {\n                        var _0x52b1c0 = _0x5df6f5\n                        for (var _0x4f0e95 = 0x18 * 0x57 + 0x9f2 * 0x3 + -0x25fe; _0x4f0e95 < _0x3c4c21[_0x52b1c0(0x259)]; _0x4f0e95++)\n                            _0x3c4c21[_0x4f0e95][_0x52b1c0(0x334)](_0x504436)\n                    })\n                }\n            }\n\n            function _0x51be3f(_0x44772e, _0x5243ca, _0x398fa6) {\n                var _0x234a54 = w_0x25f3,\n                    _0x13ba59 = [],\n                    _0x3f8aa9 = {},\n                    _0x129506 = {}\n                return (\n                    _0xa6bc9e(_0x13ba59, _0x44772e, _0x129506, _0x3f8aa9, _0x5243ca),\n                    _0x43bce4(_0x44772e[_0x234a54(0x344)], _0x129506),\n                    _0x5f3676(_0x13ba59, _0x44772e, _0x3f8aa9, _0x398fa6),\n                    _0x43bce4(_0x44772e, _0x3f8aa9),\n                    _0x13ba59\n                )\n            }\n\n            function _0x281b3b() {\n                function _0x556aac(_0xe6f04c, _0x2cf155) {\n                    return function (_0x4ecc37) {\n                        var _0x253daa = w_0x25f3\n                        !(function (_0x109a83, _0x5991fe) {\n                            var _0x11a2fc = w_0x25f3\n                            if (_0x109a83['v']) throw new Error(_0x11a2fc(0x257))\n                        })(_0x2cf155),\n                            _0x3020d2(_0x4ecc37, _0x253daa(0x3ba)),\n                            _0xe6f04c[_0x253daa(0x36e)](_0x4ecc37)\n                    }\n                }\n\n                function _0x193050(_0xc0995a, _0x3ee2bb, _0x30e0b6, _0xba208c, _0x262641, _0x4fa001, _0x1bb0d5, _0xa6e531) {\n                    var _0x208bac = w_0x25f3,\n                        _0x59dc77\n                    switch (_0x262641) {\n                        case 0x1af6 + -0xd13 + -0xde2:\n                            _0x59dc77 = 'accessor'\n                            break\n                        case 0xfda + -0x760 + -0x878:\n                            _0x59dc77 = _0x208bac(0x25a)\n                            break\n                        case 0x1a * 0xb9 + 0xc3f + -0x1f06:\n                            _0x59dc77 = 'getter'\n                            break\n                        case -0xb42 * 0x3 + -0x12d9 + 0x34a3:\n                            _0x59dc77 = 'setter'\n                            break\n                        default:\n                            _0x59dc77 = _0x208bac(0x23c)\n                    }\n                    var _0x1b169f,\n                        _0x3fad4b,\n                        _0x1050cb = {\n                            kind: _0x59dc77,\n                            name: _0x1bb0d5 ? '#' + _0x3ee2bb : _0x3ee2bb,\n                            static: _0x4fa001,\n                            private: _0x1bb0d5\n                        },\n                        _0x252772 = {\n                            v: !(0x5 * 0x4d5 + -0x1 * 0x1d6e + 0x546)\n                        }\n                        ; -0x21ff + -0x127a + -0x3479 * -0x1 !== _0x262641 && (_0x1050cb['addInitializer'] = _0x556aac(_0xba208c, _0x252772)),\n                            -0x2c9 + -0x27 + 0x2f0 === _0x262641\n                                ? _0x1bb0d5\n                                    ? ((_0x1b169f = _0x30e0b6['get']), (_0x3fad4b = _0x30e0b6[_0x208bac(0x1e4)]))\n                                    : ((_0x1b169f = function () {\n                                        return this[_0x3ee2bb]\n                                    }),\n                                        (_0x3fad4b = function (_0x417555) {\n                                            this[_0x3ee2bb] = _0x417555\n                                        }))\n                                : 0x1 * -0x1d61 + -0x1 * 0x841 + -0xc8c * -0x3 === _0x262641\n                                    ? (_0x1b169f = function () {\n                                        var _0x195f9b = _0x208bac\n                                        return _0x30e0b6[_0x195f9b(0x2e4)]\n                                    })\n                                    : ((0x1 * -0x1e49 + 0x1 * 0x1eef + 0x37 * -0x3 !== _0x262641 && 0x1 * 0x204a + -0x137 * -0xb + -0x2da4 !== _0x262641) ||\n                                        (_0x1b169f = function () {\n                                            var _0x3ad118 = _0x208bac\n                                            return _0x30e0b6[_0x3ad118(0x32b)][_0x3ad118(0x334)](this)\n                                        }),\n                                        (0x729 + -0x7ae + 0x1 * 0x86 !== _0x262641 && -0xa * -0x161 + -0x512 + -0x2 * 0x45a !== _0x262641) ||\n                                        (_0x3fad4b = function (_0x37b522) {\n                                            var _0x599416 = _0x208bac\n                                            _0x30e0b6[_0x599416(0x1e4)]['call'](this, _0x37b522)\n                                        })),\n                            (_0x1050cb[_0x208bac(0x1d0)] =\n                                _0x1b169f && _0x3fad4b\n                                    ? {\n                                        get: _0x1b169f,\n                                        set: _0x3fad4b\n                                    }\n                                    : _0x1b169f\n                                        ? {\n                                            get: _0x1b169f\n                                        }\n                                        : {\n                                            set: _0x3fad4b\n                                        })\n                    try {\n                        return _0xc0995a(_0xa6e531, _0x1050cb)\n                    } finally {\n                        _0x252772['v'] = !(-0x1 * 0x1ecf + 0x1cfc + 0x1d3)\n                    }\n                }\n\n                function _0x3020d2(_0x5684cc, _0x512b77) {\n                    var _0x3b7e7a = w_0x25f3\n                    if (_0x3b7e7a(0x1ee) != typeof _0x5684cc) throw new TypeError(_0x512b77 + '\\x20must\\x20be\\x20a\\x20function')\n                }\n\n                function _0x13d7df(_0x22787a, _0x4a8dfe) {\n                    var _0x994eff = w_0x25f3,\n                        _0x751eff = typeof _0x4a8dfe\n                    if (-0x690 + 0x133f * -0x2 + 0x2d0f === _0x22787a) {\n                        if (_0x994eff(0x17d) !== _0x751eff || null === _0x4a8dfe) throw new TypeError(_0x994eff(0x1fd))\n                        void (-0x2af + 0x838 + -0xd * 0x6d) !== _0x4a8dfe[_0x994eff(0x32b)] && _0x3020d2(_0x4a8dfe[_0x994eff(0x32b)], _0x994eff(0x170)),\n                            void (0x1b * -0x43 + -0x24c8 + 0x2bd9) !== _0x4a8dfe[_0x994eff(0x1e4)] &&\n                            _0x3020d2(_0x4a8dfe[_0x994eff(0x1e4)], _0x994eff(0x231)),\n                            void (-0x2a4 + 0x35 * -0x1d + 0x8a5) !== _0x4a8dfe[_0x994eff(0x3b9)] &&\n                            _0x3020d2(_0x4a8dfe[_0x994eff(0x3b9)], _0x994eff(0x22f))\n                    } else {\n                        if ('function' !== _0x751eff)\n                            throw new TypeError(\n                                (-0x800 + 0xd * 0x75 + 0x20f === _0x22787a\n                                    ? _0x994eff(0x23c)\n                                    : 0x13ad + 0x1db0 + -0x3153 === _0x22787a\n                                        ? _0x994eff(0x19c)\n                                        : _0x994eff(0x25a)) + '\\x20decorators\\x20must\\x20return\\x20a\\x20function\\x20or\\x20void\\x200'\n                            )\n                    }\n                }\n\n                function _0x3345ab(_0xc8cad8, _0x5d015f, _0x32f33f, _0x5f5169, _0x23451f, _0x2595f8, _0xb8bdee, _0x2c3fb2) {\n                    var _0x1d74f6 = w_0x25f3,\n                        _0x584e33,\n                        _0x103b18,\n                        _0x5d6523,\n                        _0x2d18a1,\n                        _0x2b9fd3,\n                        _0x11479e,\n                        _0x4ef3d6 = _0x32f33f[0x23c3 + -0x1a88 + 0x1 * -0x93b]\n                    if (\n                        (_0xb8bdee\n                            ? (_0x584e33 =\n                                0x7ed * 0x1 + 0xac9 + -0x12b6 === _0x23451f || 0x4 * 0x7f5 + 0x11ab + 0x712 * -0x7 === _0x23451f\n                                    ? {\n                                        get: _0x32f33f[0x265e * 0x1 + -0x23e1 + -0x1 * 0x27a],\n                                        set: _0x32f33f[0x108e + -0x2551 + 0x1b * 0xc5]\n                                    }\n                                    : 0x19bc + 0x1c0d * 0x1 + 0x35c6 * -0x1 === _0x23451f\n                                        ? {\n                                            get: _0x32f33f[-0x7fd * 0x4 + 0x1b6c + 0x48b]\n                                        }\n                                        : 0x149a + 0x2522 + -0x39b8 === _0x23451f\n                                            ? {\n                                                set: _0x32f33f[-0x1 * 0x3ad + -0xb4e * 0x2 + -0x9 * -0x2ec]\n                                            }\n                                            : {\n                                                value: _0x32f33f[0x21a6 + -0x7 + -0x219c]\n                                            })\n                            : 0x12ab * 0x1 + -0x1f41 + 0xc96 !== _0x23451f && (_0x584e33 = Object[_0x1d74f6(0x2a6)](_0x5d015f, _0x5f5169)),\n                            0x11 * -0xf7 + -0x4 * 0x7be + 0x2f60 === _0x23451f\n                                ? (_0x5d6523 = {\n                                    get: _0x584e33[_0x1d74f6(0x32b)],\n                                    set: _0x584e33['set']\n                                })\n                                : 0x1e3 + 0x2 * 0x11ef + -0x25bf === _0x23451f\n                                    ? (_0x5d6523 = _0x584e33[_0x1d74f6(0x2e4)])\n                                    : -0x6b + 0x1ff8 + -0xfc5 * 0x2 === _0x23451f\n                                        ? (_0x5d6523 = _0x584e33['get'])\n                                        : 0x2577 + -0x2272 + -0x301 === _0x23451f && (_0x5d6523 = _0x584e33[_0x1d74f6(0x1e4)]),\n                            'function' == typeof _0x4ef3d6)\n                    )\n                        void (0x1bdc * -0x1 + 0x2343 + -0x1 * 0x767) !==\n                            (_0x2d18a1 = _0x193050(_0x4ef3d6, _0x5f5169, _0x584e33, _0x2c3fb2, _0x23451f, _0x2595f8, _0xb8bdee, _0x5d6523)) &&\n                            (_0x13d7df(_0x23451f, _0x2d18a1),\n                                -0x5 * -0x27e + 0x6a * 0x1e + -0x18e2 === _0x23451f\n                                    ? (_0x103b18 = _0x2d18a1)\n                                    : 0x23f1 + -0x4 * 0x8bb + 0x14 * -0xd === _0x23451f\n                                        ? ((_0x103b18 = _0x2d18a1['init']),\n                                            (_0x2b9fd3 = _0x2d18a1[_0x1d74f6(0x32b)] || _0x5d6523[_0x1d74f6(0x32b)]),\n                                            (_0x11479e = _0x2d18a1[_0x1d74f6(0x1e4)] || _0x5d6523[_0x1d74f6(0x1e4)]),\n                                            (_0x5d6523 = {\n                                                get: _0x2b9fd3,\n                                                set: _0x11479e\n                                            }))\n                                        : (_0x5d6523 = _0x2d18a1))\n                    else\n                        for (var _0x4328fb = _0x4ef3d6[_0x1d74f6(0x259)] - (0xe31 + -0xc5b + -0x1d5); _0x4328fb >= 0x87a + -0xf7c + 0x702; _0x4328fb--) {\n                            var _0x5c4cc8\n                            void (0x83b + -0x8af + 0x74) !==\n                                (_0x2d18a1 = _0x193050(\n                                    _0x4ef3d6[_0x4328fb],\n                                    _0x5f5169,\n                                    _0x584e33,\n                                    _0x2c3fb2,\n                                    _0x23451f,\n                                    _0x2595f8,\n                                    _0xb8bdee,\n                                    _0x5d6523\n                                )) &&\n                                (_0x13d7df(_0x23451f, _0x2d18a1),\n                                    -0x4 * 0x511 + -0xc0a * -0x1 + 0x83a === _0x23451f\n                                        ? (_0x5c4cc8 = _0x2d18a1)\n                                        : -0x22 * -0x4d + -0x135d * -0x2 + 0x1051 * -0x3 === _0x23451f\n                                            ? ((_0x5c4cc8 = _0x2d18a1[_0x1d74f6(0x3b9)]),\n                                                (_0x2b9fd3 = _0x2d18a1[_0x1d74f6(0x32b)] || _0x5d6523[_0x1d74f6(0x32b)]),\n                                                (_0x11479e = _0x2d18a1[_0x1d74f6(0x1e4)] || _0x5d6523[_0x1d74f6(0x1e4)]),\n                                                (_0x5d6523 = {\n                                                    get: _0x2b9fd3,\n                                                    set: _0x11479e\n                                                }))\n                                            : (_0x5d6523 = _0x2d18a1),\n                                    void (0x23b9 * 0x1 + 0x2 * -0xccb + -0x5 * 0x207) !== _0x5c4cc8 &&\n                                    (void (-0x15ac + 0x376 + 0x7e * 0x25) === _0x103b18\n                                        ? (_0x103b18 = _0x5c4cc8)\n                                        : _0x1d74f6(0x1ee) == typeof _0x103b18\n                                            ? (_0x103b18 = [_0x103b18, _0x5c4cc8])\n                                            : _0x103b18['push'](_0x5c4cc8)))\n                        }\n                    if (-0x11a3 + 0xd * -0x2f2 + -0x67 * -0x8b === _0x23451f || 0xeab * -0x1 + 0x752 * -0x1 + -0x15fe * -0x1 === _0x23451f) {\n                        if (void (-0x4a8 * 0x1 + 0xfb0 + -0xb08) === _0x103b18)\n                            _0x103b18 = function (_0x1682da, _0x55e4de) {\n                                return _0x55e4de\n                            }\n                        else {\n                            if (_0x1d74f6(0x1ee) != typeof _0x103b18) {\n                                var _0x278a7c = _0x103b18\n                                _0x103b18 = function (_0x1c32a2, _0x442b39) {\n                                    var _0x56cde3 = _0x1d74f6\n                                    for (\n                                        var _0x200043 = _0x442b39, _0x52eaec = 0xc8a + 0x26f6 + 0x20 * -0x19c;\n                                        _0x52eaec < _0x278a7c[_0x56cde3(0x259)];\n                                        _0x52eaec++\n                                    )\n                                        _0x200043 = _0x278a7c[_0x52eaec]['call'](_0x1c32a2, _0x200043)\n                                    return _0x200043\n                                }\n                            } else {\n                                var _0x120537 = _0x103b18\n                                _0x103b18 = function (_0x5a0b99, _0x523966) {\n                                    var _0x2de49d = _0x1d74f6\n                                    return _0x120537[_0x2de49d(0x334)](_0x5a0b99, _0x523966)\n                                }\n                            }\n                        }\n                        _0xc8cad8['push'](_0x103b18)\n                    }\n                    0x3ac * -0x8 + 0x915 + 0x144b !== _0x23451f &&\n                        (-0xcde + -0x1f3f + 0x2c1e === _0x23451f\n                            ? ((_0x584e33[_0x1d74f6(0x32b)] = _0x5d6523['get']), (_0x584e33[_0x1d74f6(0x1e4)] = _0x5d6523['set']))\n                            : -0x31 * -0xc1 + -0x1 * -0x2388 + -0x4877 === _0x23451f\n                                ? (_0x584e33[_0x1d74f6(0x2e4)] = _0x5d6523)\n                                : -0x4 * 0x899 + 0x1944 + 0x923 === _0x23451f\n                                    ? (_0x584e33[_0x1d74f6(0x32b)] = _0x5d6523)\n                                    : -0x64e * 0x5 + 0x152f + 0xa5b === _0x23451f && (_0x584e33[_0x1d74f6(0x1e4)] = _0x5d6523),\n                            _0xb8bdee\n                                ? 0x186b + 0x3 * 0x7e9 + -0x1ed * 0x19 === _0x23451f\n                                    ? (_0xc8cad8[_0x1d74f6(0x36e)](function (_0x1c7663, _0x210e49) {\n                                        var _0xb35933 = _0x1d74f6\n                                        return _0x5d6523['get'][_0xb35933(0x334)](_0x1c7663, _0x210e49)\n                                    }),\n                                        _0xc8cad8[_0x1d74f6(0x36e)](function (_0x9ce4a0, _0xa2a6a5) {\n                                            var _0x548bf5 = _0x1d74f6\n                                            return _0x5d6523[_0x548bf5(0x1e4)][_0x548bf5(0x334)](_0x9ce4a0, _0xa2a6a5)\n                                        }))\n                                    : -0x2 * 0x91d + -0x226e + 0x282 * 0x15 === _0x23451f\n                                        ? _0xc8cad8['push'](_0x5d6523)\n                                        : _0xc8cad8[_0x1d74f6(0x36e)](function (_0x5b9e9b, _0x4ef49d) {\n                                            return _0x5d6523['call'](_0x5b9e9b, _0x4ef49d)\n                                        })\n                                : Object[_0x1d74f6(0x175)](_0x5d015f, _0x5f5169, _0x584e33))\n                }\n\n                function _0xbbd38b(_0x42478e, _0x1ef3db) {\n                    var _0x15d90a = w_0x25f3\n                    _0x1ef3db &&\n                        _0x42478e[_0x15d90a(0x36e)](function (_0xdfc40e) {\n                            var _0x10548c = _0x15d90a\n                            for (var _0x3e6f2c = -0x349 * -0xa + 0xe * 0x5b + -0x25d4; _0x3e6f2c < _0x1ef3db[_0x10548c(0x259)]; _0x3e6f2c++)\n                                _0x1ef3db[_0x3e6f2c][_0x10548c(0x334)](_0xdfc40e)\n                            return _0xdfc40e\n                        })\n                }\n\n                return function (_0x2327f5, _0x28ca06, _0x53ed99) {\n                    var _0x253a06 = []\n                    return (\n                        (function (_0x1816e5, _0x29e49e, _0x48cb46) {\n                            var _0x5efef1 = w_0x25f3\n                            for (\n                                var _0x5857a9, _0x48222e, _0x2f7979 = new Map(), _0x2e733e = new Map(), _0x4b6d1a = 0x1 * -0xec3 + 0x1 * 0x6a2 + 0x821;\n                                _0x4b6d1a < _0x48cb46[_0x5efef1(0x259)];\n                                _0x4b6d1a++\n                            ) {\n                                var _0x58c6d3 = _0x48cb46[_0x4b6d1a]\n                                if (Array['isArray'](_0x58c6d3)) {\n                                    var _0x124b63,\n                                        _0x4324aa,\n                                        _0x8c2a39 = _0x58c6d3[-0x1d3a + -0x24ff + 0x423a],\n                                        _0x8fabbd = _0x58c6d3[0x1b14 + -0x1 * -0x1f0c + -0x1d0f * 0x2],\n                                        _0x249da3 = _0x58c6d3[_0x5efef1(0x259)] > 0x1 * 0xb42 + -0x1c1 * 0xe + -0x1 * -0xd4f,\n                                        _0x11d04c = _0x8c2a39 >= -0x12b3 * 0x1 + 0x10e6 + 0x1d2\n                                    if (\n                                        (_0x11d04c\n                                            ? ((_0x124b63 = _0x29e49e),\n                                                -0x15b * -0x5 + 0x373 + -0xa3a != (_0x8c2a39 -= -0x24b2 + -0x12b * 0x17 + 0x3f94) &&\n                                                (_0x4324aa = _0x48222e = _0x48222e || []))\n                                            : ((_0x124b63 = _0x29e49e['prototype']),\n                                                0x11fa + -0x1859 + 0x65f !== _0x8c2a39 && (_0x4324aa = _0x5857a9 = _0x5857a9 || [])),\n                                            -0x11df + -0x205d * 0x1 + 0x323c !== _0x8c2a39 && !_0x249da3)\n                                    ) {\n                                        var _0x3e0748 = _0x11d04c ? _0x2e733e : _0x2f7979,\n                                            _0x148749 = _0x3e0748[_0x5efef1(0x32b)](_0x8fabbd) || 0x6c0 + 0x8e3 + 0x1 * -0xfa3\n                                        if (\n                                            !(-0x288 + -0x1b8f + 0x1e17) === _0x148749 ||\n                                            (0xcae + -0x84a + -0x461 === _0x148749 && 0xebc + -0x6cf + -0x7e9 !== _0x8c2a39) ||\n                                            (0x132d * 0x2 + 0x1 * 0x6ab + -0x1 * 0x2d01 === _0x148749 && 0x2144 + -0xe17 * -0x1 + -0x2f58 !== _0x8c2a39)\n                                        )\n                                            throw new Error(\n                                                'Attempted\\x20to\\x20decorate\\x20a\\x20public\\x20method/accessor\\x20that\\x20has\\x20the\\x20same\\x20name\\x20as\\x20a\\x20previously\\x20decorated\\x20public\\x20method/accessor.\\x20This\\x20is\\x20not\\x20currently\\x20supported\\x20by\\x20the\\x20decorators\\x20plugin.\\x20Property\\x20name\\x20was:\\x20' +\n                                                _0x8fabbd\n                                            )\n                                        !_0x148749 && _0x8c2a39 > -0x2ea * -0xc + 0x1 * 0x24cb + 0x1 * -0x47c1\n                                            ? _0x3e0748[_0x5efef1(0x1e4)](_0x8fabbd, _0x8c2a39)\n                                            : _0x3e0748[_0x5efef1(0x1e4)](_0x8fabbd, !(0xb9e + -0xc * -0x9d + -0x12fa))\n                                    }\n                                    _0x3345ab(_0x1816e5, _0x124b63, _0x58c6d3, _0x8fabbd, _0x8c2a39, _0x11d04c, _0x249da3, _0x4324aa)\n                                }\n                            }\n                            _0xbbd38b(_0x1816e5, _0x5857a9), _0xbbd38b(_0x1816e5, _0x48222e)\n                        })(_0x253a06, _0x2327f5, _0x28ca06),\n                        (function (_0x528ea3, _0x4f695c, _0x1527df) {\n                            var _0x436c1d = w_0x25f3\n                            if (_0x1527df[_0x436c1d(0x259)] > 0xe5 + 0x269c + -0x2781) {\n                                for (\n                                    var _0x4e0e1b = [],\n                                    _0x3eca99 = _0x4f695c,\n                                    _0x5c69d2 = _0x4f695c[_0x436c1d(0x341)],\n                                    _0x2abebb = _0x1527df[_0x436c1d(0x259)] - (0x1 * -0x1cbe + 0xa * -0x2ba + 0x3803);\n                                    _0x2abebb >= 0x8c0 + -0x44d * 0x4 + 0x874;\n                                    _0x2abebb--\n                                ) {\n                                    var _0x30122e = {\n                                        v: !(0x26bb + 0x34c * 0x7 + 0x1 * -0x3dce)\n                                    }\n                                    try {\n                                        var _0x46e0b1 = _0x1527df[_0x2abebb](_0x3eca99, {\n                                            kind: _0x436c1d(0x19c),\n                                            name: _0x5c69d2,\n                                            addInitializer: _0x556aac(_0x4e0e1b, _0x30122e)\n                                        })\n                                    } finally {\n                                        _0x30122e['v'] = !(0x114e + 0x1f1 * -0x1 + 0x1 * -0xf5d)\n                                    }\n                                    void (-0x1 * -0x1c41 + 0x38d * 0x1 + -0x1fce) !== _0x46e0b1 &&\n                                        (_0x13d7df(0x180 + 0x6 * -0x2f + -0x5c, _0x46e0b1), (_0x3eca99 = _0x46e0b1))\n                                }\n                                _0x528ea3['push'](_0x3eca99, function () {\n                                    var _0x1ef0f8 = _0x436c1d\n                                    for (var _0x337d50 = 0x1 * -0x217d + -0x1a35 + -0x2 * -0x1dd9; _0x337d50 < _0x4e0e1b[_0x1ef0f8(0x259)]; _0x337d50++)\n                                        _0x4e0e1b[_0x337d50]['call'](_0x3eca99)\n                                })\n                            }\n                        })(_0x253a06, _0x2327f5, _0x53ed99),\n                        _0x253a06\n                    )\n                }\n            }\n\n            var _0x15b960, _0x500e9f\n\n            function _0x4ab133(_0x538caa, _0x1dca3a, _0x362c83) {\n                return (_0x15b960 = _0x15b960 || _0x281b3b())(_0x538caa, _0x1dca3a, _0x362c83)\n            }\n\n            function _0x4591cd() {\n                function _0x135cea(_0x43f619, _0x5dfa54) {\n                    return function (_0x33b776) {\n                        var _0x55feea = w_0x25f3\n                        !(function (_0x4d2467, _0x1aaab5) {\n                            var _0x188bf8 = w_0x25f3\n                            if (_0x4d2467['v']) throw new Error(_0x188bf8(0x257))\n                        })(_0x5dfa54),\n                            _0x23bc0c(_0x33b776, _0x55feea(0x3ba)),\n                            _0x43f619[_0x55feea(0x36e)](_0x33b776)\n                    }\n                }\n\n                function _0x39ceae(_0x5713eb, _0x3cd64b, _0x2a5e05, _0x428f9b, _0x1cd0f5, _0x386fff, _0x54211b, _0x40ee96) {\n                    var _0x32bd6c = w_0x25f3,\n                        _0x43d2aa\n                    switch (_0x1cd0f5) {\n                        case -0x3 * -0x9f7 + 0x13bc + -0x31a0:\n                            _0x43d2aa = _0x32bd6c(0x1b9)\n                            break\n                        case 0x14f5 + -0x1f56 + -0x1 * -0xa63:\n                            _0x43d2aa = _0x32bd6c(0x25a)\n                            break\n                        case -0x1 * -0x346 + -0xe + 0x335 * -0x1:\n                            _0x43d2aa = _0x32bd6c(0x181)\n                            break\n                        case -0x2 * -0x367 + 0x16b3 + -0x1 * 0x1d7d:\n                            _0x43d2aa = _0x32bd6c(0x35d)\n                            break\n                        default:\n                            _0x43d2aa = _0x32bd6c(0x23c)\n                    }\n                    var _0x1f76cf,\n                        _0x2d3a63,\n                        _0x52dc9f = {\n                            kind: _0x43d2aa,\n                            name: _0x54211b ? '#' + _0x3cd64b : _0x3cd64b,\n                            static: _0x386fff,\n                            private: _0x54211b\n                        },\n                        _0x33b885 = {\n                            v: !(0x1 * 0xea1 + 0x22b7 + 0x3157 * -0x1)\n                        }\n                        ; -0x948 + -0x2454 + 0x1c * 0x1a1 !== _0x1cd0f5 && (_0x52dc9f[_0x32bd6c(0x225)] = _0x135cea(_0x428f9b, _0x33b885)),\n                            0xb * 0xb1 + 0x1417 + -0x1bb2 === _0x1cd0f5\n                                ? _0x54211b\n                                    ? ((_0x1f76cf = _0x2a5e05[_0x32bd6c(0x32b)]), (_0x2d3a63 = _0x2a5e05['set']))\n                                    : ((_0x1f76cf = function () {\n                                        return this[_0x3cd64b]\n                                    }),\n                                        (_0x2d3a63 = function (_0x209e9f) {\n                                            this[_0x3cd64b] = _0x209e9f\n                                        }))\n                                : 0x240f + 0xc11 * 0x3 + -0x22 * 0x220 === _0x1cd0f5\n                                    ? (_0x1f76cf = function () {\n                                        var _0x446fc0 = _0x32bd6c\n                                        return _0x2a5e05[_0x446fc0(0x2e4)]\n                                    })\n                                    : ((-0x4 * -0x1f6 + 0x1b48 + -0x231f !== _0x1cd0f5 && 0x61 * 0x1a + -0x113 * -0x11 + -0x1c1a !== _0x1cd0f5) ||\n                                        (_0x1f76cf = function () {\n                                            var _0x447b7b = _0x32bd6c\n                                            return _0x2a5e05['get'][_0x447b7b(0x334)](this)\n                                        }),\n                                        (0x1e4e + 0x25b6 * -0x1 + 0x769 !== _0x1cd0f5 && 0x1397 + -0xb7e + -0x815 !== _0x1cd0f5) ||\n                                        (_0x2d3a63 = function (_0x4c071d) {\n                                            _0x2a5e05['set']['call'](this, _0x4c071d)\n                                        })),\n                            (_0x52dc9f[_0x32bd6c(0x1d0)] =\n                                _0x1f76cf && _0x2d3a63\n                                    ? {\n                                        get: _0x1f76cf,\n                                        set: _0x2d3a63\n                                    }\n                                    : _0x1f76cf\n                                        ? {\n                                            get: _0x1f76cf\n                                        }\n                                        : {\n                                            set: _0x2d3a63\n                                        })\n                    try {\n                        return _0x5713eb(_0x40ee96, _0x52dc9f)\n                    } finally {\n                        _0x33b885['v'] = !(-0x8c9 + 0x2 * -0x1189 + 0x2bdb)\n                    }\n                }\n\n                function _0x23bc0c(_0x4aa0f2, _0x12640a) {\n                    var _0x1b925e = w_0x25f3\n                    if (_0x1b925e(0x1ee) != typeof _0x4aa0f2) throw new TypeError(_0x12640a + _0x1b925e(0x2f8))\n                }\n\n                function _0x2de5e4(_0x3de3bb, _0xa398ec) {\n                    var _0xf94308 = w_0x25f3,\n                        _0x2c8661 = typeof _0xa398ec\n                    if (-0x33 * 0x4c + 0x5 * 0x787 + -0x1 * 0x167e === _0x3de3bb) {\n                        if (_0xf94308(0x17d) !== _0x2c8661 || null === _0xa398ec) throw new TypeError(_0xf94308(0x1fd))\n                        void (-0x1e03 + -0x1eb + 0xff7 * 0x2) !== _0xa398ec[_0xf94308(0x32b)] && _0x23bc0c(_0xa398ec[_0xf94308(0x32b)], 'accessor.get'),\n                            void (0x3ba + -0x24db + -0xb0b * -0x3) !== _0xa398ec[_0xf94308(0x1e4)] &&\n                            _0x23bc0c(_0xa398ec[_0xf94308(0x1e4)], _0xf94308(0x231)),\n                            void (0x7f8 + -0x1b10 + -0x1318 * -0x1) !== _0xa398ec[_0xf94308(0x3b9)] && _0x23bc0c(_0xa398ec['init'], _0xf94308(0x22f))\n                    } else {\n                        if (_0xf94308(0x1ee) !== _0x2c8661)\n                            throw new TypeError(\n                                (-0xf65 + 0xbd0 + 0x395 === _0x3de3bb\n                                    ? _0xf94308(0x23c)\n                                    : 0x48e + -0x1 * 0x1ebe + 0x1a3a === _0x3de3bb\n                                        ? _0xf94308(0x19c)\n                                        : _0xf94308(0x25a)) + _0xf94308(0x2cd)\n                            )\n                    }\n                }\n\n                function _0x343a1e(_0xc4b124, _0x1026d8, _0x47c875, _0x150a83, _0x4cdf11, _0x3e4a0b, _0x1dd313, _0x2b027d) {\n                    var _0x1c87ab = w_0x25f3,\n                        _0x2f46a5,\n                        _0x5a2be0,\n                        _0x547138,\n                        _0x289168,\n                        _0x1e1872,\n                        _0xd2fd89,\n                        _0x17ee52 = _0x47c875[-0x2099 + -0x133 * 0x1 + 0x21cc]\n                    if (\n                        (_0x1dd313\n                            ? (_0x2f46a5 =\n                                0xb0a + 0x2125 + -0x2c2f === _0x4cdf11 || 0x12ea + 0x5ba + 0x385 * -0x7 === _0x4cdf11\n                                    ? {\n                                        get: _0x47c875[0x1cf3 + 0x7 * -0x57d + 0x97b],\n                                        set: _0x47c875[0x6 * 0x210 + -0x2b3 * 0x3 + 0x1 * -0x443]\n                                    }\n                                    : 0x1f7b + -0x2 * 0x1253 + 0x52e * 0x1 === _0x4cdf11\n                                        ? {\n                                            get: _0x47c875[0x1476 + 0x23 * -0xb5 + 0x44c]\n                                        }\n                                        : 0x2290 + -0x20e6 + -0x1a6 === _0x4cdf11\n                                            ? {\n                                                set: _0x47c875[0x1465 * -0x1 + -0x1 * 0x7d9 + -0x1 * -0x1c41]\n                                            }\n                                            : {\n                                                value: _0x47c875[-0x1550 + 0xb0f + 0xa44]\n                                            })\n                            : 0x8bb + 0x37b + 0x1 * -0xc36 !== _0x4cdf11 && (_0x2f46a5 = Object[_0x1c87ab(0x2a6)](_0x1026d8, _0x150a83)),\n                            -0xf * -0x49 + -0x8c3 * -0x1 + 0xd09 * -0x1 === _0x4cdf11\n                                ? (_0x547138 = {\n                                    get: _0x2f46a5[_0x1c87ab(0x32b)],\n                                    set: _0x2f46a5['set']\n                                })\n                                : -0x7c4 + 0x1da9 + -0x15e3 === _0x4cdf11\n                                    ? (_0x547138 = _0x2f46a5[_0x1c87ab(0x2e4)])\n                                    : 0x7e1 + -0x159a + 0xdbc === _0x4cdf11\n                                        ? (_0x547138 = _0x2f46a5[_0x1c87ab(0x32b)])\n                                        : 0x105 + 0x177d * 0x1 + 0xbe * -0x21 === _0x4cdf11 && (_0x547138 = _0x2f46a5['set']),\n                            _0x1c87ab(0x1ee) == typeof _0x17ee52)\n                    )\n                        void (-0x12c9 + 0x3 * -0x2f + 0x1e * 0xa5) !==\n                            (_0x289168 = _0x39ceae(_0x17ee52, _0x150a83, _0x2f46a5, _0x2b027d, _0x4cdf11, _0x3e4a0b, _0x1dd313, _0x547138)) &&\n                            (_0x2de5e4(_0x4cdf11, _0x289168),\n                                -0x1cc9 + -0x2 * 0xb5d + 0x1 * 0x3383 === _0x4cdf11\n                                    ? (_0x5a2be0 = _0x289168)\n                                    : -0x1 * 0x1517 + 0x25 * 0x44 + 0xb44 === _0x4cdf11\n                                        ? ((_0x5a2be0 = _0x289168[_0x1c87ab(0x3b9)]),\n                                            (_0x1e1872 = _0x289168[_0x1c87ab(0x32b)] || _0x547138['get']),\n                                            (_0xd2fd89 = _0x289168[_0x1c87ab(0x1e4)] || _0x547138[_0x1c87ab(0x1e4)]),\n                                            (_0x547138 = {\n                                                get: _0x1e1872,\n                                                set: _0xd2fd89\n                                            }))\n                                        : (_0x547138 = _0x289168))\n                    else\n                        for (\n                            var _0x5a46d9 = _0x17ee52[_0x1c87ab(0x259)] - (-0x49 * 0x19 + 0x4a2 + 0x280);\n                            _0x5a46d9 >= -0x225b + 0x1562 + 0xcf9;\n                            _0x5a46d9--\n                        ) {\n                            var _0x60a0d7\n                            void (-0xffd + 0x7 * -0x293 + 0x2202) !==\n                                (_0x289168 = _0x39ceae(\n                                    _0x17ee52[_0x5a46d9],\n                                    _0x150a83,\n                                    _0x2f46a5,\n                                    _0x2b027d,\n                                    _0x4cdf11,\n                                    _0x3e4a0b,\n                                    _0x1dd313,\n                                    _0x547138\n                                )) &&\n                                (_0x2de5e4(_0x4cdf11, _0x289168),\n                                    0x52 * -0x59 + 0x9 * -0x104 + 0x2 * 0x12d3 === _0x4cdf11\n                                        ? (_0x60a0d7 = _0x289168)\n                                        : -0x1689 + 0x1e96 + -0x80c === _0x4cdf11\n                                            ? ((_0x60a0d7 = _0x289168['init']),\n                                                (_0x1e1872 = _0x289168[_0x1c87ab(0x32b)] || _0x547138['get']),\n                                                (_0xd2fd89 = _0x289168[_0x1c87ab(0x1e4)] || _0x547138[_0x1c87ab(0x1e4)]),\n                                                (_0x547138 = {\n                                                    get: _0x1e1872,\n                                                    set: _0xd2fd89\n                                                }))\n                                            : (_0x547138 = _0x289168),\n                                    void (-0x1a77 + -0x136f + -0xeb * -0x32) !== _0x60a0d7 &&\n                                    (void (-0x519 + -0x1 * -0x1245 + -0x2 * 0x696) === _0x5a2be0\n                                        ? (_0x5a2be0 = _0x60a0d7)\n                                        : _0x1c87ab(0x1ee) == typeof _0x5a2be0\n                                            ? (_0x5a2be0 = [_0x5a2be0, _0x60a0d7])\n                                            : _0x5a2be0[_0x1c87ab(0x36e)](_0x60a0d7)))\n                        }\n                    if (0x78c + 0x1d71 * -0x1 + 0x15e5 * 0x1 === _0x4cdf11 || -0x49 * 0x6 + 0x1e * 0xd2 + -0x1 * 0x16e5 === _0x4cdf11) {\n                        if (void (0x21db + 0x22d * 0xd + -0x3e24) === _0x5a2be0)\n                            _0x5a2be0 = function (_0x5345b0, _0x1a659b) {\n                                return _0x1a659b\n                            }\n                        else {\n                            if ('function' != typeof _0x5a2be0) {\n                                var _0x336daa = _0x5a2be0\n                                _0x5a2be0 = function (_0x30e05d, _0xf3b4df) {\n                                    var _0x4d9e7f = _0x1c87ab\n                                    for (\n                                        var _0x362c52 = _0xf3b4df, _0x22ed8a = 0x1 * 0x1f3c + -0x610 + -0x192c;\n                                        _0x22ed8a < _0x336daa[_0x4d9e7f(0x259)];\n                                        _0x22ed8a++\n                                    )\n                                        _0x362c52 = _0x336daa[_0x22ed8a]['call'](_0x30e05d, _0x362c52)\n                                    return _0x362c52\n                                }\n                            } else {\n                                var _0x5aed3b = _0x5a2be0\n                                _0x5a2be0 = function (_0x5dc978, _0x5db160) {\n                                    return _0x5aed3b['call'](_0x5dc978, _0x5db160)\n                                }\n                            }\n                        }\n                        _0xc4b124[_0x1c87ab(0x36e)](_0x5a2be0)\n                    }\n                    0x177a + -0xe7 * -0x1c + 0x22 * -0x16f !== _0x4cdf11 &&\n                        (0x3af + 0x9 * -0x217 + 0x50b * 0x3 === _0x4cdf11\n                            ? ((_0x2f46a5[_0x1c87ab(0x32b)] = _0x547138[_0x1c87ab(0x32b)]), (_0x2f46a5[_0x1c87ab(0x1e4)] = _0x547138[_0x1c87ab(0x1e4)]))\n                            : 0x18a3 * -0x1 + 0x263c + -0xd97 === _0x4cdf11\n                                ? (_0x2f46a5[_0x1c87ab(0x2e4)] = _0x547138)\n                                : -0x4 * -0x31b + -0x837 * 0x4 + -0x5 * -0x417 === _0x4cdf11\n                                    ? (_0x2f46a5[_0x1c87ab(0x32b)] = _0x547138)\n                                    : -0x1a2e + 0x2 * 0x131d + -0xc08 === _0x4cdf11 && (_0x2f46a5[_0x1c87ab(0x1e4)] = _0x547138),\n                            _0x1dd313\n                                ? -0x1 * -0x1757 + 0x1ada + -0x3230 === _0x4cdf11\n                                    ? (_0xc4b124[_0x1c87ab(0x36e)](function (_0xb886c1, _0x3a6bf5) {\n                                        var _0x288d67 = _0x1c87ab\n                                        return _0x547138[_0x288d67(0x32b)][_0x288d67(0x334)](_0xb886c1, _0x3a6bf5)\n                                    }),\n                                        _0xc4b124[_0x1c87ab(0x36e)](function (_0x337452, _0x50608d) {\n                                            var _0x44b896 = _0x1c87ab\n                                            return _0x547138[_0x44b896(0x1e4)][_0x44b896(0x334)](_0x337452, _0x50608d)\n                                        }))\n                                    : -0x2 * 0x93d + 0x297 + -0x139 * -0xd === _0x4cdf11\n                                        ? _0xc4b124['push'](_0x547138)\n                                        : _0xc4b124[_0x1c87ab(0x36e)](function (_0x1e24c7, _0x120c64) {\n                                            var _0x3e3294 = _0x1c87ab\n                                            return _0x547138[_0x3e3294(0x334)](_0x1e24c7, _0x120c64)\n                                        })\n                                : Object[_0x1c87ab(0x175)](_0x1026d8, _0x150a83, _0x2f46a5))\n                }\n\n                function _0x4c3a0d(_0x48207f, _0x257e35) {\n                    var _0x1249e7 = w_0x25f3\n                    for (\n                        var _0x47fbbd,\n                        _0x402774,\n                        _0x333e3a = [],\n                        _0xe5fb1e = new Map(),\n                        _0x15f194 = new Map(),\n                        _0x41a1c1 = -0x1 * 0x575 + -0x13c0 + -0x1b * -0xef;\n                        _0x41a1c1 < _0x257e35[_0x1249e7(0x259)];\n                        _0x41a1c1++\n                    ) {\n                        var _0x63ddf3 = _0x257e35[_0x41a1c1]\n                        if (Array[_0x1249e7(0x2af)](_0x63ddf3)) {\n                            var _0x446366,\n                                _0x186385,\n                                _0x19186f = _0x63ddf3[-0x5bc * 0x4 + 0xf6a * -0x1 + -0x3 * -0xcc9],\n                                _0x4911c0 = _0x63ddf3[0x1 * 0x46 + -0xb73 + 0xb2f],\n                                _0x39f6a1 = _0x63ddf3['length'] > -0x4 * -0x101 + -0xe6c + 0xa6b,\n                                _0x27b8e1 = _0x19186f >= 0xb76 + 0x73 * -0x34 + 0x71 * 0x1b\n                            if (\n                                (_0x27b8e1\n                                    ? ((_0x446366 = _0x48207f),\n                                        0x26c + -0x157d + -0x65b * -0x3 != (_0x19186f -= 0x2324 + 0x27 * 0xbe + -0x4011) &&\n                                        (_0x186385 = _0x402774 = _0x402774 || []))\n                                    : ((_0x446366 = _0x48207f[_0x1249e7(0x344)]),\n                                        -0x7 * 0x297 + 0x1b26 + -0x905 !== _0x19186f && (_0x186385 = _0x47fbbd = _0x47fbbd || [])),\n                                    0x13d6 * -0x1 + 0x1 * 0xbb7 + 0x81f !== _0x19186f && !_0x39f6a1)\n                            ) {\n                                var _0x3f295f = _0x27b8e1 ? _0x15f194 : _0xe5fb1e,\n                                    _0x566c7b = _0x3f295f[_0x1249e7(0x32b)](_0x4911c0) || -0x188 * -0xb + 0x3e * 0x49 + -0x2286\n                                if (\n                                    !(0x903 * -0x1 + -0x1f * -0x8d + 0x1 * -0x810) === _0x566c7b ||\n                                    (-0x43 * 0x5 + -0x1c6c + 0x2f * 0xa2 === _0x566c7b && -0x737 + -0x1ac2 + 0x21fd !== _0x19186f) ||\n                                    (0xdd2 + -0x202b + 0x125d === _0x566c7b && -0x1 * 0x118d + -0x2b8 * -0x3 + 0x8 * 0x12d !== _0x19186f)\n                                )\n                                    throw new Error(\n                                        'Attempted\\x20to\\x20decorate\\x20a\\x20public\\x20method/accessor\\x20that\\x20has\\x20the\\x20same\\x20name\\x20as\\x20a\\x20previously\\x20decorated\\x20public\\x20method/accessor.\\x20This\\x20is\\x20not\\x20currently\\x20supported\\x20by\\x20the\\x20decorators\\x20plugin.\\x20Property\\x20name\\x20was:\\x20' +\n                                        _0x4911c0\n                                    )\n                                !_0x566c7b && _0x19186f > 0xf * -0x26f + 0x1 * 0x79d + 0x1ce6 * 0x1\n                                    ? _0x3f295f[_0x1249e7(0x1e4)](_0x4911c0, _0x19186f)\n                                    : _0x3f295f['set'](_0x4911c0, !(0x4a * 0x71 + -0xad * 0x2 + 0x6 * -0x538))\n                            }\n                            _0x343a1e(_0x333e3a, _0x446366, _0x63ddf3, _0x4911c0, _0x19186f, _0x27b8e1, _0x39f6a1, _0x186385)\n                        }\n                    }\n                    return _0x45d367(_0x333e3a, _0x47fbbd), _0x45d367(_0x333e3a, _0x402774), _0x333e3a\n                }\n\n                function _0x45d367(_0x59ffc8, _0x5ae59b) {\n                    var _0x5b965e = w_0x25f3\n                    _0x5ae59b &&\n                        _0x59ffc8[_0x5b965e(0x36e)](function (_0x3ed28e) {\n                            var _0x5985fb = _0x5b965e\n                            for (var _0x5bcc94 = 0x156a + 0x18e0 + -0x2e4a; _0x5bcc94 < _0x5ae59b['length']; _0x5bcc94++)\n                                _0x5ae59b[_0x5bcc94][_0x5985fb(0x334)](_0x3ed28e)\n                            return _0x3ed28e\n                        })\n                }\n\n                return function (_0x33b4ae, _0x339d11, _0x5ebc36) {\n                    return {\n                        e: _0x4c3a0d(_0x33b4ae, _0x339d11),\n                        get c() {\n                            return (function (_0x92474e, _0x343c16) {\n                                var _0x3cc4d2 = w_0x25f3\n                                if (_0x343c16['length'] > -0x271 + -0x2690 + 0x2901) {\n                                    for (\n                                        var _0x18f66c = [],\n                                        _0x1dd6eb = _0x92474e,\n                                        _0x1d8833 = _0x92474e[_0x3cc4d2(0x341)],\n                                        _0x163025 = _0x343c16[_0x3cc4d2(0x259)] - (0x1 * -0x20ed + 0x1f94 + 0x2 * 0xad);\n                                        _0x163025 >= 0xfba + 0x22 * 0xb6 + 0x27e6 * -0x1;\n                                        _0x163025--\n                                    ) {\n                                        var _0x49ea6f = {\n                                            v: !(-0x524 + 0x1a34 + -0x150f)\n                                        }\n                                        try {\n                                            var _0x181a9d = _0x343c16[_0x163025](_0x1dd6eb, {\n                                                kind: _0x3cc4d2(0x19c),\n                                                name: _0x1d8833,\n                                                addInitializer: _0x135cea(_0x18f66c, _0x49ea6f)\n                                            })\n                                        } finally {\n                                            _0x49ea6f['v'] = !(-0x23e + 0x1 * -0x7fb + 0xa39)\n                                        }\n                                        void (-0x1 * -0x253d + -0x23d + -0x80 * 0x46) !== _0x181a9d &&\n                                            (_0x2de5e4(0x4c5 + 0xcaf + -0x2e7 * 0x6, _0x181a9d), (_0x1dd6eb = _0x181a9d))\n                                    }\n                                    return [\n                                        _0x1dd6eb,\n                                        function () {\n                                            var _0x543396 = _0x3cc4d2\n                                            for (var _0x2a7175 = -0xe71 * -0x1 + 0x24c0 + -0xa3d * 0x5; _0x2a7175 < _0x18f66c['length']; _0x2a7175++)\n                                                _0x18f66c[_0x2a7175][_0x543396(0x334)](_0x1dd6eb)\n                                        }\n                                    ]\n                                }\n                            })(_0x33b4ae, _0x5ebc36)\n                        }\n                    }\n                }\n            }\n\n            function _0x49af1f(_0x3a86ea, _0x270f72, _0x219a67) {\n                return (_0x49af1f = _0x4591cd())(_0x3a86ea, _0x270f72, _0x219a67)\n            }\n\n            function _0x3e4ff5(_0x5b206b, _0xdfb3e7) {\n                return function (_0x19bdbd) {\n                    var _0x1caf0f = w_0x25f3\n                    _0x15eb90(_0xdfb3e7, _0x1caf0f(0x225)), _0x45d8b1(_0x19bdbd, _0x1caf0f(0x3ba)), _0x5b206b[_0x1caf0f(0x36e)](_0x19bdbd)\n                }\n            }\n\n            function _0x19207d(_0x45ced6, _0xcee03f) {\n                var _0x41489e = w_0x25f3\n                if (!_0x45ced6(_0xcee03f)) throw new TypeError(_0x41489e(0x255))\n            }\n\n            function _0x151762(_0x535a19, _0x4e0a69, _0x270f96, _0x52f7e9, _0x23d388, _0x49094d, _0x49f620, _0x251987, _0x40c067) {\n                var _0x3b49d7 = w_0x25f3,\n                    _0x5d54d8\n                switch (_0x23d388) {\n                    case -0x14b9 + 0x1dd5 + -0x91b:\n                        _0x5d54d8 = _0x3b49d7(0x1b9)\n                        break\n                    case -0xe4a + 0x12be + -0x472:\n                        _0x5d54d8 = _0x3b49d7(0x25a)\n                        break\n                    case -0x10f1 * -0x2 + 0x179 * 0x19 + -0x46b0:\n                        _0x5d54d8 = _0x3b49d7(0x181)\n                        break\n                    case 0x3 * -0x5cf + 0x778 * 0x1 + 0x353 * 0x3:\n                        _0x5d54d8 = _0x3b49d7(0x35d)\n                        break\n                    default:\n                        _0x5d54d8 = _0x3b49d7(0x23c)\n                }\n                var _0x246ff5,\n                    _0x4e02d1,\n                    _0x45ccfd = {\n                        kind: _0x5d54d8,\n                        name: _0x49f620 ? '#' + _0x4e0a69 : _0x4e0a69,\n                        static: _0x49094d,\n                        private: _0x49f620\n                    },\n                    _0x4733a4 = {\n                        v: !(-0xad5 + 0x1f * -0x59 + -0x1f7 * -0xb)\n                    }\n                if (\n                    (0xcf6 + 0x1e15 + -0x3 * 0xe59 !== _0x23d388 && (_0x45ccfd[_0x3b49d7(0x225)] = _0x3e4ff5(_0x52f7e9, _0x4733a4)),\n                        _0x49f620 || (-0x112e + -0x23ab + 0x34d9 !== _0x23d388 && 0xa00 + -0x234a + 0x194c !== _0x23d388))\n                ) {\n                    if (-0x327 * -0x2 + -0xb00 + 0x4b4 === _0x23d388)\n                        _0x246ff5 = function (_0x36bc44) {\n                            var _0x2d48fd = _0x3b49d7\n                            return _0x19207d(_0x40c067, _0x36bc44), _0x270f96[_0x2d48fd(0x2e4)]\n                        }\n                    else {\n                        var _0x339c00 = -0x1746 + -0x1bb + 0xad * 0x25 === _0x23d388 || -0x859 + 0x4 * -0xe2 + -0x27 * -0x4e === _0x23d388\n                            ; (_0x339c00 || 0x5 * -0x3bf + -0x1d90 + 0x304e === _0x23d388) &&\n                                (_0x246ff5 = _0x49f620\n                                    ? function (_0x26da64) {\n                                        var _0x21bb3a = _0x3b49d7\n                                        return _0x19207d(_0x40c067, _0x26da64), _0x270f96['get'][_0x21bb3a(0x334)](_0x26da64)\n                                    }\n                                    : function (_0x2ac873) {\n                                        var _0xa2fd4f = _0x3b49d7\n                                        return _0x270f96[_0xa2fd4f(0x32b)][_0xa2fd4f(0x334)](_0x2ac873)\n                                    }),\n                                (_0x339c00 || -0x14c4 * 0x1 + -0x231e + -0xb2e * -0x5 === _0x23d388) &&\n                                (_0x4e02d1 = _0x49f620\n                                    ? function (_0x1e61ca, _0x1c77b0) {\n                                        var _0x5f2230 = _0x3b49d7\n                                        _0x19207d(_0x40c067, _0x1e61ca), _0x270f96[_0x5f2230(0x1e4)][_0x5f2230(0x334)](_0x1e61ca, _0x1c77b0)\n                                    }\n                                    : function (_0x4d5a08, _0x3ac6c6) {\n                                        var _0x1baec7 = _0x3b49d7\n                                        _0x270f96[_0x1baec7(0x1e4)][_0x1baec7(0x334)](_0x4d5a08, _0x3ac6c6)\n                                    })\n                    }\n                } else\n                    (_0x246ff5 = function (_0x4ff2b5) {\n                        return _0x4ff2b5[_0x4e0a69]\n                    }),\n                        -0x20ec + 0x12ee * 0x2 + -0x4f0 === _0x23d388 &&\n                        (_0x4e02d1 = function (_0x2f8383, _0x4a22e5) {\n                            _0x2f8383[_0x4e0a69] = _0x4a22e5\n                        })\n                var _0x557c63 = _0x49f620\n                    ? _0x40c067[_0x3b49d7(0x301)]()\n                    : function (_0x2f4445) {\n                        return _0x4e0a69 in _0x2f4445\n                    }\n                _0x45ccfd[_0x3b49d7(0x1d0)] =\n                    _0x246ff5 && _0x4e02d1\n                        ? {\n                            get: _0x246ff5,\n                            set: _0x4e02d1,\n                            has: _0x557c63\n                        }\n                        : _0x246ff5\n                            ? {\n                                get: _0x246ff5,\n                                has: _0x557c63\n                            }\n                            : {\n                                set: _0x4e02d1,\n                                has: _0x557c63\n                            }\n                try {\n                    return _0x535a19(_0x251987, _0x45ccfd)\n                } finally {\n                    _0x4733a4['v'] = !(0xea8 + -0xe9f * 0x1 + 0x1 * -0x9)\n                }\n            }\n\n            function _0x15eb90(_0x202051, _0x1c2373) {\n                var _0x51521b = w_0x25f3\n                if (_0x202051['v']) throw new Error('attempted\\x20to\\x20call\\x20' + _0x1c2373 + _0x51521b(0x168))\n            }\n\n            function _0x45d8b1(_0x2ad532, _0x423791) {\n                var _0x14562d = w_0x25f3\n                if (_0x14562d(0x1ee) != typeof _0x2ad532) throw new TypeError(_0x423791 + _0x14562d(0x2f8))\n            }\n\n            function _0xed525b(_0x522a86, _0x4177e1) {\n                var _0x442324 = w_0x25f3,\n                    _0x399204 = typeof _0x4177e1\n                if (-0x361 + 0x3 * 0x2c4 + 0x4ea * -0x1 === _0x522a86) {\n                    if (_0x442324(0x17d) !== _0x399204 || null === _0x4177e1) throw new TypeError(_0x442324(0x1fd))\n                    void (-0x4a0 + 0x2e8 + 0x1b8) !== _0x4177e1[_0x442324(0x32b)] && _0x45d8b1(_0x4177e1[_0x442324(0x32b)], _0x442324(0x170)),\n                        void (0xc4 * -0x1d + 0x651 + 0xfe3) !== _0x4177e1['set'] && _0x45d8b1(_0x4177e1[_0x442324(0x1e4)], _0x442324(0x231)),\n                        void (-0x168c + 0x16b5 * 0x1 + 0x29 * -0x1) !== _0x4177e1['init'] && _0x45d8b1(_0x4177e1[_0x442324(0x3b9)], _0x442324(0x22f))\n                } else {\n                    if (_0x442324(0x1ee) !== _0x399204)\n                        throw new TypeError(\n                            (0x20d7 + 0x7 * -0x362 + 0x7 * -0x14f === _0x522a86\n                                ? _0x442324(0x23c)\n                                : 0x1 * -0x1257 + -0x2d9 + -0x26 * -0x8f === _0x522a86\n                                    ? 'class'\n                                    : 'method') + '\\x20decorators\\x20must\\x20return\\x20a\\x20function\\x20or\\x20void\\x200'\n                        )\n                }\n            }\n\n            function _0x244c39(_0x17683) {\n                return function () {\n                    return _0x17683(this)\n                }\n            }\n\n            function _0x48532c(_0x5503e0) {\n                return function (_0x23d6a1) {\n                    _0x5503e0(this, _0x23d6a1)\n                }\n            }\n\n            function _0x23e6b(_0x5cf198, _0x5646db, _0x26f9f9, _0x37f54b, _0x47565f, _0x2aa948, _0xccabc1, _0x5c3a48, _0x9ffbdc) {\n                var _0x3e2adf = w_0x25f3,\n                    _0x592aeb,\n                    _0x365a6e,\n                    _0x4e8d10,\n                    _0x589008,\n                    _0x17d95a,\n                    _0x11c9ab,\n                    _0x9a7bbd = _0x26f9f9[0xa46 + 0xb3c + -0x1582]\n                if (\n                    (_0xccabc1\n                        ? (_0x592aeb =\n                            0x24 * 0x47 + 0xf85 + -0x1981 === _0x47565f || 0x14ca + -0x1099 + 0x218 * -0x2 === _0x47565f\n                                ? {\n                                    get: _0x244c39(_0x26f9f9[0x7 * -0x2f0 + 0x227b + -0xde8]),\n                                    set: _0x48532c(_0x26f9f9[-0xad * -0x19 + -0xc3c + 0x29 * -0x1d])\n                                }\n                                : 0x1b99 * -0x1 + 0x367 + -0x1 * -0x1835 === _0x47565f\n                                    ? {\n                                        get: _0x26f9f9[0xb1 * 0x22 + 0x3 * 0xcef + -0x24 * 0x1bb]\n                                    }\n                                    : 0x1 * -0x10f + -0x1 * -0x2023 + -0x1f10 === _0x47565f\n                                        ? {\n                                            set: _0x26f9f9[0x36 * -0xa6 + -0x1cb2 + 0x3fb9]\n                                        }\n                                        : {\n                                            value: _0x26f9f9[-0x7ba * 0x1 + 0x1850 + -0x1093]\n                                        })\n                        : -0x2 * 0x713 + 0x26fe + 0x27c * -0xa !== _0x47565f && (_0x592aeb = Object[_0x3e2adf(0x2a6)](_0x5646db, _0x37f54b)),\n                        -0x1982 + 0x1947 + 0x14 * 0x3 === _0x47565f\n                            ? (_0x4e8d10 = {\n                                get: _0x592aeb[_0x3e2adf(0x32b)],\n                                set: _0x592aeb[_0x3e2adf(0x1e4)]\n                            })\n                            : 0xe9b + -0x2a3 + 0x5fb * -0x2 === _0x47565f\n                                ? (_0x4e8d10 = _0x592aeb['value'])\n                                : -0x13 * -0x5b + 0x17cb + -0x1 * 0x1e89 === _0x47565f\n                                    ? (_0x4e8d10 = _0x592aeb[_0x3e2adf(0x32b)])\n                                    : 0x7d7 * -0x1 + 0x5 * 0x81 + 0x556 === _0x47565f && (_0x4e8d10 = _0x592aeb['set']),\n                        'function' == typeof _0x9a7bbd)\n                )\n                    void (0x1 * 0x1ee3 + 0xd + -0x1ef0) !==\n                        (_0x589008 = _0x151762(_0x9a7bbd, _0x37f54b, _0x592aeb, _0x5c3a48, _0x47565f, _0x2aa948, _0xccabc1, _0x4e8d10, _0x9ffbdc)) &&\n                        (_0xed525b(_0x47565f, _0x589008),\n                            0xc91 * -0x1 + -0x893 * -0x1 + 0x3fe === _0x47565f\n                                ? (_0x365a6e = _0x589008)\n                                : -0x1 * 0x21dd + -0x109 * -0x24 + -0x366 === _0x47565f\n                                    ? ((_0x365a6e = _0x589008[_0x3e2adf(0x3b9)]),\n                                        (_0x17d95a = _0x589008[_0x3e2adf(0x32b)] || _0x4e8d10[_0x3e2adf(0x32b)]),\n                                        (_0x11c9ab = _0x589008['set'] || _0x4e8d10[_0x3e2adf(0x1e4)]),\n                                        (_0x4e8d10 = {\n                                            get: _0x17d95a,\n                                            set: _0x11c9ab\n                                        }))\n                                    : (_0x4e8d10 = _0x589008))\n                else\n                    for (var _0x4f1458 = _0x9a7bbd['length'] - (0x204c + 0x277 * 0x7 + -0xe * 0x38a); _0x4f1458 >= -0x23c2 + 0x91 + 0x2331; _0x4f1458--) {\n                        var _0x189ac8\n                        void (-0x18f8 * -0x1 + -0x143a + -0x1 * 0x4be) !==\n                            (_0x589008 = _0x151762(\n                                _0x9a7bbd[_0x4f1458],\n                                _0x37f54b,\n                                _0x592aeb,\n                                _0x5c3a48,\n                                _0x47565f,\n                                _0x2aa948,\n                                _0xccabc1,\n                                _0x4e8d10,\n                                _0x9ffbdc\n                            )) &&\n                            (_0xed525b(_0x47565f, _0x589008),\n                                -0x22cb + -0x2043 * -0x1 + 0x288 === _0x47565f\n                                    ? (_0x189ac8 = _0x589008)\n                                    : 0x1bd * -0x3 + 0x283 * 0x8 + 0x2 * -0x770 === _0x47565f\n                                        ? ((_0x189ac8 = _0x589008[_0x3e2adf(0x3b9)]),\n                                            (_0x17d95a = _0x589008[_0x3e2adf(0x32b)] || _0x4e8d10[_0x3e2adf(0x32b)]),\n                                            (_0x11c9ab = _0x589008[_0x3e2adf(0x1e4)] || _0x4e8d10['set']),\n                                            (_0x4e8d10 = {\n                                                get: _0x17d95a,\n                                                set: _0x11c9ab\n                                            }))\n                                        : (_0x4e8d10 = _0x589008),\n                                void (-0xaeb + 0x1 * 0x1bb3 + 0x4 * -0x432) !== _0x189ac8 &&\n                                (void (-0x2359 + -0x3 * -0x323 + 0x19f0) === _0x365a6e\n                                    ? (_0x365a6e = _0x189ac8)\n                                    : _0x3e2adf(0x1ee) == typeof _0x365a6e\n                                        ? (_0x365a6e = [_0x365a6e, _0x189ac8])\n                                        : _0x365a6e[_0x3e2adf(0x36e)](_0x189ac8)))\n                    }\n                if (0x21ee + -0x129b + 0xf53 * -0x1 === _0x47565f || -0x44d * -0x7 + -0xa27 + -0x13f3 * 0x1 === _0x47565f) {\n                    if (void (0x10 * -0x218 + -0x707 * 0x1 + 0x2887) === _0x365a6e)\n                        _0x365a6e = function (_0x56b70b, _0x5e4d55) {\n                            return _0x5e4d55\n                        }\n                    else {\n                        if (_0x3e2adf(0x1ee) != typeof _0x365a6e) {\n                            var _0x3101a1 = _0x365a6e\n                            _0x365a6e = function (_0x449bbf, _0x5196d8) {\n                                var _0x360050 = _0x3e2adf\n                                for (\n                                    var _0x143a4f = _0x5196d8, _0x36e4b1 = -0x1ef8 + -0x3 * -0xd01 + -0x80b * 0x1;\n                                    _0x36e4b1 < _0x3101a1[_0x360050(0x259)];\n                                    _0x36e4b1++\n                                )\n                                    _0x143a4f = _0x3101a1[_0x36e4b1][_0x360050(0x334)](_0x449bbf, _0x143a4f)\n                                return _0x143a4f\n                            }\n                        } else {\n                            var _0x1e2902 = _0x365a6e\n                            _0x365a6e = function (_0xe6998d, _0xec7c91) {\n                                var _0x5bb1b6 = _0x3e2adf\n                                return _0x1e2902[_0x5bb1b6(0x334)](_0xe6998d, _0xec7c91)\n                            }\n                        }\n                    }\n                    _0x5cf198['push'](_0x365a6e)\n                }\n                0x82e + 0x14c5 + -0x1cf3 !== _0x47565f &&\n                    (-0x1 * -0x1d72 + 0x15b0 + 0x3 * -0x110b === _0x47565f\n                        ? ((_0x592aeb[_0x3e2adf(0x32b)] = _0x4e8d10[_0x3e2adf(0x32b)]), (_0x592aeb['set'] = _0x4e8d10['set']))\n                        : 0x1de7 + -0x16 * -0x10a + -0x34c1 === _0x47565f\n                            ? (_0x592aeb[_0x3e2adf(0x2e4)] = _0x4e8d10)\n                            : -0x2508 + -0x2665 + 0x4b70 === _0x47565f\n                                ? (_0x592aeb[_0x3e2adf(0x32b)] = _0x4e8d10)\n                                : 0x11 * -0x9f + -0x6a5 + 0x1138 === _0x47565f && (_0x592aeb[_0x3e2adf(0x1e4)] = _0x4e8d10),\n                        _0xccabc1\n                            ? 0x8f6 * 0x1 + -0xae9 + 0xa * 0x32 === _0x47565f\n                                ? (_0x5cf198['push'](function (_0x31015b, _0x979f27) {\n                                    var _0x1938a1 = _0x3e2adf\n                                    return _0x4e8d10['get'][_0x1938a1(0x334)](_0x31015b, _0x979f27)\n                                }),\n                                    _0x5cf198[_0x3e2adf(0x36e)](function (_0x506584, _0x44c428) {\n                                        var _0x29e7e5 = _0x3e2adf\n                                        return _0x4e8d10['set'][_0x29e7e5(0x334)](_0x506584, _0x44c428)\n                                    }))\n                                : 0x27 * -0xd0 + 0x4 * -0x12d + 0x2466 === _0x47565f\n                                    ? _0x5cf198[_0x3e2adf(0x36e)](_0x4e8d10)\n                                    : _0x5cf198[_0x3e2adf(0x36e)](function (_0x3345b4, _0x845662) {\n                                        var _0x1b7734 = _0x3e2adf\n                                        return _0x4e8d10[_0x1b7734(0x334)](_0x3345b4, _0x845662)\n                                    })\n                            : Object['defineProperty'](_0x5646db, _0x37f54b, _0x592aeb))\n            }\n\n            function _0x754898(_0x2bd2c5, _0x2c3dcd, _0x119780) {\n                var _0x42b3ee = w_0x25f3\n                for (\n                    var _0x328f7d,\n                    _0x12addf,\n                    _0x29a079,\n                    _0x3330d8 = [],\n                    _0x484293 = new Map(),\n                    _0x4a2ea8 = new Map(),\n                    _0x478e5d = 0x1 * -0x3e1 + -0x22b8 + 0x2699;\n                    _0x478e5d < _0x2c3dcd[_0x42b3ee(0x259)];\n                    _0x478e5d++\n                ) {\n                    var _0x5c7927 = _0x2c3dcd[_0x478e5d]\n                    if (Array[_0x42b3ee(0x2af)](_0x5c7927)) {\n                        var _0x25ea34,\n                            _0x5b9b12,\n                            _0x35b641 = _0x5c7927[-0x33b * 0x1 + 0xebe + 0x3 * -0x3d6],\n                            _0x49a803 = _0x5c7927[-0x78a + -0x29 * 0x60 + 0xc * 0x1e9],\n                            _0x410da0 = _0x5c7927[_0x42b3ee(0x259)] > 0x1291 + -0x1e03 + 0xb75,\n                            _0x3c9168 = _0x35b641 >= -0x13e1 * 0x1 + 0x793 + -0x5 * -0x277,\n                            _0x41ada5 = _0x119780\n                        if (\n                            (_0x3c9168\n                                ? ((_0x25ea34 = _0x2bd2c5),\n                                    -0x7e3 + -0x1087 * 0x2 + 0x28f1 != (_0x35b641 -= 0x867 + 0xa1b + 0x127d * -0x1) &&\n                                    (_0x5b9b12 = _0x12addf = _0x12addf || []),\n                                    _0x410da0 &&\n                                    !_0x29a079 &&\n                                    (_0x29a079 = function (_0x106ee5) {\n                                        return _0x37e1e2(_0x106ee5) === _0x2bd2c5\n                                    }),\n                                    (_0x41ada5 = _0x29a079))\n                                : ((_0x25ea34 = _0x2bd2c5['prototype']),\n                                    0x13a3 * 0x1 + -0x2589 + 0x11e6 * 0x1 !== _0x35b641 && (_0x5b9b12 = _0x328f7d = _0x328f7d || [])),\n                                0xfad + 0x3 * -0xceb + 0x1714 !== _0x35b641 && !_0x410da0)\n                        ) {\n                            var _0x4430b1 = _0x3c9168 ? _0x4a2ea8 : _0x484293,\n                                _0x3a9a47 = _0x4430b1[_0x42b3ee(0x32b)](_0x49a803) || 0x139e + -0xa * 0x13d + -0x73c\n                            if (\n                                !(-0x1 * 0x5df + 0x94b + -0x36c) === _0x3a9a47 ||\n                                (0x3 * 0x38 + -0x25b * 0x7 + -0x8 * -0x1fb === _0x3a9a47 && 0x54 + 0x152e + -0x2a * 0x83 !== _0x35b641) ||\n                                (0x2 * -0x1cb + 0x1e71 + -0x1ad7 * 0x1 === _0x3a9a47 && 0x6e9 + 0xa71 + 0xc1 * -0x17 !== _0x35b641)\n                            )\n                                throw new Error(\n                                    'Attempted\\x20to\\x20decorate\\x20a\\x20public\\x20method/accessor\\x20that\\x20has\\x20the\\x20same\\x20name\\x20as\\x20a\\x20previously\\x20decorated\\x20public\\x20method/accessor.\\x20This\\x20is\\x20not\\x20currently\\x20supported\\x20by\\x20the\\x20decorators\\x20plugin.\\x20Property\\x20name\\x20was:\\x20' +\n                                    _0x49a803\n                                )\n                            !_0x3a9a47 && _0x35b641 > -0x73 * -0x45 + 0x798 + -0x2695\n                                ? _0x4430b1['set'](_0x49a803, _0x35b641)\n                                : _0x4430b1['set'](_0x49a803, !(0x1 * 0xb7c + -0x15ce * 0x1 + 0xa52))\n                        }\n                        _0x23e6b(_0x3330d8, _0x25ea34, _0x5c7927, _0x49a803, _0x35b641, _0x3c9168, _0x410da0, _0x5b9b12, _0x41ada5)\n                    }\n                }\n                return _0xdfc9aa(_0x3330d8, _0x328f7d), _0xdfc9aa(_0x3330d8, _0x12addf), _0x3330d8\n            }\n\n            function _0xdfc9aa(_0x18680e, _0x994303) {\n                var _0x3df611 = w_0x25f3\n                _0x994303 &&\n                    _0x18680e[_0x3df611(0x36e)](function (_0x3720d6) {\n                        var _0xc905ee = _0x3df611\n                        for (var _0x400047 = 0x17dc + -0x3df * 0x6 + -0xa2; _0x400047 < _0x994303['length']; _0x400047++)\n                            _0x994303[_0x400047][_0xc905ee(0x334)](_0x3720d6)\n                        return _0x3720d6\n                    })\n            }\n\n            function _0x2258b9(_0x31d7ec, _0x22dcdb) {\n                var _0x41474b = w_0x25f3\n                if (_0x22dcdb[_0x41474b(0x259)] > 0x26a0 + -0x145f + -0x1241) {\n                    for (\n                        var _0x3c54e9 = [],\n                        _0x8cb428 = _0x31d7ec,\n                        _0x2344cd = _0x31d7ec['name'],\n                        _0x16f8af = _0x22dcdb[_0x41474b(0x259)] - (0x1321 + 0x1388 + 0x1354 * -0x2);\n                        _0x16f8af >= 0x1a79 + 0x6f * 0x2a + -0x2caf;\n                        _0x16f8af--\n                    ) {\n                        var _0x36735e = {\n                            v: !(0x4 * -0x601 + 0x116d * 0x1 + -0x698 * -0x1)\n                        }\n                        try {\n                            var _0x147e7c = _0x22dcdb[_0x16f8af](_0x8cb428, {\n                                kind: _0x41474b(0x19c),\n                                name: _0x2344cd,\n                                addInitializer: _0x3e4ff5(_0x3c54e9, _0x36735e)\n                            })\n                        } finally {\n                            _0x36735e['v'] = !(0x1e88 + -0x1973 + -0x515 * 0x1)\n                        }\n                        void (-0xedb + -0x5 * 0x2bf + 0x1c96) !== _0x147e7c &&\n                            (_0xed525b(0x10b8 + -0xb * 0x2e1 + -0x3 * -0x4ff, _0x147e7c), (_0x8cb428 = _0x147e7c))\n                    }\n                    return [\n                        _0x8cb428,\n                        function () {\n                            var _0x28afa7 = _0x41474b\n                            for (var _0x4967c5 = -0x1 * 0x23b5 + -0x2 * -0x4c7 + 0x203 * 0xd; _0x4967c5 < _0x3c54e9[_0x28afa7(0x259)]; _0x4967c5++)\n                                _0x3c54e9[_0x4967c5][_0x28afa7(0x334)](_0x8cb428)\n                        }\n                    ]\n                }\n            }\n\n            function _0x499d65(_0x2be690, _0x428d43, _0x381e26, _0x409a13) {\n                return {\n                    e: _0x754898(_0x2be690, _0x428d43, _0x409a13),\n                    get c() {\n                        return _0x2258b9(_0x2be690, _0x381e26)\n                    }\n                }\n            }\n\n            function _0x63f01f(_0x5fd149) {\n                var _0x2e1243 = w_0x25f3,\n                    _0x111c4c = {},\n                    _0x2aa094 = !(-0x3d * -0x53 + -0x2086 * -0x1 + -0x344c)\n\n                function _0x3ad3fe(_0x4a2256, _0x3bcff1) {\n                    return (\n                        (_0x2aa094 = !(0x160 * 0x3 + -0x4b5 * 0x1 + 0x1 * 0x95)),\n                        {\n                            done: !(0x1cd3 + 0x1 * -0xa11 + -0x12c1 * 0x1),\n                            value: new _0x59d886(\n                                (_0x3bcff1 = new Promise(function (_0x353966) {\n                                    _0x353966(_0x5fd149[_0x4a2256](_0x3bcff1))\n                                })),\n                                0x2b * 0x44 + -0x8b3 * 0x2 + 0x1 * 0x5fb\n                            )\n                        }\n                    )\n                }\n\n                return (\n                    (_0x111c4c[(_0x2e1243(0x384) != typeof Symbol && Symbol['iterator']) || _0x2e1243(0x1dd)] = function () {\n                        return this\n                    }),\n                    (_0x111c4c[_0x2e1243(0x389)] = function (_0x45912d) {\n                        return _0x2aa094 ? ((_0x2aa094 = !(0x1569 + 0x7 * 0x314 + -0x2af4)), _0x45912d) : _0x3ad3fe('next', _0x45912d)\n                    }),\n                    _0x2e1243(0x1ee) == typeof _0x5fd149[_0x2e1243(0x250)] &&\n                    (_0x111c4c[_0x2e1243(0x250)] = function (_0xd71e81) {\n                        var _0x37886e = _0x2e1243\n                        if (_0x2aa094) throw ((_0x2aa094 = !(-0x648 + -0x1eca + -0x2513 * -0x1)), _0xd71e81)\n                        return _0x3ad3fe(_0x37886e(0x250), _0xd71e81)\n                    }),\n                    _0x2e1243(0x1ee) == typeof _0x5fd149[_0x2e1243(0x2fd)] &&\n                    (_0x111c4c[_0x2e1243(0x2fd)] = function (_0xd4b711) {\n                        return _0x2aa094 ? ((_0x2aa094 = !(-0x8e1 * -0x4 + -0x2194 + 0x3 * -0xa5)), _0xd4b711) : _0x3ad3fe('return', _0xd4b711)\n                    }),\n                    _0x111c4c\n                )\n            }\n\n            function _0x278b9f(_0x12b945) {\n                var _0x55cd1f = w_0x25f3,\n                    _0x449dfe,\n                    _0x31b182,\n                    _0x218f32,\n                    _0x2ecb8a = -0x1d9 * -0x5 + -0x5d4 + -0x367\n                for ('undefined' != typeof Symbol && ((_0x31b182 = Symbol[_0x55cd1f(0x17c)]), (_0x218f32 = Symbol[_0x55cd1f(0x3b3)])); _0x2ecb8a--;) {\n                    if (_0x31b182 && null != (_0x449dfe = _0x12b945[_0x31b182])) return _0x449dfe[_0x55cd1f(0x334)](_0x12b945)\n                    if (_0x218f32 && null != (_0x449dfe = _0x12b945[_0x218f32])) return new _0x3d6fc9(_0x449dfe[_0x55cd1f(0x334)](_0x12b945))\n                        ; (_0x31b182 = _0x55cd1f(0x230)), (_0x218f32 = _0x55cd1f(0x1dd))\n                }\n                throw new TypeError(_0x55cd1f(0x2a9))\n            }\n\n            function _0x3d6fc9(_0x4d37b6) {\n                var _0x36b1b0 = w_0x25f3\n\n                function _0x6c368b(_0x231d6c) {\n                    var _0x3a3e78 = w_0x25f3\n                    if (Object(_0x231d6c) !== _0x231d6c) return Promise['reject'](new TypeError(_0x231d6c + _0x3a3e78(0x3a6)))\n                    var _0x4cdd04 = _0x231d6c[_0x3a3e78(0x1e3)]\n                    return Promise['resolve'](_0x231d6c[_0x3a3e78(0x2e4)])['then'](function (_0x468cc1) {\n                        return {\n                            value: _0x468cc1,\n                            done: _0x4cdd04\n                        }\n                    })\n                }\n\n                return (\n                    ((_0x3d6fc9 = function (_0x5a83bf) {\n                        var _0x2ffee8 = w_0x25f3\n                            ; (this['s'] = _0x5a83bf), (this['n'] = _0x5a83bf[_0x2ffee8(0x389)])\n                    })[_0x36b1b0(0x344)] = {\n                        s: null,\n                        n: null,\n                        next: function () {\n                            var _0x1eac7c = _0x36b1b0\n                            return _0x6c368b(this['n'][_0x1eac7c(0x207)](this['s'], arguments))\n                        },\n                        return: function (_0x379438) {\n                            var _0x45dc23 = _0x36b1b0,\n                                _0x35ef86 = this['s'][_0x45dc23(0x2fd)]\n                            return void (0x23cd + 0x6f3 * 0x1 + -0x48 * 0x98) === _0x35ef86\n                                ? Promise[_0x45dc23(0x278)]({\n                                    value: _0x379438,\n                                    done: !(-0x220 + -0x16b0 + 0x8 * 0x31a)\n                                })\n                                : _0x6c368b(_0x35ef86[_0x45dc23(0x207)](this['s'], arguments))\n                        },\n                        throw: function (_0x2ca86a) {\n                            var _0x5812c4 = _0x36b1b0,\n                                _0x449ee5 = this['s'][_0x5812c4(0x2fd)]\n                            return void (0xe3b + 0x1 * -0x128e + 0x453) === _0x449ee5\n                                ? Promise[_0x5812c4(0x39b)](_0x2ca86a)\n                                : _0x6c368b(_0x449ee5['apply'](this['s'], arguments))\n                        }\n                    }),\n                    new _0x3d6fc9(_0x4d37b6)\n                )\n            }\n\n            function _0x81c36b(_0x305287) {\n                return new _0x59d886(_0x305287, -0x5e + 0xf84 + -0xf26 * 0x1)\n            }\n\n            function _0x37e1e2(_0x3127ce) {\n                var _0x43b88e = w_0x25f3\n                if (Object(_0x3127ce) !== _0x3127ce)\n                    throw TypeError(\n                        'right-hand\\x20side\\x20of\\x20\\x27in\\x27\\x20should\\x20be\\x20an\\x20object,\\x20got\\x20' +\n                        (null !== _0x3127ce ? typeof _0x3127ce : _0x43b88e(0x308))\n                    )\n                return _0x3127ce\n            }\n\n            function _0x564673(_0x18bd7c, _0x51fb0f, _0x2103c5, _0x5f4619) {\n                var _0x41c64 = w_0x25f3,\n                    _0xab8c16 = {\n                        configurable: !(-0x15c4 + 0x25f7 * -0x1 + 0x3bbb),\n                        enumerable: !(0x2581 + -0x121c + -0x1365)\n                    }\n                return (_0xab8c16[_0x18bd7c] = _0x5f4619), Object[_0x41c64(0x175)](_0x51fb0f, _0x2103c5, _0xab8c16)\n            }\n\n            function _0x19d66a(_0x14c297, _0x128d38) {\n                var _0x48eab4 = w_0x25f3,\n                    _0x25f943 =\n                        null == _0x14c297\n                            ? null\n                            : (_0x48eab4(0x384) != typeof Symbol && _0x14c297[Symbol[_0x48eab4(0x3b3)]]) || _0x14c297[_0x48eab4(0x1dd)]\n                if (null != _0x25f943) {\n                    var _0x285958,\n                        _0x5bcc9e,\n                        _0x2d4c39,\n                        _0x193c70,\n                        _0x146015 = [],\n                        _0x16efb7 = !(-0x7e * 0x36 + 0xcff * 0x1 + 0xd95),\n                        _0x5c9556 = !(-0x1d71 * -0x1 + 0x434 * -0x9 + 0x864)\n                    try {\n                        if (\n                            ((_0x2d4c39 = (_0x25f943 = _0x25f943[_0x48eab4(0x334)](_0x14c297))['next']),\n                                -0xe3 * -0xb + -0x1f3 * 0xe + -0x43 * -0x43 === _0x128d38)\n                        ) {\n                            if (Object(_0x25f943) !== _0x25f943) return\n                            _0x16efb7 = !(0x17cb + 0x18a9 + -0x4f * 0x9d)\n                        } else {\n                            for (\n                                ;\n                                !(_0x16efb7 = (_0x285958 = _0x2d4c39['call'](_0x25f943))[_0x48eab4(0x1e3)]) &&\n                                (_0x146015[_0x48eab4(0x36e)](_0x285958[_0x48eab4(0x2e4)]), _0x146015[_0x48eab4(0x259)] !== _0x128d38);\n                                _0x16efb7 = !(0x1 * -0x22d3 + 0x1f2e + 0x3 * 0x137)\n                            );\n                        }\n                    } catch (_0x22e14d) {\n                        ; (_0x5c9556 = !(-0x3 * -0x69e + -0xd79 + -0x47 * 0x17)), (_0x5bcc9e = _0x22e14d)\n                    } finally {\n                        try {\n                            if (\n                                !_0x16efb7 &&\n                                null != _0x25f943[_0x48eab4(0x2fd)] &&\n                                ((_0x193c70 = _0x25f943['return']()), Object(_0x193c70) !== _0x193c70)\n                            )\n                                return\n                        } finally {\n                            if (_0x5c9556) throw _0x5bcc9e\n                        }\n                    }\n                    return _0x146015\n                }\n            }\n\n            function _0x376fd5(_0x233550, _0x1b337f) {\n                var _0x545ac4 = w_0x25f3,\n                    _0x524438 = _0x233550 && ((_0x545ac4(0x384) != typeof Symbol && _0x233550[Symbol[_0x545ac4(0x3b3)]]) || _0x233550['@@iterator'])\n                if (null != _0x524438) {\n                    var _0x259ce6,\n                        _0x4523ee = []\n                    for (\n                        _0x524438 = _0x524438['call'](_0x233550);\n                        _0x233550[_0x545ac4(0x259)] < _0x1b337f && !(_0x259ce6 = _0x524438['next']())[_0x545ac4(0x1e3)];\n\n                    )\n                        _0x4523ee[_0x545ac4(0x36e)](_0x259ce6['value'])\n                    return _0x4523ee\n                }\n            }\n\n            function _0x2e4b86(_0x760974, _0x438efa, _0x37a20b, _0x52b279) {\n                var _0x2644f8 = w_0x25f3\n                _0x500e9f ||\n                    (_0x500e9f =\n                        (_0x2644f8(0x1ee) == typeof Symbol && Symbol[_0x2644f8(0x31e)] && Symbol[_0x2644f8(0x31e)](_0x2644f8(0x279))) ||\n                        0x1353f + -0x1157 + -0x3921)\n                var _0x513b54 = _0x760974 && _0x760974[_0x2644f8(0x371)],\n                    _0x5469e9 = arguments[_0x2644f8(0x259)] - (-0xcb * -0xb + -0xa * 0x137 + -0x28 * -0x16)\n                if (\n                    (_0x438efa ||\n                        0x109 * -0x1c + 0xdc1 + 0xf3b === _0x5469e9 ||\n                        (_0x438efa = {\n                            children: void (-0x2 * -0x1037 + 0x32f + -0x239d)\n                        }),\n                        -0xf69 + 0xedb + -0x8f * -0x1 === _0x5469e9)\n                )\n                    _0x438efa[_0x2644f8(0x16f)] = _0x52b279\n                else {\n                    if (_0x5469e9 > -0x18e2 + -0x25af + 0x3e92) {\n                        for (var _0x5c6f82 = new Array(_0x5469e9), _0x63cb90 = -0x1 * -0xebd + -0x1a37 + 0x2 * 0x5bd; _0x63cb90 < _0x5469e9; _0x63cb90++)\n                            _0x5c6f82[_0x63cb90] = arguments[_0x63cb90 + (0x15f5 + -0x245f + -0x4cf * -0x3)]\n                        _0x438efa[_0x2644f8(0x16f)] = _0x5c6f82\n                    }\n                }\n                if (_0x438efa && _0x513b54) {\n                    for (var _0xbcee2c in _0x513b54)\n                        void (-0x1091 * -0x1 + -0x3 * 0x34d + -0x6aa) === _0x438efa[_0xbcee2c] && (_0x438efa[_0xbcee2c] = _0x513b54[_0xbcee2c])\n                } else _0x438efa || (_0x438efa = _0x513b54 || {})\n                return {\n                    $$typeof: _0x500e9f,\n                    type: _0x760974,\n                    key: void (-0x7 * 0x1cd + -0x1 * -0xb38 + 0x163) === _0x37a20b ? null : '' + _0x37a20b,\n                    ref: null,\n                    props: _0x438efa,\n                    _owner: null\n                }\n            }\n\n            function _0x3a3eb5(_0x4619be, _0x3fc822) {\n                var _0x44978d = w_0x25f3,\n                    _0x504f59 = Object[_0x44978d(0x17f)](_0x4619be)\n                if (Object[_0x44978d(0x388)]) {\n                    var _0x4ea700 = Object['getOwnPropertySymbols'](_0x4619be)\n                    _0x3fc822 &&\n                        (_0x4ea700 = _0x4ea700[_0x44978d(0x164)](function (_0x2a0c03) {\n                            var _0x162328 = _0x44978d\n                            return Object[_0x162328(0x2a6)](_0x4619be, _0x2a0c03)[_0x162328(0x23a)]\n                        })),\n                        _0x504f59['push'][_0x44978d(0x207)](_0x504f59, _0x4ea700)\n                }\n                return _0x504f59\n            }\n\n            function _0x4ee2dd(_0xf371f0) {\n                var _0x145ce6 = w_0x25f3\n                for (var _0x5e36a1 = -0x5 * 0x1ad + 0x11e6 * -0x1 + 0x1a48; _0x5e36a1 < arguments[_0x145ce6(0x259)]; _0x5e36a1++) {\n                    var _0xdb889d = null != arguments[_0x5e36a1] ? arguments[_0x5e36a1] : {}\n                    _0x5e36a1 % (0x1174 + 0xeb3 + -0x2025)\n                        ? _0x3a3eb5(Object(_0xdb889d), !(-0x263c * 0x1 + 0x1 * -0xf7f + 0x7ad * 0x7))[_0x145ce6(0x254)](function (_0x328928) {\n                            _0x4a7824(_0xf371f0, _0x328928, _0xdb889d[_0x328928])\n                        })\n                        : Object[_0x145ce6(0x1ec)]\n                            ? Object[_0x145ce6(0x36c)](_0xf371f0, Object[_0x145ce6(0x1ec)](_0xdb889d))\n                            : _0x3a3eb5(Object(_0xdb889d))[_0x145ce6(0x254)](function (_0x593f5f) {\n                                var _0x53f055 = _0x145ce6\n                                Object[_0x53f055(0x175)](_0xf371f0, _0x593f5f, Object[_0x53f055(0x2a6)](_0xdb889d, _0x593f5f))\n                            })\n                }\n                return _0xf371f0\n            }\n\n            function _0x385d19() {\n                var _0x44a0fc = w_0x25f3\n                _0x385d19 = function () {\n                    return _0x507b23\n                }\n                var _0x507b23 = {},\n                    _0x39fa01 = Object[_0x44a0fc(0x344)],\n                    _0x43238c = _0x39fa01[_0x44a0fc(0x3b8)],\n                    _0x4cf7d8 =\n                        Object['defineProperty'] ||\n                        function (_0x2541c5, _0x22c938, _0x405bab) {\n                            var _0x32f2ae = _0x44a0fc\n                            _0x2541c5[_0x22c938] = _0x405bab[_0x32f2ae(0x2e4)]\n                        },\n                    _0x1c97cc = _0x44a0fc(0x1ee) == typeof Symbol ? Symbol : {},\n                    _0x5acd1a = _0x1c97cc[_0x44a0fc(0x3b3)] || _0x44a0fc(0x1dd),\n                    _0x52f292 = _0x1c97cc['asyncIterator'] || _0x44a0fc(0x230),\n                    _0x447ab4 = _0x1c97cc[_0x44a0fc(0x1c0)] || _0x44a0fc(0x1e0)\n\n                function _0x3baf2c(_0x30f952, _0x3ef614, _0x2d2b61) {\n                    var _0x598819 = _0x44a0fc\n                    return (\n                        Object[_0x598819(0x175)](_0x30f952, _0x3ef614, {\n                            value: _0x2d2b61,\n                            enumerable: !(0x1b1a * -0x1 + 0x1 * 0x2696 + -0x31 * 0x3c),\n                            configurable: !(-0x1a13 + 0x5 * -0x6d + 0xa * 0x2d2),\n                            writable: !(-0x1cd + 0x214e + 0x1f81 * -0x1)\n                        }),\n                        _0x30f952[_0x3ef614]\n                    )\n                }\n\n                try {\n                    _0x3baf2c({}, '')\n                } catch (_0x275159) {\n                    _0x3baf2c = function (_0x37fa7b, _0x2671f0, _0x45b82e) {\n                        return (_0x37fa7b[_0x2671f0] = _0x45b82e)\n                    }\n                }\n\n                function _0x3e46c6(_0x50c0cc, _0x5f3c83, _0x148917, _0x2e5141) {\n                    var _0x1a25db = _0x44a0fc,\n                        _0x1b0fa0 = _0x5f3c83 && _0x5f3c83['prototype'] instanceof _0x50f36d ? _0x5f3c83 : _0x50f36d,\n                        _0x4f06ab = Object[_0x1a25db(0x3b7)](_0x1b0fa0[_0x1a25db(0x344)]),\n                        _0x3e4999 = new _0x1b5db9(_0x2e5141 || [])\n                    return (\n                        _0x4cf7d8(_0x4f06ab, _0x1a25db(0x1b1), {\n                            value: _0x121728(_0x50c0cc, _0x148917, _0x3e4999)\n                        }),\n                        _0x4f06ab\n                    )\n                }\n\n                function _0x575dfd(_0x48fd20, _0x6545ef, _0x242936) {\n                    var _0x580d50 = _0x44a0fc\n                    try {\n                        return {\n                            type: _0x580d50(0x2f1),\n                            arg: _0x48fd20[_0x580d50(0x334)](_0x6545ef, _0x242936)\n                        }\n                    } catch (_0x5aebac) {\n                        return {\n                            type: 'throw',\n                            arg: _0x5aebac\n                        }\n                    }\n                }\n\n                _0x507b23['wrap'] = _0x3e46c6\n                var _0x511b05 = {}\n\n                function _0x50f36d() { }\n\n                function _0x2e67e9() { }\n\n                function _0x3a5ac7() { }\n\n                var _0x4c3008 = {}\n                _0x3baf2c(_0x4c3008, _0x5acd1a, function () {\n                    return this\n                })\n                var _0x118945 = Object[_0x44a0fc(0x22c)],\n                    _0x5d1d04 = _0x118945 && _0x118945(_0x118945(_0x2edbf4([])))\n                _0x5d1d04 && _0x5d1d04 !== _0x39fa01 && _0x43238c[_0x44a0fc(0x334)](_0x5d1d04, _0x5acd1a) && (_0x4c3008 = _0x5d1d04)\n                var _0x42763b = (_0x3a5ac7[_0x44a0fc(0x344)] = _0x50f36d['prototype'] = Object[_0x44a0fc(0x3b7)](_0x4c3008))\n\n                function _0x4e156b(_0x314ec0) {\n                    var _0x1229ff = _0x44a0fc\n                        ;[_0x1229ff(0x389), _0x1229ff(0x250), _0x1229ff(0x2fd)][_0x1229ff(0x254)](function (_0x1cac9a) {\n                            _0x3baf2c(_0x314ec0, _0x1cac9a, function (_0x509669) {\n                                var _0x3b5587 = w_0x25f3\n                                return this[_0x3b5587(0x1b1)](_0x1cac9a, _0x509669)\n                            })\n                        })\n                }\n\n                function _0x23eb73(_0x5cb4f0, _0xfdda3) {\n                    var _0x2f70bc\n                    _0x4cf7d8(this, '_invoke', {\n                        value: function (_0x47f883, _0x34dd78) {\n                            var _0x5c5cca = w_0x25f3\n\n                            function _0x65e836() {\n                                return new _0xfdda3(function (_0x494e99, _0x39f97a) {\n                                    !(function _0x19e170(_0xd94afd, _0x7f5a3, _0x1fc978, _0x392c17) {\n                                        var _0x5108db = w_0x25f3,\n                                            _0x123c2b = _0x575dfd(_0x5cb4f0[_0xd94afd], _0x5cb4f0, _0x7f5a3)\n                                        if (_0x5108db(0x250) !== _0x123c2b[_0x5108db(0x1ab)]) {\n                                            var _0x57ff30 = _0x123c2b[_0x5108db(0x327)],\n                                                _0x519f3c = _0x57ff30[_0x5108db(0x2e4)]\n                                            return _0x519f3c && 'object' == typeof _0x519f3c && _0x43238c[_0x5108db(0x334)](_0x519f3c, _0x5108db(0x2b1))\n                                                ? _0xfdda3[_0x5108db(0x278)](_0x519f3c[_0x5108db(0x2b1)])[_0x5108db(0x1ed)](\n                                                    function (_0x513ad4) {\n                                                        var _0x372e8b = _0x5108db\n                                                        _0x19e170(_0x372e8b(0x389), _0x513ad4, _0x1fc978, _0x392c17)\n                                                    },\n                                                    function (_0x3ee973) {\n                                                        _0x19e170('throw', _0x3ee973, _0x1fc978, _0x392c17)\n                                                    }\n                                                )\n                                                : _0xfdda3[_0x5108db(0x278)](_0x519f3c)[_0x5108db(0x1ed)](\n                                                    function (_0xb8049c) {\n                                                        var _0x3f5791 = _0x5108db\n                                                            ; (_0x57ff30[_0x3f5791(0x2e4)] = _0xb8049c), _0x1fc978(_0x57ff30)\n                                                    },\n                                                    function (_0x163a1d) {\n                                                        var _0x43e785 = _0x5108db\n                                                        return _0x19e170(_0x43e785(0x250), _0x163a1d, _0x1fc978, _0x392c17)\n                                                    }\n                                                )\n                                        }\n                                        _0x392c17(_0x123c2b[_0x5108db(0x327)])\n                                    })(_0x47f883, _0x34dd78, _0x494e99, _0x39f97a)\n                                })\n                            }\n\n                            return (_0x2f70bc = _0x2f70bc ? _0x2f70bc[_0x5c5cca(0x1ed)](_0x65e836, _0x65e836) : _0x65e836())\n                        }\n                    })\n                }\n\n                function _0x121728(_0x39e85b, _0x26363f, _0x3838fc) {\n                    var _0x4a9454 = 'suspendedStart'\n                    return function (_0x33b907, _0x5c348b) {\n                        var _0x14af93 = w_0x25f3\n                        if (_0x14af93(0x2ef) === _0x4a9454) throw new Error(_0x14af93(0x35a))\n                        if ('completed' === _0x4a9454) {\n                            if ('throw' === _0x33b907) throw _0x5c348b\n                            return _0x159200()\n                        }\n                        for (_0x3838fc[_0x14af93(0x25a)] = _0x33b907, _0x3838fc[_0x14af93(0x327)] = _0x5c348b; ;) {\n                            var _0x43652a = _0x3838fc[_0x14af93(0x1bc)]\n                            if (_0x43652a) {\n                                var _0xc12f6f = _0x5489f3(_0x43652a, _0x3838fc)\n                                if (_0xc12f6f) {\n                                    if (_0xc12f6f === _0x511b05) continue\n                                    return _0xc12f6f\n                                }\n                            }\n                            if (_0x14af93(0x389) === _0x3838fc[_0x14af93(0x25a)])\n                                _0x3838fc[_0x14af93(0x3b2)] = _0x3838fc[_0x14af93(0x2a2)] = _0x3838fc[_0x14af93(0x327)]\n                            else {\n                                if ('throw' === _0x3838fc[_0x14af93(0x25a)]) {\n                                    if ('suspendedStart' === _0x4a9454) throw ((_0x4a9454 = _0x14af93(0x16a)), _0x3838fc['arg'])\n                                    _0x3838fc[_0x14af93(0x2cb)](_0x3838fc[_0x14af93(0x327)])\n                                } else _0x14af93(0x2fd) === _0x3838fc[_0x14af93(0x25a)] && _0x3838fc['abrupt'](_0x14af93(0x2fd), _0x3838fc['arg'])\n                            }\n                            _0x4a9454 = _0x14af93(0x2ef)\n                            var _0x1a99b5 = _0x575dfd(_0x39e85b, _0x26363f, _0x3838fc)\n                            if ('normal' === _0x1a99b5['type']) {\n                                if (\n                                    ((_0x4a9454 = _0x3838fc[_0x14af93(0x1e3)] ? _0x14af93(0x16a) : 'suspendedYield'),\n                                        _0x1a99b5[_0x14af93(0x327)] === _0x511b05)\n                                )\n                                    continue\n                                return {\n                                    value: _0x1a99b5[_0x14af93(0x327)],\n                                    done: _0x3838fc[_0x14af93(0x1e3)]\n                                }\n                            }\n                            _0x14af93(0x250) === _0x1a99b5[_0x14af93(0x1ab)] &&\n                                ((_0x4a9454 = _0x14af93(0x16a)),\n                                    (_0x3838fc[_0x14af93(0x25a)] = _0x14af93(0x250)),\n                                    (_0x3838fc[_0x14af93(0x327)] = _0x1a99b5[_0x14af93(0x327)]))\n                        }\n                    }\n                }\n\n                function _0x5489f3(_0x3c1e2d, _0x59877f) {\n                    var _0x299ed9 = _0x44a0fc,\n                        _0x1a45fc = _0x59877f['method'],\n                        _0x116edb = _0x3c1e2d[_0x299ed9(0x3b3)][_0x1a45fc]\n                    if (void (-0x15fe + 0xe93 + 0x76b) === _0x116edb)\n                        return (\n                            (_0x59877f[_0x299ed9(0x1bc)] = null),\n                            (_0x299ed9(0x250) === _0x1a45fc &&\n                                _0x3c1e2d[_0x299ed9(0x3b3)][_0x299ed9(0x2fd)] &&\n                                ((_0x59877f['method'] = 'return'),\n                                    (_0x59877f[_0x299ed9(0x327)] = void (-0x78 * -0x25 + -0x2272 + 0x111a * 0x1)),\n                                    _0x5489f3(_0x3c1e2d, _0x59877f),\n                                    _0x299ed9(0x250) === _0x59877f[_0x299ed9(0x25a)])) ||\n                            ('return' !== _0x1a45fc &&\n                                ((_0x59877f[_0x299ed9(0x25a)] = _0x299ed9(0x250)),\n                                    (_0x59877f[_0x299ed9(0x327)] = new TypeError(\n                                        'The\\x20iterator\\x20does\\x20not\\x20provide\\x20a\\x20\\x27' + _0x1a45fc + _0x299ed9(0x32f)\n                                    )))),\n                            _0x511b05\n                        )\n                    var _0x5be46a = _0x575dfd(_0x116edb, _0x3c1e2d[_0x299ed9(0x3b3)], _0x59877f[_0x299ed9(0x327)])\n                    if (_0x299ed9(0x250) === _0x5be46a[_0x299ed9(0x1ab)])\n                        return (\n                            (_0x59877f[_0x299ed9(0x25a)] = _0x299ed9(0x250)),\n                            (_0x59877f['arg'] = _0x5be46a[_0x299ed9(0x327)]),\n                            (_0x59877f[_0x299ed9(0x1bc)] = null),\n                            _0x511b05\n                        )\n                    var _0x44f533 = _0x5be46a[_0x299ed9(0x327)]\n                    return _0x44f533\n                        ? _0x44f533['done']\n                            ? ((_0x59877f[_0x3c1e2d[_0x299ed9(0x16e)]] = _0x44f533[_0x299ed9(0x2e4)]),\n                                (_0x59877f['next'] = _0x3c1e2d[_0x299ed9(0x281)]),\n                                _0x299ed9(0x2fd) !== _0x59877f[_0x299ed9(0x25a)] &&\n                                ((_0x59877f[_0x299ed9(0x25a)] = _0x299ed9(0x389)), (_0x59877f['arg'] = void (0x1a2 * -0x17 + -0x1910 + 0x5 * 0xc86))),\n                                (_0x59877f[_0x299ed9(0x1bc)] = null),\n                                _0x511b05)\n                            : _0x44f533\n                        : ((_0x59877f[_0x299ed9(0x25a)] = _0x299ed9(0x250)),\n                            (_0x59877f['arg'] = new TypeError(_0x299ed9(0x251))),\n                            (_0x59877f[_0x299ed9(0x1bc)] = null),\n                            _0x511b05)\n                }\n\n                function _0x14015c(_0x5bad37) {\n                    var _0x42a847 = _0x44a0fc,\n                        _0x401cb9 = {\n                            tryLoc: _0x5bad37[-0x953 * 0x3 + 0xd3c + 0xebd]\n                        }\n                        ; -0x85b + 0x1181 + -0x925 in _0x5bad37 && (_0x401cb9['catchLoc'] = _0x5bad37[0x12b4 + -0x1d08 + 0xa55]),\n                            0x4dc + 0x1b6f + 0xac3 * -0x3 in _0x5bad37 &&\n                            ((_0x401cb9[_0x42a847(0x220)] = _0x5bad37[-0xd0c * -0x2 + 0x914 + -0xe * 0x283]),\n                                (_0x401cb9[_0x42a847(0x2fb)] = _0x5bad37[0x7 * -0x216 + 0x702 + 0x79b])),\n                            this['tryEntries'][_0x42a847(0x36e)](_0x401cb9)\n                }\n\n                function _0x2f82b3(_0x43fd78) {\n                    var _0x38de29 = _0x44a0fc,\n                        _0x2f1d6c = _0x43fd78[_0x38de29(0x387)] || {}\n                        ; (_0x2f1d6c['type'] = _0x38de29(0x2f1)), delete _0x2f1d6c[_0x38de29(0x327)], (_0x43fd78['completion'] = _0x2f1d6c)\n                }\n\n                function _0x1b5db9(_0x53b843) {\n                    var _0x2569b6 = _0x44a0fc\n                        ; (this[_0x2569b6(0x337)] = [\n                            {\n                                tryLoc: _0x2569b6(0x1c3)\n                            }\n                        ]),\n                            _0x53b843[_0x2569b6(0x254)](_0x14015c, this),\n                            this[_0x2569b6(0x2aa)](!(0x1bba + 0x132e + -0x4c * 0x9e))\n                }\n\n                function _0x2edbf4(_0xe32b16) {\n                    var _0x3a0ecf = _0x44a0fc\n                    if (_0xe32b16) {\n                        var _0x3f503a = _0xe32b16[_0x5acd1a]\n                        if (_0x3f503a) return _0x3f503a['call'](_0xe32b16)\n                        if (_0x3a0ecf(0x1ee) == typeof _0xe32b16[_0x3a0ecf(0x389)]) return _0xe32b16\n                        if (!isNaN(_0xe32b16['length'])) {\n                            var _0x1ff1cf = -(-0x254c + 0xc7 * 0x11 + -0x2 * -0xc0b),\n                                _0x4f1000 = function _0x136bfc() {\n                                    var _0x10b933 = _0x3a0ecf\n                                    for (; ++_0x1ff1cf < _0xe32b16[_0x10b933(0x259)];)\n                                        if (_0x43238c[_0x10b933(0x334)](_0xe32b16, _0x1ff1cf))\n                                            return (\n                                                (_0x136bfc[_0x10b933(0x2e4)] = _0xe32b16[_0x1ff1cf]),\n                                                (_0x136bfc[_0x10b933(0x1e3)] = !(-0x1f79 + -0x22d2 + 0x424c)),\n                                                _0x136bfc\n                                            )\n                                    return (\n                                        (_0x136bfc['value'] = void (-0x639 + -0x115f + 0xa * 0x25c)),\n                                        (_0x136bfc[_0x10b933(0x1e3)] = !(0x14ad + -0x1 * 0xa1b + -0xa92)),\n                                        _0x136bfc\n                                    )\n                                }\n                            return (_0x4f1000[_0x3a0ecf(0x389)] = _0x4f1000)\n                        }\n                    }\n                    return {\n                        next: _0x159200\n                    }\n                }\n\n                function _0x159200() {\n                    return {\n                        value: void (-0x540 + -0x12 * -0x60 + -0x8 * 0x30),\n                        done: !(-0x526 + -0x6d4 * 0x2 + -0x2 * -0x967)\n                    }\n                }\n\n                return (\n                    (_0x2e67e9[_0x44a0fc(0x344)] = _0x3a5ac7),\n                    _0x4cf7d8(_0x42763b, _0x44a0fc(0x2ac), {\n                        value: _0x3a5ac7,\n                        configurable: !(-0x2414 + 0x1307 + 0x110d)\n                    }),\n                    _0x4cf7d8(_0x3a5ac7, _0x44a0fc(0x2ac), {\n                        value: _0x2e67e9,\n                        configurable: !(0x117d + -0x12aa + 0x12d)\n                    }),\n                    (_0x2e67e9[_0x44a0fc(0x18c)] = _0x3baf2c(_0x3a5ac7, _0x447ab4, _0x44a0fc(0x311))),\n                    (_0x507b23[_0x44a0fc(0x386)] = function (_0x54fdc6) {\n                        var _0x2c4038 = _0x44a0fc,\n                            _0x29797b = _0x2c4038(0x1ee) == typeof _0x54fdc6 && _0x54fdc6[_0x2c4038(0x2ac)]\n                        return !!_0x29797b && (_0x29797b === _0x2e67e9 || _0x2c4038(0x311) === (_0x29797b['displayName'] || _0x29797b['name']))\n                    }),\n                    (_0x507b23[_0x44a0fc(0x3a5)] = function (_0x41ff3c) {\n                        var _0x286ce7 = _0x44a0fc\n                        return (\n                            Object[_0x286ce7(0x23b)]\n                                ? Object[_0x286ce7(0x23b)](_0x41ff3c, _0x3a5ac7)\n                                : ((_0x41ff3c[_0x286ce7(0x2ea)] = _0x3a5ac7), _0x3baf2c(_0x41ff3c, _0x447ab4, 'GeneratorFunction')),\n                            (_0x41ff3c[_0x286ce7(0x344)] = Object['create'](_0x42763b)),\n                            _0x41ff3c\n                        )\n                    }),\n                    (_0x507b23[_0x44a0fc(0x2d1)] = function (_0x4d3173) {\n                        return {\n                            __await: _0x4d3173\n                        }\n                    }),\n                    _0x4e156b(_0x23eb73[_0x44a0fc(0x344)]),\n                    _0x3baf2c(_0x23eb73[_0x44a0fc(0x344)], _0x52f292, function () {\n                        return this\n                    }),\n                    (_0x507b23[_0x44a0fc(0x273)] = _0x23eb73),\n                    (_0x507b23[_0x44a0fc(0x1e7)] = function (_0x1403cf, _0xb864ce, _0x191461, _0x3aafb7, _0x4bc5ca) {\n                        var _0x225b19 = _0x44a0fc\n                        void (-0x1 * 0x1145 + -0x239 + -0x3e6 * -0x5) === _0x4bc5ca && (_0x4bc5ca = Promise)\n                        var _0x1e23c5 = new _0x23eb73(_0x3e46c6(_0x1403cf, _0xb864ce, _0x191461, _0x3aafb7), _0x4bc5ca)\n                        return _0x507b23[_0x225b19(0x386)](_0xb864ce)\n                            ? _0x1e23c5\n                            : _0x1e23c5[_0x225b19(0x389)]()[_0x225b19(0x1ed)](function (_0x3bf8a0) {\n                                var _0x1af03c = _0x225b19\n                                return _0x3bf8a0[_0x1af03c(0x1e3)] ? _0x3bf8a0[_0x1af03c(0x2e4)] : _0x1e23c5[_0x1af03c(0x389)]()\n                            })\n                    }),\n                    _0x4e156b(_0x42763b),\n                    _0x3baf2c(_0x42763b, _0x447ab4, _0x44a0fc(0x1b5)),\n                    _0x3baf2c(_0x42763b, _0x5acd1a, function () {\n                        return this\n                    }),\n                    _0x3baf2c(_0x42763b, _0x44a0fc(0x3ae), function () {\n                        var _0x26f06c = _0x44a0fc\n                        return _0x26f06c(0x176)\n                    }),\n                    (_0x507b23['keys'] = function (_0x10e233) {\n                        var _0x515044 = _0x44a0fc,\n                            _0x184dfc = Object(_0x10e233),\n                            _0x1ee5ea = []\n                        for (var _0x103175 in _0x184dfc) _0x1ee5ea[_0x515044(0x36e)](_0x103175)\n                        return (\n                            _0x1ee5ea[_0x515044(0x2f3)](),\n                            function _0x5c4b0b() {\n                                var _0x4f9a2b = _0x515044\n                                for (; _0x1ee5ea[_0x4f9a2b(0x259)];) {\n                                    var _0x180e64 = _0x1ee5ea[_0x4f9a2b(0x267)]()\n                                    if (_0x180e64 in _0x184dfc)\n                                        return (\n                                            (_0x5c4b0b[_0x4f9a2b(0x2e4)] = _0x180e64),\n                                            (_0x5c4b0b[_0x4f9a2b(0x1e3)] = !(0x411 * -0x2 + -0x20 * 0x3c + 0x1 * 0xfa3)),\n                                            _0x5c4b0b\n                                        )\n                                }\n                                return (_0x5c4b0b['done'] = !(-0x4d2 * -0x5 + -0x3fd + -0x13 * 0x10f)), _0x5c4b0b\n                            }\n                        )\n                    }),\n                    (_0x507b23[_0x44a0fc(0x38b)] = _0x2edbf4),\n                    (_0x1b5db9['prototype'] = {\n                        constructor: _0x1b5db9,\n                        reset: function (_0x3ebc58) {\n                            var _0x52c025 = _0x44a0fc\n                            if (\n                                ((this[_0x52c025(0x32c)] = -0x16 * 0x181 + 0x1e6a + 0x2ac),\n                                    (this[_0x52c025(0x389)] = 0x1 * 0xa3f + -0x1 * 0x1fb7 + 0x1578),\n                                    (this[_0x52c025(0x3b2)] = this[_0x52c025(0x2a2)] = void (0x18ca + -0x52c * 0x2 + -0xe72)),\n                                    (this[_0x52c025(0x1e3)] = !(-0x775 + -0xfe1 + -0x1757 * -0x1)),\n                                    (this[_0x52c025(0x1bc)] = null),\n                                    (this[_0x52c025(0x25a)] = _0x52c025(0x389)),\n                                    (this[_0x52c025(0x327)] = void (-0x1a0a + -0x263c + -0x2 * -0x2023)),\n                                    this[_0x52c025(0x337)][_0x52c025(0x254)](_0x2f82b3),\n                                    !_0x3ebc58)\n                            ) {\n                                for (var _0x271134 in this)\n                                    't' === _0x271134['charAt'](0x3 * 0x707 + 0x2132 + 0x7 * -0x7c1) &&\n                                        _0x43238c[_0x52c025(0x334)](this, _0x271134) &&\n                                        !isNaN(+_0x271134['slice'](0x2629 * 0x1 + -0x7ec + -0x1e3c)) &&\n                                        (this[_0x271134] = void (0x14a3 + 0x211 + -0x16b4))\n                            }\n                        },\n                        stop: function () {\n                            var _0x5d1331 = _0x44a0fc\n                            this[_0x5d1331(0x1e3)] = !(-0x1157 + -0x1d00 * -0x1 + -0xba9)\n                            var _0x360ca1 = this[_0x5d1331(0x337)][0x181c + 0x2252 + 0x137a * -0x3][_0x5d1331(0x387)]\n                            if (_0x5d1331(0x250) === _0x360ca1[_0x5d1331(0x1ab)]) throw _0x360ca1['arg']\n                            return this[_0x5d1331(0x29a)]\n                        },\n                        dispatchException: function (_0x5ccdbe) {\n                            var _0x2739ee = _0x44a0fc\n                            if (this[_0x2739ee(0x1e3)]) throw _0x5ccdbe\n                            var _0x2375b1 = this\n\n                            function _0x5bc3f7(_0x2f8813, _0x2926a6) {\n                                var _0x19cf66 = _0x2739ee\n                                return (\n                                    (_0x459dde[_0x19cf66(0x1ab)] = _0x19cf66(0x250)),\n                                    (_0x459dde[_0x19cf66(0x327)] = _0x5ccdbe),\n                                    (_0x2375b1[_0x19cf66(0x389)] = _0x2f8813),\n                                    _0x2926a6 &&\n                                    ((_0x2375b1[_0x19cf66(0x25a)] = _0x19cf66(0x389)),\n                                        (_0x2375b1[_0x19cf66(0x327)] = void (-0x77f + -0x1c03 * -0x1 + -0xd * 0x194))),\n                                    !!_0x2926a6\n                                )\n                            }\n\n                            for (\n                                var _0x218123 = this[_0x2739ee(0x337)][_0x2739ee(0x259)] - (-0x8ed + -0x9e5 + 0x12d3);\n                                _0x218123 >= -0x3 * -0x4ef + -0x161b * -0x1 + -0x24e8;\n                                --_0x218123\n                            ) {\n                                var _0x5e4d00 = this[_0x2739ee(0x337)][_0x218123],\n                                    _0x459dde = _0x5e4d00[_0x2739ee(0x387)]\n                                if (_0x2739ee(0x1c3) === _0x5e4d00['tryLoc']) return _0x5bc3f7(_0x2739ee(0x1db))\n                                if (_0x5e4d00[_0x2739ee(0x29e)] <= this[_0x2739ee(0x32c)]) {\n                                    var _0x55fd7f = _0x43238c['call'](_0x5e4d00, 'catchLoc'),\n                                        _0x47cf6c = _0x43238c[_0x2739ee(0x334)](_0x5e4d00, _0x2739ee(0x220))\n                                    if (_0x55fd7f && _0x47cf6c) {\n                                        if (this[_0x2739ee(0x32c)] < _0x5e4d00[_0x2739ee(0x2c4)])\n                                            return _0x5bc3f7(_0x5e4d00['catchLoc'], !(-0x25 * 0xe9 + -0x2368 + 0x4515))\n                                        if (this['prev'] < _0x5e4d00[_0x2739ee(0x220)]) return _0x5bc3f7(_0x5e4d00[_0x2739ee(0x220)])\n                                    } else {\n                                        if (_0x55fd7f) {\n                                            if (this['prev'] < _0x5e4d00[_0x2739ee(0x2c4)])\n                                                return _0x5bc3f7(_0x5e4d00[_0x2739ee(0x2c4)], !(0xf11 + -0x1032 + -0x121 * -0x1))\n                                        } else {\n                                            if (!_0x47cf6c) throw new Error(_0x2739ee(0x33e))\n                                            if (this[_0x2739ee(0x32c)] < _0x5e4d00['finallyLoc']) return _0x5bc3f7(_0x5e4d00['finallyLoc'])\n                                        }\n                                    }\n                                }\n                            }\n                        },\n                        abrupt: function (_0x452b06, _0x46591d) {\n                            var _0x189350 = _0x44a0fc\n                            for (\n                                var _0x24d9ee = this[_0x189350(0x337)][_0x189350(0x259)] - (-0x1 * -0x434 + 0xb2d * -0x1 + 0x6fa);\n                                _0x24d9ee >= 0x144c + -0x1 * 0x80f + -0xc3d;\n                                --_0x24d9ee\n                            ) {\n                                var _0x3e29ca = this[_0x189350(0x337)][_0x24d9ee]\n                                if (\n                                    _0x3e29ca[_0x189350(0x29e)] <= this[_0x189350(0x32c)] &&\n                                    _0x43238c[_0x189350(0x334)](_0x3e29ca, _0x189350(0x220)) &&\n                                    this[_0x189350(0x32c)] < _0x3e29ca[_0x189350(0x220)]\n                                ) {\n                                    var _0x35a2dc = _0x3e29ca\n                                    break\n                                }\n                            }\n                            _0x35a2dc &&\n                                (_0x189350(0x31f) === _0x452b06 || _0x189350(0x2d2) === _0x452b06) &&\n                                _0x35a2dc[_0x189350(0x29e)] <= _0x46591d &&\n                                _0x46591d <= _0x35a2dc[_0x189350(0x220)] &&\n                                (_0x35a2dc = null)\n                            var _0x1837c0 = _0x35a2dc ? _0x35a2dc[_0x189350(0x387)] : {}\n                            return (\n                                (_0x1837c0['type'] = _0x452b06),\n                                (_0x1837c0[_0x189350(0x327)] = _0x46591d),\n                                _0x35a2dc\n                                    ? ((this[_0x189350(0x25a)] = _0x189350(0x389)), (this[_0x189350(0x389)] = _0x35a2dc[_0x189350(0x220)]), _0x511b05)\n                                    : this[_0x189350(0x162)](_0x1837c0)\n                            )\n                        },\n                        complete: function (_0x4daef1, _0x152d13) {\n                            var _0x2e0c88 = _0x44a0fc\n                            if (_0x2e0c88(0x250) === _0x4daef1[_0x2e0c88(0x1ab)]) throw _0x4daef1[_0x2e0c88(0x327)]\n                            return (\n                                _0x2e0c88(0x31f) === _0x4daef1[_0x2e0c88(0x1ab)] || _0x2e0c88(0x2d2) === _0x4daef1[_0x2e0c88(0x1ab)]\n                                    ? (this[_0x2e0c88(0x389)] = _0x4daef1[_0x2e0c88(0x327)])\n                                    : _0x2e0c88(0x2fd) === _0x4daef1['type']\n                                        ? ((this[_0x2e0c88(0x29a)] = this[_0x2e0c88(0x327)] = _0x4daef1[_0x2e0c88(0x327)]),\n                                            (this[_0x2e0c88(0x25a)] = _0x2e0c88(0x2fd)),\n                                            (this[_0x2e0c88(0x389)] = 'end'))\n                                        : _0x2e0c88(0x2f1) === _0x4daef1[_0x2e0c88(0x1ab)] && _0x152d13 && (this[_0x2e0c88(0x389)] = _0x152d13),\n                                _0x511b05\n                            )\n                        },\n                        finish: function (_0x33d396) {\n                            var _0x38fc51 = _0x44a0fc\n                            for (\n                                var _0x5abbd8 = this[_0x38fc51(0x337)][_0x38fc51(0x259)] - (0x1b6c + 0x10f1 + -0x2c5c);\n                                _0x5abbd8 >= -0x106c + -0x26aa + 0x3716;\n                                --_0x5abbd8\n                            ) {\n                                var _0x5eb5c4 = this[_0x38fc51(0x337)][_0x5abbd8]\n                                if (_0x5eb5c4[_0x38fc51(0x220)] === _0x33d396)\n                                    return this['complete'](_0x5eb5c4[_0x38fc51(0x387)], _0x5eb5c4[_0x38fc51(0x2fb)]), _0x2f82b3(_0x5eb5c4), _0x511b05\n                            }\n                        },\n                        catch: function (_0x235ccf) {\n                            var _0x4e3345 = _0x44a0fc\n                            for (\n                                var _0x1db840 = this['tryEntries'][_0x4e3345(0x259)] - (-0x3a * -0x4f + -0x1 * -0x12d6 + -0x24bb * 0x1);\n                                _0x1db840 >= -0x168 + 0x305 + -0x19d;\n                                --_0x1db840\n                            ) {\n                                var _0x545b66 = this['tryEntries'][_0x1db840]\n                                if (_0x545b66[_0x4e3345(0x29e)] === _0x235ccf) {\n                                    var _0x2d5b63 = _0x545b66[_0x4e3345(0x387)]\n                                    if (_0x4e3345(0x250) === _0x2d5b63[_0x4e3345(0x1ab)]) {\n                                        var _0x13e035 = _0x2d5b63[_0x4e3345(0x327)]\n                                        _0x2f82b3(_0x545b66)\n                                    }\n                                    return _0x13e035\n                                }\n                            }\n                            throw new Error(_0x4e3345(0x23f))\n                        },\n                        delegateYield: function (_0x395df9, _0x50d973, _0x48faf1) {\n                            var _0x39919e = _0x44a0fc\n                            return (\n                                (this[_0x39919e(0x1bc)] = {\n                                    iterator: _0x2edbf4(_0x395df9),\n                                    resultName: _0x50d973,\n                                    nextLoc: _0x48faf1\n                                }),\n                                'next' === this['method'] && (this['arg'] = void (0x1958 + -0xaba + -0xe9e)),\n                                _0x511b05\n                            )\n                        }\n                    }),\n                    _0x507b23\n                )\n            }\n\n            function _0x1db123(_0x149c27) {\n                var _0x39d672 = w_0x25f3\n                return (_0x1db123 =\n                    _0x39d672(0x1ee) == typeof Symbol && 'symbol' == typeof Symbol['iterator']\n                        ? function (_0x4a8f2c) {\n                            return typeof _0x4a8f2c\n                        }\n                        : function (_0x40eb64) {\n                            var _0x4f8eee = _0x39d672\n                            return _0x40eb64 &&\n                                _0x4f8eee(0x1ee) == typeof Symbol &&\n                                _0x40eb64[_0x4f8eee(0x2ac)] === Symbol &&\n                                _0x40eb64 !== Symbol['prototype']\n                                ? _0x4f8eee(0x2ed)\n                                : typeof _0x40eb64\n                        })(_0x149c27)\n            }\n\n            function _0x34d29a() {\n                var _0x4bbdba = w_0x25f3\n                _0x34d29a = function (_0x1859fe, _0x26adf2) {\n                    return new _0x3b92d4(_0x1859fe, void (-0x1f * 0x133 + 0x3 * 0x4f5 + 0x23b * 0xa), _0x26adf2)\n                }\n                var _0x5aed6e = RegExp[_0x4bbdba(0x344)],\n                    _0x58ba91 = new WeakMap()\n\n                function _0x3b92d4(_0x2f61fd, _0x513c44, _0xaf22fc) {\n                    var _0xd932c6 = _0x4bbdba,\n                        _0xd60509 = new RegExp(_0x2f61fd, _0x513c44)\n                    return (\n                        _0x58ba91[_0xd932c6(0x1e4)](_0xd60509, _0xaf22fc || _0x58ba91[_0xd932c6(0x32b)](_0x2f61fd)),\n                        _0x2e2f47(_0xd60509, _0x3b92d4[_0xd932c6(0x344)])\n                    )\n                }\n\n                function _0x427d42(_0x489eeb, _0x1699d8) {\n                    var _0x1004fb = _0x4bbdba,\n                        _0x2ae826 = _0x58ba91[_0x1004fb(0x32b)](_0x1699d8)\n                    return Object[_0x1004fb(0x17f)](_0x2ae826)[_0x1004fb(0x376)](function (_0x100f10, _0x5bfdf5) {\n                        var _0x3ad421 = _0x1004fb,\n                            _0x541568 = _0x2ae826[_0x5bfdf5]\n                        if (_0x3ad421(0x28b) == typeof _0x541568) _0x100f10[_0x5bfdf5] = _0x489eeb[_0x541568]\n                        else {\n                            for (\n                                var _0x3bc728 = 0x1 * 0x3ce + 0x3 * -0x435 + 0x8d1;\n                                void (0x2695 + 0x1ee8 + -0x457d) === _0x489eeb[_0x541568[_0x3bc728]] &&\n                                _0x3bc728 + (0x3fb * -0x2 + 0x2631 + -0x2 * 0xf1d) < _0x541568['length'];\n\n                            )\n                                _0x3bc728++\n                            _0x100f10[_0x5bfdf5] = _0x489eeb[_0x541568[_0x3bc728]]\n                        }\n                        return _0x100f10\n                    }, Object[_0x1004fb(0x3b7)](null))\n                }\n\n                return (\n                    _0x5dda7d(_0x3b92d4, RegExp),\n                    (_0x3b92d4['prototype']['exec'] = function (_0x1bc796) {\n                        var _0x2a6afd = _0x4bbdba,\n                            _0x457628 = _0x5aed6e[_0x2a6afd(0x209)]['call'](this, _0x1bc796)\n                        if (_0x457628) {\n                            _0x457628['groups'] = _0x427d42(_0x457628, this)\n                            var _0x546542 = _0x457628['indices']\n                            _0x546542 && (_0x546542['groups'] = _0x427d42(_0x546542, this))\n                        }\n                        return _0x457628\n                    }),\n                    (_0x3b92d4[_0x4bbdba(0x344)][Symbol[_0x4bbdba(0x377)]] = function (_0x10e2ef, _0x453a26) {\n                        var _0x226516 = _0x4bbdba\n                        if (_0x226516(0x33c) == typeof _0x453a26) {\n                            var _0x42705a = _0x58ba91[_0x226516(0x32b)](this)\n                            return _0x5aed6e[Symbol[_0x226516(0x377)]]['call'](\n                                this,\n                                _0x10e2ef,\n                                _0x453a26[_0x226516(0x377)](/\\$<([^>]+)>/g, function (_0x4536fa, _0x53b1c5) {\n                                    var _0x5db08d = _0x226516,\n                                        _0x1b4f5c = _0x42705a[_0x53b1c5]\n                                    return '$' + (Array[_0x5db08d(0x2af)](_0x1b4f5c) ? _0x1b4f5c[_0x5db08d(0x24f)]('$') : _0x1b4f5c)\n                                })\n                            )\n                        }\n                        if (_0x226516(0x1ee) == typeof _0x453a26) {\n                            var _0x51880e = this\n                            return _0x5aed6e[Symbol[_0x226516(0x377)]][_0x226516(0x334)](this, _0x10e2ef, function () {\n                                var _0x3ce548 = _0x226516,\n                                    _0x352e21 = arguments\n                                return (\n                                    _0x3ce548(0x17d) != typeof _0x352e21[_0x352e21[_0x3ce548(0x259)] - (-0xf9 * -0x7 + 0xd4 + -0x2 * 0x3d1)] &&\n                                    (_0x352e21 = []['slice'][_0x3ce548(0x334)](_0x352e21))[_0x3ce548(0x36e)](_0x427d42(_0x352e21, _0x51880e)),\n                                    _0x453a26[_0x3ce548(0x207)](this, _0x352e21)\n                                )\n                            })\n                        }\n                        return _0x5aed6e[Symbol[_0x226516(0x377)]]['call'](this, _0x10e2ef, _0x453a26)\n                    }),\n                    _0x34d29a[_0x4bbdba(0x207)](this, arguments)\n                )\n            }\n\n            function _0x2772ab(_0x17b93c) {\n                var _0x2e8af4 = w_0x25f3\n                this[_0x2e8af4(0x180)] = _0x17b93c\n            }\n\n            function _0x125e01(_0x221f1a) {\n                return function () {\n                    var _0x2db496 = w_0x25f3\n                    return new _0x137ba2(_0x221f1a[_0x2db496(0x207)](this, arguments))\n                }\n            }\n\n            function _0x8a0370(_0x1ac7e2, _0x440b38, _0x4611ac, _0x1f79f3, _0x26eb95, _0x4af1d4, _0x2b24bc) {\n                var _0x3a480e = w_0x25f3\n                try {\n                    var _0x16d0ce = _0x1ac7e2[_0x4af1d4](_0x2b24bc),\n                        _0x2e8eaf = _0x16d0ce[_0x3a480e(0x2e4)]\n                } catch (_0xc88fae) {\n                    return void _0x4611ac(_0xc88fae)\n                }\n                _0x16d0ce[_0x3a480e(0x1e3)] ? _0x440b38(_0x2e8eaf) : Promise[_0x3a480e(0x278)](_0x2e8eaf)[_0x3a480e(0x1ed)](_0x1f79f3, _0x26eb95)\n            }\n\n            function _0x50daaa(_0x10de0d) {\n                return function () {\n                    var _0x310206 = this,\n                        _0x17ad73 = arguments\n                    return new Promise(function (_0x37120b, _0x728e37) {\n                        var _0x5a819e = _0x10de0d['apply'](_0x310206, _0x17ad73)\n\n                        function _0x12466a(_0x263e68) {\n                            var _0x123e7f = w_0x25f3\n                            _0x8a0370(_0x5a819e, _0x37120b, _0x728e37, _0x12466a, _0x191f8b, _0x123e7f(0x389), _0x263e68)\n                        }\n\n                        function _0x191f8b(_0x255ae1) {\n                            var _0x5d15ce = w_0x25f3\n                            _0x8a0370(_0x5a819e, _0x37120b, _0x728e37, _0x12466a, _0x191f8b, _0x5d15ce(0x250), _0x255ae1)\n                        }\n\n                        _0x12466a(void (0xbdf + -0x129c + -0x19 * -0x45))\n                    })\n                }\n            }\n\n            function _0x297d3d(_0xd86983, _0x45590a) {\n                var _0x51c357 = w_0x25f3\n                if (!(_0xd86983 instanceof _0x45590a)) throw new TypeError(_0x51c357(0x2f7))\n            }\n\n            function _0x96f358(_0x217e4a, _0x156410) {\n                var _0x251198 = w_0x25f3\n                for (var _0x336960 = 0x1613 + -0x2f * 0x3b + 0xb3e * -0x1; _0x336960 < _0x156410[_0x251198(0x259)]; _0x336960++) {\n                    var _0x3d27f0 = _0x156410[_0x336960]\n                        ; (_0x3d27f0[_0x251198(0x23a)] = _0x3d27f0[_0x251198(0x23a)] || !(-0xbf7 + -0x166e + 0x2266)),\n                            (_0x3d27f0[_0x251198(0x2bc)] = !(-0xde + 0x1c94 + -0x1bb6)),\n                            _0x251198(0x2e4) in _0x3d27f0 && (_0x3d27f0['writable'] = !(-0x21 * 0x12f + -0x2 * -0x17d + 0x2415)),\n                            Object[_0x251198(0x175)](_0x217e4a, _0x32e885(_0x3d27f0[_0x251198(0x392)]), _0x3d27f0)\n                }\n            }\n\n            function _0x55cd8a(_0x174a54, _0x5e25eb, _0x465e50) {\n                var _0x4d17e4 = w_0x25f3\n                return (\n                    _0x5e25eb && _0x96f358(_0x174a54[_0x4d17e4(0x344)], _0x5e25eb),\n                    _0x465e50 && _0x96f358(_0x174a54, _0x465e50),\n                    Object[_0x4d17e4(0x175)](_0x174a54, _0x4d17e4(0x344), {\n                        writable: !(-0xc19 + 0x1aa + -0x2 * -0x538)\n                    }),\n                    _0x174a54\n                )\n            }\n\n            function _0x58d8c2(_0x5634d7, _0x53515c) {\n                var _0x5fc7bf = w_0x25f3\n                for (var _0x5e7563 in _0x53515c) {\n                    ; ((_0x532356 = _0x53515c[_0x5e7563])[_0x5fc7bf(0x2bc)] = _0x532356[_0x5fc7bf(0x23a)] = !(0xb5 + 0x6 * 0x80 + -0x3b5)),\n                        'value' in _0x532356 && (_0x532356[_0x5fc7bf(0x2e3)] = !(0x19d * 0x11 + 0x126f + -0x2ddc)),\n                        Object[_0x5fc7bf(0x175)](_0x5634d7, _0x5e7563, _0x532356)\n                }\n                if (Object[_0x5fc7bf(0x388)])\n                    for (\n                        var _0x45bcc1 = Object[_0x5fc7bf(0x388)](_0x53515c), _0x368698 = -0x11 * -0x1af + -0x1ec7 + 0x228;\n                        _0x368698 < _0x45bcc1[_0x5fc7bf(0x259)];\n                        _0x368698++\n                    ) {\n                        var _0x532356,\n                            _0x6be33e = _0x45bcc1[_0x368698]\n                            ; ((_0x532356 = _0x53515c[_0x6be33e])['configurable'] = _0x532356[_0x5fc7bf(0x23a)] = !(-0x833 + 0x9 * -0x76 + 0x1d * 0x6d)),\n                                _0x5fc7bf(0x2e4) in _0x532356 && (_0x532356[_0x5fc7bf(0x2e3)] = !(0x18bf + -0x337 * 0x5 + -0x14 * 0x6f)),\n                                Object[_0x5fc7bf(0x175)](_0x5634d7, _0x6be33e, _0x532356)\n                    }\n                return _0x5634d7\n            }\n\n            function _0x40ff51(_0x254aaa, _0x287254) {\n                var _0x77273f = w_0x25f3\n                for (\n                    var _0x587d0b = Object[_0x77273f(0x32a)](_0x287254), _0xa5f40d = -0x2174 + 0x25a * -0x2 + 0x42 * 0x94;\n                    _0xa5f40d < _0x587d0b[_0x77273f(0x259)];\n                    _0xa5f40d++\n                ) {\n                    var _0x23b426 = _0x587d0b[_0xa5f40d],\n                        _0x59ae3e = Object[_0x77273f(0x2a6)](_0x287254, _0x23b426)\n                    _0x59ae3e &&\n                        _0x59ae3e[_0x77273f(0x2bc)] &&\n                        void (-0x221b * 0x1 + 0x2326 * 0x1 + -0x10b) === _0x254aaa[_0x23b426] &&\n                        Object['defineProperty'](_0x254aaa, _0x23b426, _0x59ae3e)\n                }\n                return _0x254aaa\n            }\n\n            function _0x4a7824(_0x26784f, _0x47795a, _0x26a673) {\n                var _0x1edba1 = w_0x25f3\n                return (\n                    (_0x47795a = _0x32e885(_0x47795a)) in _0x26784f\n                        ? Object[_0x1edba1(0x175)](_0x26784f, _0x47795a, {\n                            value: _0x26a673,\n                            enumerable: !(0x24eb + 0x1b2 + -0x1 * 0x269d),\n                            configurable: !(-0x472 + -0xb7 * 0x12 + 0x1150),\n                            writable: !(-0x23f8 + 0x257d + -0x185 * 0x1)\n                        })\n                        : (_0x26784f[_0x47795a] = _0x26a673),\n                    _0x26784f\n                )\n            }\n\n            function _0x36f54f() {\n                var _0x472dbc = w_0x25f3\n                return (_0x36f54f = Object['assign']\n                    ? Object[_0x472dbc(0x2a0)]['bind']()\n                    : function (_0x3e0b52) {\n                        var _0x1eddf8 = _0x472dbc\n                        for (var _0x16d75e = -0x645 + -0x2115 * 0x1 + -0x19 * -0x193; _0x16d75e < arguments[_0x1eddf8(0x259)]; _0x16d75e++) {\n                            var _0x5a9173 = arguments[_0x16d75e]\n                            for (var _0x145ff6 in _0x5a9173)\n                                Object[_0x1eddf8(0x344)][_0x1eddf8(0x3b8)][_0x1eddf8(0x334)](_0x5a9173, _0x145ff6) &&\n                                    (_0x3e0b52[_0x145ff6] = _0x5a9173[_0x145ff6])\n                        }\n                        return _0x3e0b52\n                    })['apply'](this, arguments)\n            }\n\n            function _0x5f346f(_0x2ab8ef) {\n                var _0x39ff04 = w_0x25f3\n                for (var _0x176101 = 0xc60 + -0x43 * -0x1f + 0x6 * -0x36a; _0x176101 < arguments[_0x39ff04(0x259)]; _0x176101++) {\n                    var _0x99688c = null != arguments[_0x176101] ? Object(arguments[_0x176101]) : {},\n                        _0xbf3314 = Object[_0x39ff04(0x17f)](_0x99688c)\n                    _0x39ff04(0x1ee) == typeof Object[_0x39ff04(0x388)] &&\n                        _0xbf3314[_0x39ff04(0x36e)][_0x39ff04(0x207)](\n                            _0xbf3314,\n                            Object[_0x39ff04(0x388)](_0x99688c)[_0x39ff04(0x164)](function (_0x2adc39) {\n                                var _0x23e48e = _0x39ff04\n                                return Object[_0x23e48e(0x2a6)](_0x99688c, _0x2adc39)[_0x23e48e(0x23a)]\n                            })\n                        ),\n                        _0xbf3314['forEach'](function (_0x2e44e4) {\n                            _0x4a7824(_0x2ab8ef, _0x2e44e4, _0x99688c[_0x2e44e4])\n                        })\n                }\n                return _0x2ab8ef\n            }\n\n            function _0x5dda7d(_0x46427b, _0x4b68de) {\n                var _0x5c7f41 = w_0x25f3\n                if ('function' != typeof _0x4b68de && null !== _0x4b68de) throw new TypeError(_0x5c7f41(0x236))\n                    ; (_0x46427b[_0x5c7f41(0x344)] = Object['create'](_0x4b68de && _0x4b68de[_0x5c7f41(0x344)], {\n                        constructor: {\n                            value: _0x46427b,\n                            writable: !(-0x59 * -0x6d + -0x3a5 + -0x2240),\n                            configurable: !(0xf4d * -0x2 + -0x182e + 0x1b64 * 0x2)\n                        }\n                    })),\n                        Object[_0x5c7f41(0x175)](_0x46427b, _0x5c7f41(0x344), {\n                            writable: !(-0x9d0 * -0x1 + 0x17a1 + -0x217 * 0x10)\n                        }),\n                        _0x4b68de && _0x2e2f47(_0x46427b, _0x4b68de)\n            }\n\n            function _0x3879ac(_0x40738f, _0x3ddb1f) {\n                var _0x34aaee = w_0x25f3\n                    ; (_0x40738f[_0x34aaee(0x344)] = Object['create'](_0x3ddb1f[_0x34aaee(0x344)])),\n                        (_0x40738f[_0x34aaee(0x344)][_0x34aaee(0x2ac)] = _0x40738f),\n                        _0x2e2f47(_0x40738f, _0x3ddb1f)\n            }\n\n            function _0x22af63(_0x26c4e4) {\n                var _0x3c9cd2 = w_0x25f3\n                return (_0x22af63 = Object[_0x3c9cd2(0x23b)]\n                    ? Object['getPrototypeOf'][_0x3c9cd2(0x301)]()\n                    : function (_0x212968) {\n                        var _0x3a939f = _0x3c9cd2\n                        return _0x212968['__proto__'] || Object[_0x3a939f(0x22c)](_0x212968)\n                    })(_0x26c4e4)\n            }\n\n            function _0x2e2f47(_0x24c757, _0x1d9d80) {\n                var _0x5e1251 = w_0x25f3\n                return (_0x2e2f47 = Object['setPrototypeOf']\n                    ? Object[_0x5e1251(0x23b)][_0x5e1251(0x301)]()\n                    : function (_0x1f13b4, _0x24fdc8) {\n                        var _0x16bc1b = _0x5e1251\n                        return (_0x1f13b4[_0x16bc1b(0x2ea)] = _0x24fdc8), _0x1f13b4\n                    })(_0x24c757, _0x1d9d80)\n            }\n\n            function _0x3390dc() {\n                var _0x31b3f3 = w_0x25f3\n                if (_0x31b3f3(0x384) == typeof Reflect || !Reflect[_0x31b3f3(0x320)]) return !(-0x1158 + -0x789 + 0x18e2)\n                if (Reflect[_0x31b3f3(0x320)]['sham']) return !(0xec5 + 0x8 * -0x92 + -0xa34 * 0x1)\n                if (_0x31b3f3(0x1ee) == typeof Proxy) return !(-0xe01 + 0xa7b + 0x386)\n                try {\n                    return (\n                        Boolean[_0x31b3f3(0x344)][_0x31b3f3(0x303)][_0x31b3f3(0x334)](Reflect[_0x31b3f3(0x320)](Boolean, [], function () { })),\n                        !(-0xe0c + -0x2415 + 0x3221 * 0x1)\n                    )\n                } catch (_0x20aa1e) {\n                    return !(0xd * -0xa4 + -0xc1f + 0x1474)\n                }\n            }\n\n            function _0x920a3d(_0x35e7ab, _0x5cbd00, _0x53ced5) {\n                var _0x4ba719 = w_0x25f3\n                return (_0x920a3d = _0x3390dc()\n                    ? Reflect['construct'][_0x4ba719(0x301)]()\n                    : function (_0x40c7ae, _0xd26edf, _0x5ecdaf) {\n                        var _0x3b4c0f = _0x4ba719,\n                            _0x55cb1f = [null]\n                        _0x55cb1f['push'][_0x3b4c0f(0x207)](_0x55cb1f, _0xd26edf)\n                        var _0x47f6fb = new (Function[_0x3b4c0f(0x301)]['apply'](_0x40c7ae, _0x55cb1f))()\n                        return _0x5ecdaf && _0x2e2f47(_0x47f6fb, _0x5ecdaf[_0x3b4c0f(0x344)]), _0x47f6fb\n                    })['apply'](null, arguments)\n            }\n\n            function _0x5cb0d7(_0x6e2f2f) {\n                var _0x26e451 = w_0x25f3\n                return -(-0x65 * 0x35 + -0x2087 + -0x3571 * -0x1) !== Function[_0x26e451(0x3ae)]['call'](_0x6e2f2f)[_0x26e451(0x2c5)](_0x26e451(0x161))\n            }\n\n            function _0x16f283(_0x11646e) {\n                var _0x9334eb = w_0x25f3,\n                    _0x551d10 = _0x9334eb(0x1ee) == typeof Map ? new Map() : void (-0xe * -0x5 + 0xd * -0x151 + 0x3 * 0x59d)\n                return (_0x16f283 = function (_0xffb48b) {\n                    var _0x30c56b = _0x9334eb\n                    if (null === _0xffb48b || !_0x5cb0d7(_0xffb48b)) return _0xffb48b\n                    if (_0x30c56b(0x1ee) != typeof _0xffb48b) throw new TypeError(_0x30c56b(0x236))\n                    if (void (0x12 * 0xf8 + -0x41b + 0xd55 * -0x1) !== _0x551d10) {\n                        if (_0x551d10[_0x30c56b(0x2fc)](_0xffb48b)) return _0x551d10[_0x30c56b(0x32b)](_0xffb48b)\n                        _0x551d10[_0x30c56b(0x1e4)](_0xffb48b, _0xfee014)\n                    }\n\n                    function _0xfee014() {\n                        var _0x10fec4 = _0x30c56b\n                        return _0x920a3d(_0xffb48b, arguments, _0x22af63(this)[_0x10fec4(0x2ac)])\n                    }\n\n                    return (\n                        (_0xfee014['prototype'] = Object[_0x30c56b(0x3b7)](_0xffb48b[_0x30c56b(0x344)], {\n                            constructor: {\n                                value: _0xfee014,\n                                enumerable: !(0x829 + 0x1 * -0x1271 + 0xa49),\n                                writable: !(0x724 + 0x15f9 + 0x1d * -0x101),\n                                configurable: !(0x3e4 + 0x685 * 0x4 + 0x1df8 * -0x1)\n                            }\n                        })),\n                        _0x2e2f47(_0xfee014, _0xffb48b)\n                    )\n                })(_0x11646e)\n            }\n\n            function _0x8f6e33(_0xca4201, _0x572889) {\n                var _0x44fa42 = w_0x25f3\n                return null != _0x572889 && _0x44fa42(0x384) != typeof Symbol && _0x572889[Symbol[_0x44fa42(0x178)]]\n                    ? !!_0x572889[Symbol[_0x44fa42(0x178)]](_0xca4201)\n                    : _0xca4201 instanceof _0x572889\n            }\n\n            function _0x2ea366(_0x4da731) {\n                var _0x2c9369 = w_0x25f3\n                return _0x4da731 && _0x4da731[_0x2c9369(0x3bd)]\n                    ? _0x4da731\n                    : {\n                        default: _0x4da731\n                    }\n            }\n\n            function _0x1629e6(_0xb8ec58) {\n                var _0xd6f6f1 = w_0x25f3\n                if (_0xd6f6f1(0x1ee) != typeof WeakMap) return null\n                var _0x2d8f39 = new WeakMap(),\n                    _0x2398fe = new WeakMap()\n                return (_0x1629e6 = function (_0x164b35) {\n                    return _0x164b35 ? _0x2398fe : _0x2d8f39\n                })(_0xb8ec58)\n            }\n\n            function _0x2c9158(_0x2f5c3e, _0x55c9ff) {\n                var _0x3d4018 = w_0x25f3\n                if (!_0x55c9ff && _0x2f5c3e && _0x2f5c3e['__esModule']) return _0x2f5c3e\n                if (null === _0x2f5c3e || (_0x3d4018(0x17d) != typeof _0x2f5c3e && 'function' != typeof _0x2f5c3e))\n                    return {\n                        default: _0x2f5c3e\n                    }\n                var _0xcafe97 = _0x1629e6(_0x55c9ff)\n                if (_0xcafe97 && _0xcafe97[_0x3d4018(0x2fc)](_0x2f5c3e)) return _0xcafe97[_0x3d4018(0x32b)](_0x2f5c3e)\n                var _0x41e330 = {},\n                    _0x115c7f = Object[_0x3d4018(0x175)] && Object[_0x3d4018(0x2a6)]\n                for (var _0x84a510 in _0x2f5c3e)\n                    if (_0x3d4018(0x1d3) !== _0x84a510 && Object[_0x3d4018(0x344)]['hasOwnProperty'][_0x3d4018(0x334)](_0x2f5c3e, _0x84a510)) {\n                        var _0x422bcd = _0x115c7f ? Object[_0x3d4018(0x2a6)](_0x2f5c3e, _0x84a510) : null\n                        _0x422bcd && (_0x422bcd[_0x3d4018(0x32b)] || _0x422bcd[_0x3d4018(0x1e4)])\n                            ? Object['defineProperty'](_0x41e330, _0x84a510, _0x422bcd)\n                            : (_0x41e330[_0x84a510] = _0x2f5c3e[_0x84a510])\n                    }\n                return (_0x41e330['default'] = _0x2f5c3e), _0xcafe97 && _0xcafe97[_0x3d4018(0x1e4)](_0x2f5c3e, _0x41e330), _0x41e330\n            }\n\n            function _0x374736(_0x2d130b, _0x324593) {\n                var _0x4ccff2 = w_0x25f3\n                if (_0x2d130b !== _0x324593) throw new TypeError(_0x4ccff2(0x16c))\n            }\n\n            function _0x206199(_0x607e62) {\n                var _0x5bbb21 = w_0x25f3\n                if (null == _0x607e62) throw new TypeError(_0x5bbb21(0x1cc) + _0x607e62)\n            }\n\n            function _0x2bfa3e(_0x161463, _0x2ff4d5) {\n                var _0x59d7ee = w_0x25f3\n                if (null == _0x161463) return {}\n                var _0x31fbf6,\n                    _0x50d0b6,\n                    _0x5ca1c5 = {},\n                    _0x5b71fd = Object['keys'](_0x161463)\n                for (_0x50d0b6 = -0x763 + -0x15a + 0x1 * 0x8bd; _0x50d0b6 < _0x5b71fd[_0x59d7ee(0x259)]; _0x50d0b6++)\n                    (_0x31fbf6 = _0x5b71fd[_0x50d0b6]),\n                        _0x2ff4d5[_0x59d7ee(0x2c5)](_0x31fbf6) >= 0x8a7 + -0x21ed + 0x1946 || (_0x5ca1c5[_0x31fbf6] = _0x161463[_0x31fbf6])\n                return _0x5ca1c5\n            }\n\n            function _0x2a28e9(_0x2cdf2e, _0x74ac11) {\n                var _0x942c51 = w_0x25f3\n                if (null == _0x2cdf2e) return {}\n                var _0x5ef46e,\n                    _0x5acf70,\n                    _0x282df4 = _0x2bfa3e(_0x2cdf2e, _0x74ac11)\n                if (Object['getOwnPropertySymbols']) {\n                    var _0x33d708 = Object[_0x942c51(0x388)](_0x2cdf2e)\n                    for (_0x5acf70 = -0xd30 + 0x4a1 * 0x1 + 0x7 * 0x139; _0x5acf70 < _0x33d708[_0x942c51(0x259)]; _0x5acf70++)\n                        (_0x5ef46e = _0x33d708[_0x5acf70]),\n                            _0x74ac11[_0x942c51(0x2c5)](_0x5ef46e) >= -0x1f5d * 0x1 + 0x40b + 0x1b52 ||\n                            (Object[_0x942c51(0x344)][_0x942c51(0x1da)][_0x942c51(0x334)](_0x2cdf2e, _0x5ef46e) &&\n                                (_0x282df4[_0x5ef46e] = _0x2cdf2e[_0x5ef46e]))\n                }\n                return _0x282df4\n            }\n\n            function _0x58f550(_0x94e938) {\n                var _0x41d076 = w_0x25f3\n                if (void (-0x6a * 0x1 + -0xf6 + 0x160) === _0x94e938) throw new ReferenceError(_0x41d076(0x1bb))\n                return _0x94e938\n            }\n\n            function _0xf3b17(_0x7b2cf6, _0x347c9f) {\n                var _0x41f350 = w_0x25f3\n                if (_0x347c9f && (_0x41f350(0x17d) == typeof _0x347c9f || _0x41f350(0x1ee) == typeof _0x347c9f)) return _0x347c9f\n                if (void (0x160d + -0x24fd + -0x8 * -0x1de) !== _0x347c9f)\n                    throw new TypeError('Derived\\x20constructors\\x20may\\x20only\\x20return\\x20object\\x20or\\x20undefined')\n                return _0x58f550(_0x7b2cf6)\n            }\n\n            function _0x17b234(_0x33316f) {\n                var _0x3601f0 = _0x3390dc()\n                return function () {\n                    var _0x4733d6 = w_0x25f3,\n                        _0x2848c1,\n                        _0x2d0386 = _0x22af63(_0x33316f)\n                    if (_0x3601f0) {\n                        var _0x252bb3 = _0x22af63(this)[_0x4733d6(0x2ac)]\n                        _0x2848c1 = Reflect[_0x4733d6(0x320)](_0x2d0386, arguments, _0x252bb3)\n                    } else _0x2848c1 = _0x2d0386[_0x4733d6(0x207)](this, arguments)\n                    return _0xf3b17(this, _0x2848c1)\n                }\n            }\n\n            function _0x2b3a8b(_0x409fbb, _0x508825) {\n                for (; !Object['prototype']['hasOwnProperty']['call'](_0x409fbb, _0x508825) && null !== (_0x409fbb = _0x22af63(_0x409fbb)););\n                return _0x409fbb\n            }\n\n            function _0x33bfa4() {\n                var _0x1bbf02 = w_0x25f3\n                return (_0x33bfa4 =\n                    _0x1bbf02(0x384) != typeof Reflect && Reflect[_0x1bbf02(0x32b)]\n                        ? Reflect[_0x1bbf02(0x32b)][_0x1bbf02(0x301)]()\n                        : function (_0x45f38c, _0x4a526c, _0x482f60) {\n                            var _0xb2ad90 = _0x1bbf02,\n                                _0x53f5d7 = _0x2b3a8b(_0x45f38c, _0x4a526c)\n                            if (_0x53f5d7) {\n                                var _0x24e05f = Object[_0xb2ad90(0x2a6)](_0x53f5d7, _0x4a526c)\n                                return _0x24e05f[_0xb2ad90(0x32b)]\n                                    ? _0x24e05f[_0xb2ad90(0x32b)][_0xb2ad90(0x334)](\n                                        arguments[_0xb2ad90(0x259)] < 0x7f * 0x25 + 0x23f3 + -0x364b ? _0x45f38c : _0x482f60\n                                    )\n                                    : _0x24e05f[_0xb2ad90(0x2e4)]\n                            }\n                        })['apply'](this, arguments)\n            }\n\n            function _0x5b010c(_0x878ee0, _0x27a5c4, _0x35cb40, _0x14e9ba) {\n                var _0x1c5f60 = w_0x25f3\n                return (_0x5b010c =\n                    'undefined' != typeof Reflect && Reflect[_0x1c5f60(0x1e4)]\n                        ? Reflect[_0x1c5f60(0x1e4)]\n                        : function (_0xc1d4d, _0x3a32f8, _0x25436d, _0x5ef6e3) {\n                            var _0x43a591 = _0x1c5f60,\n                                _0x23d91e,\n                                _0x5ac459 = _0x2b3a8b(_0xc1d4d, _0x3a32f8)\n                            if (_0x5ac459) {\n                                if ((_0x23d91e = Object[_0x43a591(0x2a6)](_0x5ac459, _0x3a32f8))[_0x43a591(0x1e4)])\n                                    return _0x23d91e['set'][_0x43a591(0x334)](_0x5ef6e3, _0x25436d), !(0x4d * -0x59 + -0x1 * -0x3d6 + 0x16ef)\n                                if (!_0x23d91e[_0x43a591(0x2e3)]) return !(-0x2691 + 0x9e * 0x25 + 0xfbc)\n                            }\n                            if ((_0x23d91e = Object['getOwnPropertyDescriptor'](_0x5ef6e3, _0x3a32f8))) {\n                                if (!_0x23d91e[_0x43a591(0x2e3)]) return !(0x14d + -0x1 * -0x29b + -0x3e7)\n                                    ; (_0x23d91e[_0x43a591(0x2e4)] = _0x25436d), Object[_0x43a591(0x175)](_0x5ef6e3, _0x3a32f8, _0x23d91e)\n                            } else _0x4a7824(_0x5ef6e3, _0x3a32f8, _0x25436d)\n                            return !(0x295 + -0xa39 * -0x2 + -0x1707)\n                        })(_0x878ee0, _0x27a5c4, _0x35cb40, _0x14e9ba)\n            }\n\n            function _0x2732a4(_0x24a602, _0x194547, _0x16a7b5, _0x8913b1, _0x531d0d) {\n                var _0x16563f = w_0x25f3\n                if (!_0x5b010c(_0x24a602, _0x194547, _0x16a7b5, _0x8913b1 || _0x24a602) && _0x531d0d) throw new TypeError(_0x16563f(0x34e))\n                return _0x16a7b5\n            }\n\n            function _0x281bf3(_0x4564b4, _0x1f4153) {\n                var _0x10b792 = w_0x25f3\n                return (\n                    _0x1f4153 || (_0x1f4153 = _0x4564b4[_0x10b792(0x2a5)](0x1017 + 0x1cb3 + 0x2 * -0x1665)),\n                    Object[_0x10b792(0x198)](\n                        Object[_0x10b792(0x36c)](_0x4564b4, {\n                            raw: {\n                                value: Object[_0x10b792(0x198)](_0x1f4153)\n                            }\n                        })\n                    )\n                )\n            }\n\n            function _0x2d5f0c(_0x18863e, _0x13e8d4) {\n                var _0x47a3d1 = w_0x25f3\n                return (\n                    _0x13e8d4 || (_0x13e8d4 = _0x18863e['slice'](0x8f1 * 0x1 + 0x1 * 0x1e1f + -0x7d * 0x50)),\n                    (_0x18863e[_0x47a3d1(0x2ab)] = _0x13e8d4),\n                    _0x18863e\n                )\n            }\n\n            function _0x246229(_0x5e71a0) {\n                var _0x47c977 = w_0x25f3\n                throw new TypeError('\\x22' + _0x5e71a0 + _0x47c977(0x338))\n            }\n\n            function _0x5db7bf(_0x51f915) {\n                throw new TypeError('\\x22' + _0x51f915 + '\\x22\\x20is\\x20write-only')\n            }\n\n            function _0x2275f4(_0x42246e) {\n                var _0x2f7351 = w_0x25f3\n                throw new ReferenceError(_0x2f7351(0x1c7) + _0x42246e + '\\x22\\x20cannot\\x20be\\x20referenced\\x20in\\x20computed\\x20property\\x20keys.')\n            }\n\n            function _0x516c2b() { }\n\n            function _0xab4ac9(_0xcde017) {\n                throw new ReferenceError(_0xcde017 + '\\x20is\\x20not\\x20defined\\x20-\\x20temporal\\x20dead\\x20zone')\n            }\n\n            function _0x5b377b(_0x5f4fa5, _0x2f492b) {\n                return _0x5f4fa5 === _0x516c2b ? _0xab4ac9(_0x2f492b) : _0x5f4fa5\n            }\n\n            function _0x5096de(_0x3b53c6, _0x3225c3) {\n                return _0x1ae312(_0x3b53c6) || _0x19d66a(_0x3b53c6, _0x3225c3) || _0x525331(_0x3b53c6, _0x3225c3) || _0x25b697()\n            }\n\n            function _0x1dff6c(_0x3a7a63, _0x147620) {\n                return _0x1ae312(_0x3a7a63) || _0x376fd5(_0x3a7a63, _0x147620) || _0x525331(_0x3a7a63, _0x147620) || _0x25b697()\n            }\n\n            function _0x5c885(_0x3953c0) {\n                return _0x1ae312(_0x3953c0) || _0x1853c6(_0x3953c0) || _0x525331(_0x3953c0) || _0x25b697()\n            }\n\n            function _0x534083(_0x3396cf) {\n                return _0x1ccd19(_0x3396cf) || _0x1853c6(_0x3396cf) || _0x525331(_0x3396cf) || _0x542337()\n            }\n\n            function _0x1ccd19(_0x15e4f0) {\n                var _0x384cbb = w_0x25f3\n                if (Array[_0x384cbb(0x2af)](_0x15e4f0)) return _0x537c83(_0x15e4f0)\n            }\n\n            function _0x1ae312(_0x4bfad0) {\n                var _0x3bc5ad = w_0x25f3\n                if (Array[_0x3bc5ad(0x2af)](_0x4bfad0)) return _0x4bfad0\n            }\n\n            function _0x4bbf4b(_0x33a831, _0x181a3c, _0x135270) {\n                var _0x5bf329 = w_0x25f3\n                if (_0x181a3c && !Array[_0x5bf329(0x2af)](_0x181a3c) && _0x5bf329(0x28b) == typeof _0x181a3c[_0x5bf329(0x259)]) {\n                    var _0x43388b = _0x181a3c[_0x5bf329(0x259)]\n                    return _0x537c83(_0x181a3c, void (0xb * -0x29 + 0x387 + -0x2 * 0xe2) !== _0x135270 && _0x135270 < _0x43388b ? _0x135270 : _0x43388b)\n                }\n                return _0x33a831(_0x181a3c, _0x135270)\n            }\n\n            function _0x1853c6(_0x3086ca) {\n                var _0x3e6030 = w_0x25f3\n                if ((_0x3e6030(0x384) != typeof Symbol && null != _0x3086ca[Symbol[_0x3e6030(0x3b3)]]) || null != _0x3086ca[_0x3e6030(0x1dd)])\n                    return Array['from'](_0x3086ca)\n            }\n\n            function _0x525331(_0x1ceb3f, _0x38a668) {\n                var _0x2b5250 = w_0x25f3\n                if (_0x1ceb3f) {\n                    if (_0x2b5250(0x33c) == typeof _0x1ceb3f) return _0x537c83(_0x1ceb3f, _0x38a668)\n                    var _0x2821d9 = Object[_0x2b5250(0x344)][_0x2b5250(0x3ae)]\n                    [_0x2b5250(0x334)](_0x1ceb3f)\n                    ['slice'](0x2ae * -0x7 + 0x1 * 0x2181 + 0xeb7 * -0x1, -(-0x1d * -0xec + 0x2 * -0x32 + -0x1a57))\n                    return (\n                        _0x2b5250(0x2eb) === _0x2821d9 && _0x1ceb3f[_0x2b5250(0x2ac)] && (_0x2821d9 = _0x1ceb3f[_0x2b5250(0x2ac)]['name']),\n                        'Map' === _0x2821d9 || _0x2b5250(0x160) === _0x2821d9\n                            ? Array[_0x2b5250(0x29c)](_0x1ceb3f)\n                            : _0x2b5250(0x27f) === _0x2821d9 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/[_0x2b5250(0x22b)](_0x2821d9)\n                                ? _0x537c83(_0x1ceb3f, _0x38a668)\n                                : void (-0x1 * 0xf34 + 0x12e6 + 0x1d9 * -0x2)\n                    )\n                }\n            }\n\n            function _0x537c83(_0x1cc46a, _0xca9940) {\n                var _0x4c66e3 = w_0x25f3\n                    ; (null == _0xca9940 || _0xca9940 > _0x1cc46a[_0x4c66e3(0x259)]) && (_0xca9940 = _0x1cc46a[_0x4c66e3(0x259)])\n                for (var _0x3859e4 = 0x1fe3 * 0x1 + -0x22be + 0x2db, _0x3a8ed3 = new Array(_0xca9940); _0x3859e4 < _0xca9940; _0x3859e4++)\n                    _0x3a8ed3[_0x3859e4] = _0x1cc46a[_0x3859e4]\n                return _0x3a8ed3\n            }\n\n            function _0x542337() {\n                var _0x1d894c = w_0x25f3\n                throw new TypeError(_0x1d894c(0x3a8))\n            }\n\n            function _0x25b697() {\n                throw new TypeError(\n                    'Invalid\\x20attempt\\x20to\\x20destructure\\x20non-iterable\\x20instance.\\x0aIn\\x20order\\x20to\\x20be\\x20iterable,\\x20non-array\\x20objects\\x20must\\x20have\\x20a\\x20[Symbol.iterator]()\\x20method.'\n                )\n            }\n\n            function _0x350075(_0x189dc6, _0x3f6be9) {\n                var _0x464771 = w_0x25f3,\n                    _0x199147 = (_0x464771(0x384) != typeof Symbol && _0x189dc6[Symbol[_0x464771(0x3b3)]]) || _0x189dc6[_0x464771(0x1dd)]\n                if (!_0x199147) {\n                    if (\n                        Array['isArray'](_0x189dc6) ||\n                        (_0x199147 = _0x525331(_0x189dc6)) ||\n                        (_0x3f6be9 && _0x189dc6 && _0x464771(0x28b) == typeof _0x189dc6[_0x464771(0x259)])\n                    ) {\n                        _0x199147 && (_0x189dc6 = _0x199147)\n                        var _0x544a3f = 0x1fd2 + 0x1 * -0x1ad5 + 0x4fd * -0x1,\n                            _0x5b20ae = function () { }\n                        return {\n                            s: _0x5b20ae,\n                            n: function () {\n                                var _0x4c93f0 = _0x464771\n                                return _0x544a3f >= _0x189dc6[_0x4c93f0(0x259)]\n                                    ? {\n                                        done: !(-0x1aaa * 0x1 + -0x126e * 0x1 + 0x2d18)\n                                    }\n                                    : {\n                                        done: !(0x7 * -0x205 + 0x1d44 + -0xf20),\n                                        value: _0x189dc6[_0x544a3f++]\n                                    }\n                            },\n                            e: function (_0x4d8393) {\n                                throw _0x4d8393\n                            },\n                            f: _0x5b20ae\n                        }\n                    }\n                    throw new TypeError(_0x464771(0x2ae))\n                }\n                var _0x23cdd3,\n                    _0x5bcfbb = !(0x1 * -0x810 + -0xb3 * 0x2f + 0x1 * 0x28ed),\n                    _0x4db4fd = !(0x221 + 0x62e * 0x5 + 0x3 * -0xb02)\n                return {\n                    s: function () {\n                        _0x199147 = _0x199147['call'](_0x189dc6)\n                    },\n                    n: function () {\n                        var _0x30f507 = _0x464771,\n                            _0x2382b6 = _0x199147['next']()\n                        return (_0x5bcfbb = _0x2382b6[_0x30f507(0x1e3)]), _0x2382b6\n                    },\n                    e: function (_0x3b0f24) {\n                        ; (_0x4db4fd = !(0x18e0 + 0x2 * 0x214 + -0x1d08)), (_0x23cdd3 = _0x3b0f24)\n                    },\n                    f: function () {\n                        var _0x22fdad = _0x464771\n                        try {\n                            _0x5bcfbb || null == _0x199147[_0x22fdad(0x2fd)] || _0x199147[_0x22fdad(0x2fd)]()\n                        } finally {\n                            if (_0x4db4fd) throw _0x23cdd3\n                        }\n                    }\n                }\n            }\n\n            function _0x37af30(_0x37ea9e, _0x2388a0) {\n                var _0x3701de = w_0x25f3,\n                    _0x2ac940 = ('undefined' != typeof Symbol && _0x37ea9e[Symbol[_0x3701de(0x3b3)]]) || _0x37ea9e['@@iterator']\n                if (_0x2ac940) return (_0x2ac940 = _0x2ac940['call'](_0x37ea9e))[_0x3701de(0x389)][_0x3701de(0x301)](_0x2ac940)\n                if (\n                    Array[_0x3701de(0x2af)](_0x37ea9e) ||\n                    (_0x2ac940 = _0x525331(_0x37ea9e)) ||\n                    (_0x2388a0 && _0x37ea9e && 'number' == typeof _0x37ea9e[_0x3701de(0x259)])\n                ) {\n                    _0x2ac940 && (_0x37ea9e = _0x2ac940)\n                    var _0x1dcac8 = 0x1d * -0x11a + -0x1f * 0xc7 + -0x380b * -0x1\n                    return function () {\n                        var _0x306ed0 = _0x3701de\n                        return _0x1dcac8 >= _0x37ea9e[_0x306ed0(0x259)]\n                            ? {\n                                done: !(-0x29d + 0x5fb * -0x1 + 0x898)\n                            }\n                            : {\n                                done: !(-0x6e * 0x4f + 0x2311 + -0x11e),\n                                value: _0x37ea9e[_0x1dcac8++]\n                            }\n                    }\n                }\n                throw new TypeError(_0x3701de(0x2ae))\n            }\n\n            function _0x5362e1(_0x4cd55f) {\n                return function () {\n                    var _0x58617f = w_0x25f3,\n                        _0x183c06 = _0x4cd55f['apply'](this, arguments)\n                    return _0x183c06[_0x58617f(0x389)](), _0x183c06\n                }\n            }\n\n            function _0x4ad3b0(_0x460146, _0x32cf07) {\n                var _0x271683 = w_0x25f3\n                if (_0x271683(0x17d) != typeof _0x460146 || null === _0x460146) return _0x460146\n                var _0xa9fa9c = _0x460146[Symbol['toPrimitive']]\n                if (void (0x21b4 + 0x5 * 0x4c7 + 0x3997 * -0x1) !== _0xa9fa9c) {\n                    var _0x560849 = _0xa9fa9c['call'](_0x460146, _0x32cf07 || _0x271683(0x1d3))\n                    if ('object' != typeof _0x560849) return _0x560849\n                    throw new TypeError(_0x271683(0x358))\n                }\n                return ('string' === _0x32cf07 ? String : Number)(_0x460146)\n            }\n\n            function _0x32e885(_0x225644) {\n                var _0x1eb479 = w_0x25f3,\n                    _0x45c5d4 = _0x4ad3b0(_0x225644, _0x1eb479(0x33c))\n                return _0x1eb479(0x2ed) == typeof _0x45c5d4 ? _0x45c5d4 : String(_0x45c5d4)\n            }\n\n            function _0xf47dc3(_0x1d62a3, _0xeb8470) {\n                var _0x31107e = w_0x25f3\n                throw new Error(_0x31107e(0x1ff))\n            }\n\n            function _0x9d8dd5(_0x238b59, _0x206a18, _0x4378c6, _0x532e73) {\n                var _0x340b07 = w_0x25f3\n                _0x4378c6 &&\n                    Object[_0x340b07(0x175)](_0x238b59, _0x206a18, {\n                        enumerable: _0x4378c6['enumerable'],\n                        configurable: _0x4378c6[_0x340b07(0x2bc)],\n                        writable: _0x4378c6[_0x340b07(0x2e3)],\n                        value: _0x4378c6[_0x340b07(0x2d0)]\n                            ? _0x4378c6['initializer'][_0x340b07(0x334)](_0x532e73)\n                            : void (-0x1ae6 + -0x1 * -0xf6b + 0xb7b * 0x1)\n                    })\n            }\n\n            function _0x271739(_0xb876c5, _0x285720, _0x361de9, _0x52c079, _0x38a76d) {\n                var _0x26b61e = w_0x25f3,\n                    _0x25c883 = {}\n                return (\n                    Object['keys'](_0x52c079)[_0x26b61e(0x254)](function (_0xd1a198) {\n                        _0x25c883[_0xd1a198] = _0x52c079[_0xd1a198]\n                    }),\n                    (_0x25c883[_0x26b61e(0x23a)] = !!_0x25c883[_0x26b61e(0x23a)]),\n                    (_0x25c883[_0x26b61e(0x2bc)] = !!_0x25c883[_0x26b61e(0x2bc)]),\n                    (_0x26b61e(0x2e4) in _0x25c883 || _0x25c883['initializer']) && (_0x25c883[_0x26b61e(0x2e3)] = !(0x21e8 + -0x7cf * -0x5 + -0x48f3)),\n                    (_0x25c883 = _0x361de9[_0x26b61e(0x2a5)]()\n                    [_0x26b61e(0x2f3)]()\n                    [_0x26b61e(0x376)](function (_0x490c4a, _0x3636f6) {\n                        return _0x3636f6(_0xb876c5, _0x285720, _0x490c4a) || _0x490c4a\n                    }, _0x25c883)),\n                    _0x38a76d &&\n                    void (0x1050 + 0x1 * 0x121f + -0x226f) !== _0x25c883[_0x26b61e(0x2d0)] &&\n                    ((_0x25c883[_0x26b61e(0x2e4)] = _0x25c883[_0x26b61e(0x2d0)]\n                        ? _0x25c883[_0x26b61e(0x2d0)][_0x26b61e(0x334)](_0x38a76d)\n                        : void (0x1392 + -0xbe * 0x23 + -0x1 * -0x668)),\n                        (_0x25c883[_0x26b61e(0x2d0)] = void (-0x1 * -0x1b9a + 0x7f7 + -0x2391 * 0x1))),\n                    void (0x53 * 0xb + 0xa2 * -0xf + 0x5ed) === _0x25c883[_0x26b61e(0x2d0)] &&\n                    (Object[_0x26b61e(0x175)](_0xb876c5, _0x285720, _0x25c883), (_0x25c883 = null)),\n                    _0x25c883\n                )\n            }\n\n            ; (_0x137ba2['prototype'][(_0x5612de(0x1ee) == typeof Symbol && Symbol[_0x5612de(0x17c)]) || _0x5612de(0x230)] = function () {\n                return this\n            }),\n                (_0x137ba2[_0x5612de(0x344)]['next'] = function (_0x4262ae) {\n                    var _0x1543b4 = _0x5612de\n                    return this[_0x1543b4(0x1b1)](_0x1543b4(0x389), _0x4262ae)\n                }),\n                (_0x137ba2[_0x5612de(0x344)]['throw'] = function (_0x29bafe) {\n                    var _0x4c6950 = _0x5612de\n                    return this[_0x4c6950(0x1b1)]('throw', _0x29bafe)\n                }),\n                (_0x137ba2[_0x5612de(0x344)][_0x5612de(0x2fd)] = function (_0x49a53d) {\n                    var _0x58f790 = _0x5612de\n                    return this[_0x58f790(0x1b1)](_0x58f790(0x2fd), _0x49a53d)\n                })\n            var _0x371360 = 0x11 * -0x20 + 0x88 * -0x1f + 0x1298,\n                _0x4d6c78,\n                _0x312e19,\n                _0x2a32a1,\n                _0x371ac2\n\n            function _0x2ca065(_0x4c2f2d) {\n                var _0x4415ed = _0x5612de\n                return _0x4415ed(0x365) + _0x371360++ + '_' + _0x4c2f2d\n            }\n\n            function _0x33f649(_0x59611c, _0xb8c4c1) {\n                var _0x22f43f = _0x5612de\n                if (!Object['prototype'][_0x22f43f(0x3b8)][_0x22f43f(0x334)](_0x59611c, _0xb8c4c1)) throw new TypeError(_0x22f43f(0x271))\n                return _0x59611c\n            }\n\n            function _0x4c53b8(_0x467264, _0x1c39b3) {\n                var _0x12fb5e = _0x5612de\n                return _0x1de0ff(_0x467264, _0x3feef3(_0x467264, _0x1c39b3, _0x12fb5e(0x32b)))\n            }\n\n            function _0xf01d58(_0x248ad, _0xd514dd, _0x4ffcbe) {\n                var _0x2a0763 = _0x5612de\n                return _0x30760d(_0x248ad, _0x3feef3(_0x248ad, _0xd514dd, _0x2a0763(0x1e4)), _0x4ffcbe), _0x4ffcbe\n            }\n\n            function _0x3ff428(_0x59a12f, _0x2e6e68) {\n                var _0x1a4f4c = _0x5612de\n                return _0x1af7ca(_0x59a12f, _0x3feef3(_0x59a12f, _0x2e6e68, _0x1a4f4c(0x1e4)))\n            }\n\n            function _0x3feef3(_0x76bca3, _0x49ed2b, _0xf40042) {\n                var _0x26b65c = _0x5612de\n                if (!_0x49ed2b[_0x26b65c(0x2fc)](_0x76bca3)) throw new TypeError(_0x26b65c(0x2ad) + _0xf40042 + _0x26b65c(0x2bd))\n                return _0x49ed2b[_0x26b65c(0x32b)](_0x76bca3)\n            }\n\n            function _0x46f318(_0x2345ad, _0x29e732, _0x5d3874) {\n                var _0x1785a7 = _0x5612de\n                return _0x3fbf28(_0x2345ad, _0x29e732), _0x234ff5(_0x5d3874, _0x1785a7(0x32b)), _0x1de0ff(_0x2345ad, _0x5d3874)\n            }\n\n            function _0x3d490a(_0x421876, _0x556ee1, _0x489ccf, _0x32c792) {\n                return _0x3fbf28(_0x421876, _0x556ee1), _0x234ff5(_0x489ccf, 'set'), _0x30760d(_0x421876, _0x489ccf, _0x32c792), _0x32c792\n            }\n\n            function _0x1f2159(_0x3c139e, _0xf1d93, _0xa6753b) {\n                return _0x3fbf28(_0x3c139e, _0xf1d93), _0xa6753b\n            }\n\n            function _0x2fcc7b() {\n                var _0x52da1e = _0x5612de\n                throw new TypeError(_0x52da1e(0x1bd))\n            }\n\n            function _0x1de0ff(_0x35f1cc, _0x2cd6a2) {\n                var _0x331169 = _0x5612de\n                return _0x2cd6a2[_0x331169(0x32b)] ? _0x2cd6a2[_0x331169(0x32b)][_0x331169(0x334)](_0x35f1cc) : _0x2cd6a2[_0x331169(0x2e4)]\n            }\n\n            function _0x30760d(_0x26c16c, _0x3bf250, _0x4bb532) {\n                var _0x4b5758 = _0x5612de\n                if (_0x3bf250['set']) _0x3bf250['set'][_0x4b5758(0x334)](_0x26c16c, _0x4bb532)\n                else {\n                    if (!_0x3bf250['writable']) throw new TypeError('attempted\\x20to\\x20set\\x20read\\x20only\\x20private\\x20field')\n                    _0x3bf250['value'] = _0x4bb532\n                }\n            }\n\n            function _0x1af7ca(_0x38569e, _0x4d9da9) {\n                var _0x8504a5 = _0x5612de\n                if (_0x4d9da9[_0x8504a5(0x1e4)])\n                    return (\n                        _0x8504a5(0x36f) in _0x4d9da9 ||\n                        (_0x4d9da9['__destrObj'] = {\n                            set value(_0xa3d23) {\n                                var _0x3d920b = _0x8504a5\n                                _0x4d9da9[_0x3d920b(0x1e4)][_0x3d920b(0x334)](_0x38569e, _0xa3d23)\n                            }\n                        }),\n                        _0x4d9da9['__destrObj']\n                    )\n                if (!_0x4d9da9[_0x8504a5(0x2e3)]) throw new TypeError('attempted\\x20to\\x20set\\x20read\\x20only\\x20private\\x20field')\n                return _0x4d9da9\n            }\n\n            function _0x153ad5(_0x361a17, _0x4bf341, _0x38ef34) {\n                var _0x36fea3 = _0x5612de\n                return _0x3fbf28(_0x361a17, _0x4bf341), _0x234ff5(_0x38ef34, _0x36fea3(0x1e4)), _0x1af7ca(_0x361a17, _0x38ef34)\n            }\n\n            function _0x3fbf28(_0x1609bf, _0x372dbd) {\n                if (_0x1609bf !== _0x372dbd) throw new TypeError('Private\\x20static\\x20access\\x20of\\x20wrong\\x20provenance')\n            }\n\n            function _0x234ff5(_0x5dcf40, _0xa0e3be) {\n                var _0x4d5828 = _0x5612de\n                if (void (0x9 * 0x3b9 + -0x7 * -0x2bb + -0x382 * 0xf) === _0x5dcf40)\n                    throw new TypeError(_0x4d5828(0x2ad) + _0xa0e3be + '\\x20private\\x20static\\x20field\\x20before\\x20its\\x20declaration')\n            }\n\n            function _0x3cd893(_0x4d4ac2, _0x117b1a, _0x13ebad, _0x227002) {\n                var _0x404d8d = _0x5612de,\n                    _0x21250e = _0xdaf8f6()\n                if (_0x227002) {\n                    for (var _0x1ad96b = -0x1 * -0x109d + 0x157 + -0x11f4; _0x1ad96b < _0x227002[_0x404d8d(0x259)]; _0x1ad96b++)\n                        _0x21250e = _0x227002[_0x1ad96b](_0x21250e)\n                }\n                var _0x176094 = _0x117b1a(function (_0x32bc32) {\n                    var _0x1f970f = _0x404d8d\n                    _0x21250e[_0x1f970f(0x313)](_0x32bc32, _0x1fa626[_0x1f970f(0x265)])\n                }, _0x13ebad),\n                    _0x1fa626 = _0x21250e[_0x404d8d(0x2df)](_0x872852(_0x176094['d'][_0x404d8d(0x1cb)](_0x210308)), _0x4d4ac2)\n                return (\n                    _0x21250e[_0x404d8d(0x217)](_0x176094['F'], _0x1fa626[_0x404d8d(0x265)]),\n                    _0x21250e[_0x404d8d(0x165)](_0x176094['F'], _0x1fa626[_0x404d8d(0x39c)])\n                )\n            }\n\n            function _0xdaf8f6() {\n                var _0x3fa41d = _0x5612de\n                _0xdaf8f6 = function () {\n                    return _0x513b0e\n                }\n                var _0x513b0e = {\n                    elementsDefinitionOrder: [[_0x3fa41d(0x25a)], [_0x3fa41d(0x23c)]],\n                    initializeInstanceElements: function (_0x179aa6, _0x25d5cd) {\n                        var _0x557071 = _0x3fa41d\n                            ;[_0x557071(0x25a), _0x557071(0x23c)][_0x557071(0x254)](function (_0x2476e8) {\n                                var _0x9b5c0b = _0x557071\n                                _0x25d5cd[_0x9b5c0b(0x254)](function (_0x299a4a) {\n                                    var _0x53da95 = _0x9b5c0b\n                                    _0x299a4a['kind'] === _0x2476e8 &&\n                                        _0x53da95(0x235) === _0x299a4a[_0x53da95(0x215)] &&\n                                        this[_0x53da95(0x2e1)](_0x179aa6, _0x299a4a)\n                                }, this)\n                            }, this)\n                    },\n                    initializeClassElements: function (_0x300a4c, _0x38031f) {\n                        var _0x450502 = _0x3fa41d,\n                            _0x4e1581 = _0x300a4c[_0x450502(0x344)]\n                            ;[_0x450502(0x25a), _0x450502(0x23c)]['forEach'](function (_0x2fde74) {\n                                _0x38031f['forEach'](function (_0xe5e082) {\n                                    var _0x123341 = w_0x25f3,\n                                        _0x174ec4 = _0xe5e082[_0x123341(0x215)]\n                                    if (_0xe5e082[_0x123341(0x26f)] === _0x2fde74 && (_0x123341(0x396) === _0x174ec4 || _0x123341(0x344) === _0x174ec4)) {\n                                        var _0x184ef0 = _0x123341(0x396) === _0x174ec4 ? _0x300a4c : _0x4e1581\n                                        this[_0x123341(0x2e1)](_0x184ef0, _0xe5e082)\n                                    }\n                                }, this)\n                            }, this)\n                    },\n                    defineClassElement: function (_0x2e2a2c, _0x5db810) {\n                        var _0x522104 = _0x3fa41d,\n                            _0x2d7321 = _0x5db810['descriptor']\n                        if (_0x522104(0x23c) === _0x5db810[_0x522104(0x26f)]) {\n                            var _0x554ae6 = _0x5db810[_0x522104(0x2d0)]\n                            _0x2d7321 = {\n                                enumerable: _0x2d7321[_0x522104(0x23a)],\n                                writable: _0x2d7321[_0x522104(0x2e3)],\n                                configurable: _0x2d7321[_0x522104(0x2bc)],\n                                value:\n                                    void (-0x1 * 0x3bd + 0x1ef9 + -0x1b3c) === _0x554ae6\n                                        ? void (0x1 * 0x1afe + 0xcd0 + 0x7f6 * -0x5)\n                                        : _0x554ae6[_0x522104(0x334)](_0x2e2a2c)\n                            }\n                        }\n                        Object[_0x522104(0x175)](_0x2e2a2c, _0x5db810['key'], _0x2d7321)\n                    },\n                    decorateClass: function (_0x4d5101, _0x1a7961) {\n                        var _0x129760 = _0x3fa41d,\n                            _0x1a31cc = [],\n                            _0x3f7e89 = [],\n                            _0xf8b039 = {\n                                static: [],\n                                prototype: [],\n                                own: []\n                            }\n                        if (\n                            (_0x4d5101[_0x129760(0x254)](function (_0x5c0ba5) {\n                                var _0x27d627 = _0x129760\n                                this[_0x27d627(0x33d)](_0x5c0ba5, _0xf8b039)\n                            }, this),\n                                _0x4d5101[_0x129760(0x254)](function (_0x239102) {\n                                    var _0x151241 = _0x129760\n                                    if (!_0x51f3b5(_0x239102)) return _0x1a31cc[_0x151241(0x36e)](_0x239102)\n                                    var _0x43ec40 = this[_0x151241(0x1ac)](_0x239102, _0xf8b039)\n                                    _0x1a31cc[_0x151241(0x36e)](_0x43ec40[_0x151241(0x206)]),\n                                        _0x1a31cc[_0x151241(0x36e)]['apply'](_0x1a31cc, _0x43ec40[_0x151241(0x3bc)]),\n                                        _0x3f7e89[_0x151241(0x36e)]['apply'](_0x3f7e89, _0x43ec40[_0x151241(0x39c)])\n                                }, this),\n                                !_0x1a7961)\n                        )\n                            return {\n                                elements: _0x1a31cc,\n                                finishers: _0x3f7e89\n                            }\n                        var _0x857545 = this[_0x129760(0x34c)](_0x1a31cc, _0x1a7961)\n                        return (\n                            _0x3f7e89['push'][_0x129760(0x207)](_0x3f7e89, _0x857545[_0x129760(0x39c)]),\n                            (_0x857545[_0x129760(0x39c)] = _0x3f7e89),\n                            _0x857545\n                        )\n                    },\n                    addElementPlacement: function (_0x9cedb8, _0x4c2171, _0xa6e6c8) {\n                        var _0x5d3aa1 = _0x3fa41d,\n                            _0x33e5e0 = _0x4c2171[_0x9cedb8[_0x5d3aa1(0x215)]]\n                        if (!_0xa6e6c8 && -(-0x1a83 + -0x1 * -0x16ee + 0x99 * 0x6) !== _0x33e5e0['indexOf'](_0x9cedb8['key']))\n                            throw new TypeError('Duplicated\\x20element\\x20(' + _0x9cedb8[_0x5d3aa1(0x392)] + ')')\n                        _0x33e5e0[_0x5d3aa1(0x36e)](_0x9cedb8[_0x5d3aa1(0x392)])\n                    },\n                    decorateElement: function (_0x463258, _0x11d852) {\n                        var _0x495609 = _0x3fa41d\n                        for (\n                            var _0x4c5aa5 = [],\n                            _0x46b095 = [],\n                            _0x106243 = _0x463258['decorators'],\n                            _0x195d25 = _0x106243[_0x495609(0x259)] - (-0x1d5c * -0x1 + 0x1aa9 + 0x956 * -0x6);\n                            _0x195d25 >= 0x18ee + 0x1 * 0x1c19 + 0xf * -0x389;\n                            _0x195d25--\n                        ) {\n                            var _0x425891 = _0x11d852[_0x463258[_0x495609(0x215)]]\n                            _0x425891[_0x495609(0x2ec)](_0x425891[_0x495609(0x2c5)](_0x463258[_0x495609(0x392)]), 0x1 * 0xca7 + -0xaf * -0xb + -0x142b)\n                            var _0x30722d = this[_0x495609(0x372)](_0x463258),\n                                _0x15a14c = this[_0x495609(0x18a)]((0x61 * 0x2d + 0x1545 + -0x1 * 0x2652, _0x106243[_0x195d25])(_0x30722d) || _0x30722d)\n                                ; (_0x463258 = _0x15a14c['element']),\n                                    this['addElementPlacement'](_0x463258, _0x11d852),\n                                    _0x15a14c[_0x495609(0x2f4)] && _0x46b095[_0x495609(0x36e)](_0x15a14c[_0x495609(0x2f4)])\n                            var _0x98e9dc = _0x15a14c[_0x495609(0x3bc)]\n                            if (_0x98e9dc) {\n                                for (var _0x56dd4d = 0xb * 0x12e + -0x1f17 + -0x121d * -0x1; _0x56dd4d < _0x98e9dc[_0x495609(0x259)]; _0x56dd4d++)\n                                    this[_0x495609(0x33d)](_0x98e9dc[_0x56dd4d], _0x11d852)\n                                _0x4c5aa5[_0x495609(0x36e)]['apply'](_0x4c5aa5, _0x98e9dc)\n                            }\n                        }\n                        return {\n                            element: _0x463258,\n                            finishers: _0x46b095,\n                            extras: _0x4c5aa5\n                        }\n                    },\n                    decorateConstructor: function (_0x2a4d32, _0x2666ea) {\n                        var _0x5e156c = _0x3fa41d\n                        for (\n                            var _0xb2f010 = [], _0x17b2e4 = _0x2666ea[_0x5e156c(0x259)] - (0x21c0 + -0xc8e * 0x2 + -0x8a3 * 0x1);\n                            _0x17b2e4 >= -0x1c70 + -0x1 * -0x1256 + -0x1af * -0x6;\n                            _0x17b2e4--\n                        ) {\n                            var _0x222759 = this[_0x5e156c(0x193)](_0x2a4d32),\n                                _0xc41f78 = this[_0x5e156c(0x324)]((0x1f46 + 0x81d * 0x2 + -0x5f * 0x80, _0x2666ea[_0x17b2e4])(_0x222759) || _0x222759)\n                            if (\n                                (void (0x1373 + 0x2b1 * -0x2 + -0x1 * 0xe11) !== _0xc41f78[_0x5e156c(0x2f4)] &&\n                                    _0xb2f010[_0x5e156c(0x36e)](_0xc41f78[_0x5e156c(0x2f4)]),\n                                    void (0x31 * -0xb5 + -0x11 * 0x67 + 0x84c * 0x5) !== _0xc41f78['elements'])\n                            ) {\n                                _0x2a4d32 = _0xc41f78[_0x5e156c(0x265)]\n                                for (\n                                    var _0x38c2da = -0x1 * -0xc12 + 0x7 * -0x28d + 0x5c9;\n                                    _0x38c2da < _0x2a4d32[_0x5e156c(0x259)] - (0x59f * 0x6 + -0x1 * -0x1c6d + 0x25 * -0x1ae);\n                                    _0x38c2da++\n                                )\n                                    for (var _0x2950ed = _0x38c2da + (0x1b91 * 0x1 + -0xbc0 + -0x8 * 0x1fa); _0x2950ed < _0x2a4d32['length']; _0x2950ed++)\n                                        if (\n                                            _0x2a4d32[_0x38c2da][_0x5e156c(0x392)] === _0x2a4d32[_0x2950ed][_0x5e156c(0x392)] &&\n                                            _0x2a4d32[_0x38c2da][_0x5e156c(0x215)] === _0x2a4d32[_0x2950ed][_0x5e156c(0x215)]\n                                        )\n                                            throw new TypeError(_0x5e156c(0x367) + _0x2a4d32[_0x38c2da][_0x5e156c(0x392)] + ')')\n                            }\n                        }\n                        return {\n                            elements: _0x2a4d32,\n                            finishers: _0xb2f010\n                        }\n                    },\n                    fromElementDescriptor: function (_0x4a43c8) {\n                        var _0x302152 = _0x3fa41d,\n                            _0x406d6b = {\n                                kind: _0x4a43c8[_0x302152(0x26f)],\n                                key: _0x4a43c8['key'],\n                                placement: _0x4a43c8['placement'],\n                                descriptor: _0x4a43c8[_0x302152(0x20f)]\n                            }\n                        return (\n                            Object[_0x302152(0x175)](_0x406d6b, Symbol[_0x302152(0x1c0)], {\n                                value: _0x302152(0x1e8),\n                                configurable: !(-0x1b3a + 0x21bb * 0x1 + -0x14d * 0x5)\n                            }),\n                            _0x302152(0x23c) === _0x4a43c8['kind'] && (_0x406d6b[_0x302152(0x2d0)] = _0x4a43c8['initializer']),\n                            _0x406d6b\n                        )\n                    },\n                    toElementDescriptors: function (_0x14be66) {\n                        if (void (0x1f48 + -0x19fe + 0x2a5 * -0x2) !== _0x14be66)\n                            return _0x5c885(_0x14be66)['map'](function (_0x170c20) {\n                                var _0x5285ee = w_0x25f3,\n                                    _0xf0c7ce = this[_0x5285ee(0x25e)](_0x170c20)\n                                return (\n                                    this['disallowProperty'](_0x170c20, _0x5285ee(0x2f4), _0x5285ee(0x21f)),\n                                    this[_0x5285ee(0x21a)](_0x170c20, _0x5285ee(0x3bc), _0x5285ee(0x21f)),\n                                    _0xf0c7ce\n                                )\n                            }, this)\n                    },\n                    toElementDescriptor: function (_0x4c8a60) {\n                        var _0x1fc4d7 = _0x3fa41d,\n                            _0x33cfb6 = String(_0x4c8a60[_0x1fc4d7(0x26f)])\n                        if (_0x1fc4d7(0x25a) !== _0x33cfb6 && _0x1fc4d7(0x23c) !== _0x33cfb6)\n                            throw new TypeError(\n                                'An\\x20element\\x20descriptor\\x27s\\x20.kind\\x20property\\x20must\\x20be\\x20either\\x20\\x22method\\x22\\x20or\\x20\\x22field\\x22,\\x20but\\x20a\\x20decorator\\x20created\\x20an\\x20element\\x20descriptor\\x20with\\x20.kind\\x20\\x22' +\n                                _0x33cfb6 +\n                                '\\x22'\n                            )\n                        var _0xebb768 = _0x32e885(_0x4c8a60[_0x1fc4d7(0x392)]),\n                            _0x52ab63 = String(_0x4c8a60[_0x1fc4d7(0x215)])\n                        if (_0x1fc4d7(0x396) !== _0x52ab63 && _0x1fc4d7(0x344) !== _0x52ab63 && _0x1fc4d7(0x235) !== _0x52ab63)\n                            throw new TypeError(_0x1fc4d7(0x2b5) + _0x52ab63 + '\\x22')\n                        var _0x33ee46 = _0x4c8a60[_0x1fc4d7(0x20f)]\n                        this[_0x1fc4d7(0x21a)](_0x4c8a60, 'elements', _0x1fc4d7(0x21f))\n                        var _0x1ca161 = {\n                            kind: _0x33cfb6,\n                            key: _0xebb768,\n                            placement: _0x52ab63,\n                            descriptor: Object[_0x1fc4d7(0x2a0)]({}, _0x33ee46)\n                        }\n                        return (\n                            _0x1fc4d7(0x23c) !== _0x33cfb6\n                                ? this[_0x1fc4d7(0x21a)](_0x4c8a60, _0x1fc4d7(0x2d0), _0x1fc4d7(0x28d))\n                                : (this['disallowProperty'](_0x33ee46, _0x1fc4d7(0x32b), _0x1fc4d7(0x277)),\n                                    this['disallowProperty'](_0x33ee46, 'set', _0x1fc4d7(0x277)),\n                                    this['disallowProperty'](_0x33ee46, _0x1fc4d7(0x2e4), _0x1fc4d7(0x277)),\n                                    (_0x1ca161['initializer'] = _0x4c8a60[_0x1fc4d7(0x2d0)])),\n                            _0x1ca161\n                        )\n                    },\n                    toElementFinisherExtras: function (_0x53b840) {\n                        var _0x1157c0 = _0x3fa41d\n                        return {\n                            element: this[_0x1157c0(0x25e)](_0x53b840),\n                            finisher: _0x22df7b(_0x53b840, _0x1157c0(0x2f4)),\n                            extras: this[_0x1157c0(0x370)](_0x53b840['extras'])\n                        }\n                    },\n                    fromClassDescriptor: function (_0x30c308) {\n                        var _0x482b04 = _0x3fa41d,\n                            _0xf231c1 = {\n                                kind: _0x482b04(0x19c),\n                                elements: _0x30c308['map'](this[_0x482b04(0x372)], this)\n                            }\n                        return (\n                            Object[_0x482b04(0x175)](_0xf231c1, Symbol[_0x482b04(0x1c0)], {\n                                value: _0x482b04(0x1e8),\n                                configurable: !(0xf * -0xf1 + 0x1 * -0xcfe + -0x1b1d * -0x1)\n                            }),\n                            _0xf231c1\n                        )\n                    },\n                    toClassDescriptor: function (_0x178ca0) {\n                        var _0x2520a1 = _0x3fa41d,\n                            _0x79f336 = String(_0x178ca0[_0x2520a1(0x26f)])\n                        if ('class' !== _0x79f336)\n                            throw new TypeError(\n                                'A\\x20class\\x20descriptor\\x27s\\x20.kind\\x20property\\x20must\\x20be\\x20\\x22class\\x22,\\x20but\\x20a\\x20decorator\\x20created\\x20a\\x20class\\x20descriptor\\x20with\\x20.kind\\x20\\x22' +\n                                _0x79f336 +\n                                '\\x22'\n                            )\n                        this['disallowProperty'](_0x178ca0, _0x2520a1(0x392), 'A\\x20class\\x20descriptor'),\n                            this[_0x2520a1(0x21a)](_0x178ca0, _0x2520a1(0x215), 'A\\x20class\\x20descriptor'),\n                            this[_0x2520a1(0x21a)](_0x178ca0, _0x2520a1(0x20f), _0x2520a1(0x1a1)),\n                            this['disallowProperty'](_0x178ca0, 'initializer', _0x2520a1(0x1a1)),\n                            this[_0x2520a1(0x21a)](_0x178ca0, _0x2520a1(0x3bc), 'A\\x20class\\x20descriptor')\n                        var _0x154e32 = _0x22df7b(_0x178ca0, _0x2520a1(0x2f4))\n                        return {\n                            elements: this['toElementDescriptors'](_0x178ca0['elements']),\n                            finisher: _0x154e32\n                        }\n                    },\n                    runClassFinishers: function (_0x58401c, _0x3ff489) {\n                        var _0x4a8de1 = _0x3fa41d\n                        for (var _0x5ec766 = 0x13b0 + -0xe05 + 0x1 * -0x5ab; _0x5ec766 < _0x3ff489[_0x4a8de1(0x259)]; _0x5ec766++) {\n                            var _0x176fd2 = (0x7d * -0x25 + 0x101 * 0x14 + 0x5 * -0x67, _0x3ff489[_0x5ec766])(_0x58401c)\n                            if (void (-0x1 * 0x200 + 0x1c4a + -0x1a4a) !== _0x176fd2) {\n                                if (_0x4a8de1(0x1ee) != typeof _0x176fd2) throw new TypeError('Finishers\\x20must\\x20return\\x20a\\x20constructor.')\n                                _0x58401c = _0x176fd2\n                            }\n                        }\n                        return _0x58401c\n                    },\n                    disallowProperty: function (_0x376492, _0x1998df, _0x46cda4) {\n                        var _0x5b24b6 = _0x3fa41d\n                        if (void (0x2239 + -0xa67 + -0x17d2) !== _0x376492[_0x1998df])\n                            throw new TypeError(_0x46cda4 + _0x5b24b6(0x232) + _0x1998df + _0x5b24b6(0x2a1))\n                    }\n                }\n                return _0x513b0e\n            }\n\n            function _0x210308(_0x5bae0) {\n                var _0x509268 = _0x5612de,\n                    _0x2061f6,\n                    _0x1daa96 = _0x32e885(_0x5bae0['key'])\n                _0x509268(0x25a) === _0x5bae0[_0x509268(0x26f)]\n                    ? (_0x2061f6 = {\n                        value: _0x5bae0[_0x509268(0x2e4)],\n                        writable: !(-0x286 + -0x3 * -0x83b + -0x162b),\n                        configurable: !(-0x1 * -0x13f9 + -0x2 * -0x1127 + -0x3647),\n                        enumerable: !(-0x210 * -0x1 + 0xf43 * -0x2 + 0x1c77)\n                    })\n                    : _0x509268(0x32b) === _0x5bae0[_0x509268(0x26f)]\n                        ? (_0x2061f6 = {\n                            get: _0x5bae0['value'],\n                            configurable: !(-0x4 * -0x87 + 0x25b6 + -0x13e9 * 0x2),\n                            enumerable: !(0x4 * -0x105 + -0x8 * 0x3b + 0x5ed * 0x1)\n                        })\n                        : 'set' === _0x5bae0[_0x509268(0x26f)]\n                            ? (_0x2061f6 = {\n                                set: _0x5bae0[_0x509268(0x2e4)],\n                                configurable: !(-0x1 * -0xd7c + 0x24e2 + -0x325e),\n                                enumerable: !(0x246b * -0x1 + -0xbdc + 0x67 * 0x78)\n                            })\n                            : _0x509268(0x23c) === _0x5bae0['kind'] &&\n                            (_0x2061f6 = {\n                                configurable: !(-0x7 * 0x7c + 0x0 + -0x1 * -0x364),\n                                writable: !(0x10cc + 0x93a + -0x1a06),\n                                enumerable: !(-0x339 + -0xfd1 * -0x1 + -0xc98)\n                            })\n                var _0x12b911 = {\n                    kind: _0x509268(0x23c) === _0x5bae0[_0x509268(0x26f)] ? _0x509268(0x23c) : 'method',\n                    key: _0x1daa96,\n                    placement: _0x5bae0[_0x509268(0x396)] ? _0x509268(0x396) : 'field' === _0x5bae0[_0x509268(0x26f)] ? 'own' : _0x509268(0x344),\n                    descriptor: _0x2061f6\n                }\n                return (\n                    _0x5bae0['decorators'] && (_0x12b911[_0x509268(0x1b7)] = _0x5bae0[_0x509268(0x1b7)]),\n                    _0x509268(0x23c) === _0x5bae0['kind'] && (_0x12b911['initializer'] = _0x5bae0[_0x509268(0x2e4)]),\n                    _0x12b911\n                )\n            }\n\n            function _0x3b2c5d(_0x1d2cd7, _0x5043bf) {\n                var _0x6af88f = _0x5612de\n                void (-0x1c1e + -0x19 * -0xd9 + -0x1 * -0x6ed) !== _0x1d2cd7[_0x6af88f(0x20f)][_0x6af88f(0x32b)]\n                    ? (_0x5043bf['descriptor'][_0x6af88f(0x32b)] = _0x1d2cd7['descriptor'][_0x6af88f(0x32b)])\n                    : (_0x5043bf['descriptor']['set'] = _0x1d2cd7[_0x6af88f(0x20f)][_0x6af88f(0x1e4)])\n            }\n\n            function _0x872852(_0x11fd7b) {\n                var _0x45b70e = _0x5612de\n                for (\n                    var _0x3d0947 = [],\n                    _0x1e20eb = function (_0x3c1862) {\n                        var _0x56210d = w_0x25f3\n                        return (\n                            _0x56210d(0x25a) === _0x3c1862[_0x56210d(0x26f)] &&\n                            _0x3c1862[_0x56210d(0x392)] === _0x44502e['key'] &&\n                            _0x3c1862[_0x56210d(0x215)] === _0x44502e[_0x56210d(0x215)]\n                        )\n                    },\n                    _0x2773ae = -0xdd7 + 0x5 * 0x3f6 + 0x5f7 * -0x1;\n                    _0x2773ae < _0x11fd7b[_0x45b70e(0x259)];\n                    _0x2773ae++\n                ) {\n                    var _0x152571,\n                        _0x44502e = _0x11fd7b[_0x2773ae]\n                    if (_0x45b70e(0x25a) === _0x44502e[_0x45b70e(0x26f)] && (_0x152571 = _0x3d0947['find'](_0x1e20eb))) {\n                        if (_0x3f9244(_0x44502e[_0x45b70e(0x20f)]) || _0x3f9244(_0x152571[_0x45b70e(0x20f)])) {\n                            if (_0x51f3b5(_0x44502e) || _0x51f3b5(_0x152571))\n                                throw new ReferenceError('Duplicated\\x20methods\\x20(' + _0x44502e[_0x45b70e(0x392)] + _0x45b70e(0x20b))\n                            _0x152571[_0x45b70e(0x20f)] = _0x44502e[_0x45b70e(0x20f)]\n                        } else {\n                            if (_0x51f3b5(_0x44502e)) {\n                                if (_0x51f3b5(_0x152571))\n                                    throw new ReferenceError(\n                                        'Decorators\\x20can\\x27t\\x20be\\x20placed\\x20on\\x20different\\x20accessors\\x20with\\x20for\\x20the\\x20same\\x20property\\x20(' +\n                                        _0x44502e['key'] +\n                                        ').'\n                                    )\n                                _0x152571[_0x45b70e(0x1b7)] = _0x44502e[_0x45b70e(0x1b7)]\n                            }\n                            _0x3b2c5d(_0x44502e, _0x152571)\n                        }\n                    } else _0x3d0947[_0x45b70e(0x36e)](_0x44502e)\n                }\n                return _0x3d0947\n            }\n\n            function _0x51f3b5(_0x3b7753) {\n                var _0x46d225 = _0x5612de\n                return _0x3b7753[_0x46d225(0x1b7)] && _0x3b7753['decorators']['length']\n            }\n\n            function _0x3f9244(_0x197382) {\n                var _0x1ec41e = _0x5612de\n                return (\n                    void (0xa8 + 0x12a * -0x4 + 0x400) !== _0x197382 &&\n                    !(\n                        void (-0x2 * -0x955 + -0x965 + -0x945) === _0x197382[_0x1ec41e(0x2e4)] &&\n                        void (-0x403 + 0xd * 0x1e2 + -0x1477) === _0x197382[_0x1ec41e(0x2e3)]\n                    )\n                )\n            }\n\n            function _0x22df7b(_0x1a9e0b, _0x4c3aa6) {\n                var _0x2004a6 = _0x5612de,\n                    _0x42d7e1 = _0x1a9e0b[_0x4c3aa6]\n                if (void (-0x1ab * -0x11 + -0x2164 + 0x1 * 0x509) !== _0x42d7e1 && _0x2004a6(0x1ee) != typeof _0x42d7e1)\n                    throw new TypeError('Expected\\x20\\x27' + _0x4c3aa6 + _0x2004a6(0x200))\n                return _0x42d7e1\n            }\n\n            function _0x44a779(_0x290bd9, _0x3c4184, _0x356c04) {\n                var _0x5e1d0b = _0x5612de\n                if (!_0x3c4184[_0x5e1d0b(0x2fc)](_0x290bd9)) throw new TypeError(_0x5e1d0b(0x187))\n                return _0x356c04\n            }\n\n            function _0x227cd9(_0x44aab6, _0x47792b) {\n                var _0x50e6e8 = _0x5612de\n                if (_0x47792b[_0x50e6e8(0x2fc)](_0x44aab6))\n                    throw new TypeError('Cannot\\x20initialize\\x20the\\x20same\\x20private\\x20elements\\x20twice\\x20on\\x20an\\x20object')\n            }\n\n            function _0x41d2eb(_0x2d54de, _0x30b42b, _0x3cc210) {\n                _0x227cd9(_0x2d54de, _0x30b42b), _0x30b42b['set'](_0x2d54de, _0x3cc210)\n            }\n\n            function _0x4fd04a(_0x1b36b3, _0x1a6559) {\n                var _0x1aaac6 = _0x5612de\n                _0x227cd9(_0x1b36b3, _0x1a6559), _0x1a6559[_0x1aaac6(0x332)](_0x1b36b3)\n            }\n\n            function _0x4fb313() {\n                throw new TypeError('attempted\\x20to\\x20reassign\\x20private\\x20method')\n            }\n\n            function _0x4e4f66(_0x9f7990) {\n                return _0x9f7990\n            }\n\n            _0x5612de(0x1ee) != typeof Object[_0x5612de(0x2a0)] &&\n                Object['defineProperty'](Object, _0x5612de(0x2a0), {\n                    value: function (_0x478fa2, _0x273756) {\n                        var _0x2b8676 = _0x5612de\n                        if (null == _0x478fa2) throw new TypeError(_0x2b8676(0x2cf))\n                        for (\n                            var _0x451cfb = Object(_0x478fa2), _0x5c5079 = -0xb5d + -0x15f0 + 0x214e;\n                            _0x5c5079 < arguments[_0x2b8676(0x259)];\n                            _0x5c5079++\n                        ) {\n                            var _0x3059a4 = arguments[_0x5c5079]\n                            if (null != _0x3059a4) {\n                                for (var _0x3ede90 in _0x3059a4)\n                                    Object[_0x2b8676(0x344)][_0x2b8676(0x3b8)][_0x2b8676(0x334)](_0x3059a4, _0x3ede90) &&\n                                        (_0x451cfb[_0x3ede90] = _0x3059a4[_0x3ede90])\n                            }\n                        }\n                        return _0x451cfb\n                    },\n                    writable: !(0x3d * -0x43 + 0x2368 + -0x1371),\n                    configurable: !(0x12a + -0x1692 + 0x1568)\n                }),\n                Object[_0x5612de(0x17f)] ||\n                (Object['keys'] =\n                    ((_0x4d6c78 = Object[_0x5612de(0x344)][_0x5612de(0x3b8)]),\n                        (_0x312e19 = !{\n                            toString: null\n                        }[_0x5612de(0x1da)]('toString')),\n                        (_0x2a32a1 = [\n                            _0x5612de(0x3ae),\n                            _0x5612de(0x2c8),\n                            _0x5612de(0x303),\n                            _0x5612de(0x3b8),\n                            'isPrototypeOf',\n                            _0x5612de(0x1da),\n                            'constructor'\n                        ]),\n                        (_0x371ac2 = _0x2a32a1[_0x5612de(0x259)]),\n                        function (_0x457a19) {\n                            var _0x2d3152 = _0x5612de\n                            if (_0x2d3152(0x1ee) != typeof _0x457a19 && (_0x2d3152(0x17d) !== _0x1db123(_0x457a19) || null === _0x457a19))\n                                throw new TypeError(_0x2d3152(0x374))\n                            var _0x11aef0,\n                                _0x29131e,\n                                _0x4c2a63 = []\n                            for (_0x11aef0 in _0x457a19) _0x4d6c78[_0x2d3152(0x334)](_0x457a19, _0x11aef0) && _0x4c2a63[_0x2d3152(0x36e)](_0x11aef0)\n                            if (_0x312e19) {\n                                for (_0x29131e = -0x2406 + -0x1209 + 0x1 * 0x360f; _0x29131e < _0x371ac2; _0x29131e++)\n                                    _0x4d6c78['call'](_0x457a19, _0x2a32a1[_0x29131e]) && _0x4c2a63[_0x2d3152(0x36e)](_0x2a32a1[_0x29131e])\n                            }\n                            return _0x4c2a63\n                        }))\n            var _0x45b94b = {\n                __version__: _0x5612de(0x167),\n                feVersion: 0x2,\n                domNotValid: !(-0x1e27 + -0x3fa * -0x2 + 0x1634),\n                refererKey: _0x5612de(0x318),\n                pushVersion: _0x5612de(0x2ca),\n                secInfoHeader: _0x5612de(0x248)\n            }\n\n            function _0x598972(_0x215b45, _0x2d7329) {\n                var _0x401595 = _0x5612de\n                if (_0x401595(0x33c) == typeof _0x2d7329)\n                    for (\n                        var _0x5d92d9,\n                        _0x112fe4 = _0x215b45 + '=',\n                        _0x28aeed = _0x2d7329[_0x401595(0x342)](/[;&]/),\n                        _0x26307f = 0x11 * -0x97 + 0x126 * -0xd + -0x1 * -0x18f5;\n                        _0x26307f < _0x28aeed[_0x401595(0x259)];\n                        _0x26307f++\n                    ) {\n                        for (_0x5d92d9 = _0x28aeed[_0x26307f]; '\\x20' === _0x5d92d9['charAt'](0x1589 + 0x5e4 + 0x7 * -0x3eb);)\n                            _0x5d92d9 = _0x5d92d9[_0x401595(0x1b0)](-0x16d9 + -0x1 * 0x99c + 0x2 * 0x103b, _0x5d92d9['length'])\n                        if (0x15cd + -0x1235 + 0x1 * -0x398 === _0x5d92d9[_0x401595(0x2c5)](_0x112fe4))\n                            return _0x5d92d9[_0x401595(0x1b0)](_0x112fe4[_0x401595(0x259)], _0x5d92d9[_0x401595(0x259)])\n                    }\n            }\n\n            function _0x24dc34(_0x3e96bb) {\n                var _0x22cc3b = _0x5612de\n                try {\n                    var _0xdacad4 = ''\n                    return (window['sessionStorage'] && (_0xdacad4 = window['sessionStorage'][_0x22cc3b(0x2d8)](_0x3e96bb))) ||\n                        (window[_0x22cc3b(0x1dc)] && (_0xdacad4 = window[_0x22cc3b(0x1dc)][_0x22cc3b(0x2d8)](_0x3e96bb)))\n                        ? _0xdacad4\n                        : (_0xdacad4 = _0x598972(_0x3e96bb, document['cookie']))\n                } catch (_0x195c1d) {\n                    return ''\n                }\n            }\n\n            function _0x1f42cb(_0x247ee6, _0x28501b) {\n                var _0xfed486 = _0x5612de\n                try {\n                    window[_0xfed486(0x3be)] && window['sessionStorage']['setItem'](_0x247ee6, _0x28501b),\n                        window[_0xfed486(0x1dc)] && window[_0xfed486(0x1dc)][_0xfed486(0x1c4)](_0x247ee6, _0x28501b),\n                        ((document[_0xfed486(0x272)] = _0x247ee6 + _0xfed486(0x35e)),\n                            (document[_0xfed486(0x272)] =\n                                _0x247ee6 +\n                                '=' +\n                                _0x28501b +\n                                _0xfed486(0x1c1) +\n                                new Date(new Date()['getTime']() + (0x10 * 0x792317 + 0x37870478 + -0x2 * 0xd8658f4))[_0xfed486(0x15e)]() +\n                                _0xfed486(0x3c1)))\n                } catch (_0x2bd822) { }\n            }\n\n            function _0x2ecc5a(_0x5893e4) {\n                var _0x3a0d7f = _0x5612de\n                try {\n                    window[_0x3a0d7f(0x3be)] && window['sessionStorage']['removeItem'](_0x5893e4),\n                        window[_0x3a0d7f(0x1dc)] && window[_0x3a0d7f(0x1dc)][_0x3a0d7f(0x2c3)](_0x5893e4),\n                        (document[_0x3a0d7f(0x272)] = _0x5893e4 + _0x3a0d7f(0x35e))\n                } catch (_0x2f5b70) { }\n            }\n\n            for (\n                var _0x462335 = {\n                    boe: !(0x1e0d + -0x1093 * 0x1 + -0xd79),\n                    aid: 0x0,\n                    dfp: !(-0x1 * 0x703 + 0x1025 + 0x29 * -0x39),\n                    sdi: !(0x49 * -0x77 + -0x6da * 0x2 + -0x4 * -0xbe9),\n                    enablePathList: [],\n                    _enablePathListRegex: [],\n                    urlRewriteRules: [],\n                    _urlRewriteRules: [],\n                    initialized: !(-0x31 * 0x3d + 0x9df + 0x1cf),\n                    enableTrack: !(0x89 * -0x1a + -0x21ca + 0x2fb5),\n                    track: {\n                        unitTime: 0x0,\n                        unitAmount: 0x0,\n                        fre: 0x0\n                    },\n                    triggerUnload: !(-0x3e5 * -0x5 + -0x23cb + 0x3 * 0x571),\n                    region: '',\n                    regionConf: {},\n                    umode: 0x0,\n                    v: !(-0x1155 + -0x25d4 + -0x1 * -0x372a),\n                    _enableSignature: [],\n                    perf: !(0x1 * -0x1c2e + 0xef8 + -0xc7 * -0x11),\n                    xxbg: !(-0xf75 + 0x3 * 0x4e5 + 0x12 * 0xb)\n                },\n                _0x3d40ff = {\n                    debug: function (_0x2cf151, _0x4acfb1) {\n                        var _0x1b6639 = _0x5612de\n                        _0x462335[_0x1b6639(0x1b6)]\n                    }\n                },\n                _0x100715 = _0x5612de(0x2d7)[_0x5612de(0x342)](''),\n                _0x1f510e = [],\n                _0x37750d = [],\n                _0x1cb307 = -0xe55 + 0x1c37 + 0x2 * -0x6f1;\n                _0x1cb307 < 0x241b + 0x10 * -0xe6 + -0x1 * 0x14bb;\n                _0x1cb307++\n            )\n                (_0x1f510e[_0x1cb307] =\n                    _0x100715[(_0x1cb307 >> (0xd03 + -0x269a + 0x1 * 0x199b)) & (0xa64 * 0x3 + -0xf7b + -0xfa2)] +\n                    _0x100715[(0x2bb + -0x3 * 0x92d + 0x18db) & _0x1cb307]),\n                    _0x1cb307 < -0x1 * -0x82 + 0x34 * -0x3b + -0x2 * -0x5c5 &&\n                    (_0x1cb307 < 0x10f1 * 0x1 + 0x86a * 0x4 + -0x328f\n                        ? (_0x37750d[-0x2029 + -0x1ef1 + -0x3f4a * -0x1 + _0x1cb307] = _0x1cb307)\n                        : (_0x37750d[-0x2485 + 0x1d * 0x6d + 0x1883 + _0x1cb307] = _0x1cb307))\n            var _0x55de18 = function (_0x33a277) {\n                var _0x5155ba = _0x5612de\n                for (var _0x9eb2a1 = _0x33a277[_0x5155ba(0x259)], _0x1edfde = '', _0x2a69c4 = -0x1c39 + 0x569 + 0x16d0; _0x2a69c4 < _0x9eb2a1;)\n                    _0x1edfde += _0x1f510e[_0x33a277[_0x2a69c4++]]\n                return _0x1edfde\n            },\n                _0x655940 = function (_0x177456) {\n                    for (\n                        var _0x1ffb9c = _0x177456['length'] >> (0x1 * 0x104b + 0x10b1 + -0x20fb),\n                        _0x3563ef = _0x1ffb9c << (-0x1 * -0x263 + -0x77 * -0x21 + 0xd * -0x15d),\n                        _0x22520c = new Uint8Array(_0x1ffb9c),\n                        _0x32553 = 0x345 * 0x9 + -0x1e9a + -0x1 * -0x12d,\n                        _0x11b847 = 0x1 * 0x623 + -0x239f * -0x1 + -0x29c2;\n                        _0x11b847 < _0x3563ef;\n\n                    )\n                        _0x22520c[_0x32553++] =\n                            (_0x37750d[_0x177456['charCodeAt'](_0x11b847++)] << (-0x1551 + -0xb5a + 0x20af * 0x1)) |\n                            _0x37750d[_0x177456['charCodeAt'](_0x11b847++)]\n                    return _0x22520c\n                },\n                _0x42e709 = {\n                    encode: _0x55de18,\n                    decode: _0x655940\n                },\n                _0x1e7721 =\n                    _0x5612de(0x384) != typeof globalThis\n                        ? globalThis\n                        : _0x5612de(0x384) != typeof window\n                            ? window\n                            : _0x5612de(0x384) != typeof global\n                                ? global\n                                : 'undefined' != typeof self\n                                    ? self\n                                    : {}\n\n            function _0x3bc8d3(_0x14565d) {\n                var _0x442e14 = _0x5612de\n                return _0x14565d &&\n                    _0x14565d[_0x442e14(0x3bd)] &&\n                    Object[_0x442e14(0x344)][_0x442e14(0x3b8)][_0x442e14(0x334)](_0x14565d, _0x442e14(0x1d3))\n                    ? _0x14565d[_0x442e14(0x1d3)]\n                    : _0x14565d\n            }\n\n            function _0x3abc0b(_0x1ca7bd) {\n                var _0x292845 = _0x5612de\n                return _0x1ca7bd && Object[_0x292845(0x344)]['hasOwnProperty'][_0x292845(0x334)](_0x1ca7bd, _0x292845(0x1d3))\n                    ? _0x1ca7bd[_0x292845(0x1d3)]\n                    : _0x1ca7bd\n            }\n\n            function _0x41ace1(_0x2b7455) {\n                var _0x39470d = _0x5612de\n                return _0x2b7455 &&\n                    Object[_0x39470d(0x344)][_0x39470d(0x3b8)]['call'](_0x2b7455, _0x39470d(0x1d3)) &&\n                    0x155 + 0x16f8 + -0x184c === Object[_0x39470d(0x17f)](_0x2b7455)[_0x39470d(0x259)]\n                    ? _0x2b7455[_0x39470d(0x1d3)]\n                    : _0x2b7455\n            }\n\n            function _0x3e9554(_0x22797e) {\n                var _0x1fa97f = _0x5612de\n                if (_0x22797e[_0x1fa97f(0x3bd)]) return _0x22797e\n                var _0x21d08f = Object[_0x1fa97f(0x175)]({}, _0x1fa97f(0x3bd), {\n                    value: !(0x1f82 + -0x10d * 0x1d + 0x5 * -0x35)\n                })\n                return (\n                    Object[_0x1fa97f(0x17f)](_0x22797e)['forEach'](function (_0x19f7e0) {\n                        var _0x1f5a81 = _0x1fa97f,\n                            _0x3cf185 = Object[_0x1f5a81(0x2a6)](_0x22797e, _0x19f7e0)\n                        Object['defineProperty'](\n                            _0x21d08f,\n                            _0x19f7e0,\n                            _0x3cf185[_0x1f5a81(0x32b)]\n                                ? _0x3cf185\n                                : {\n                                    enumerable: !(-0x222 * -0x8 + 0x1 * -0x21ac + 0x84e * 0x2),\n                                    get: function () {\n                                        return _0x22797e[_0x19f7e0]\n                                    }\n                                }\n                        )\n                    }),\n                    _0x21d08f\n                )\n            }\n\n            function _0x56409e(_0x362d96) {\n                var _0x265452 = _0x5612de,\n                    _0x5870ef = {\n                        exports: {}\n                    }\n                return _0x362d96(_0x5870ef, _0x5870ef[_0x265452(0x1b8)]), _0x5870ef['exports']\n            }\n\n            function _0x171dc9(_0x5983b9) {\n                var _0x32782f = _0x5612de\n                throw new Error(_0x32782f(0x36d) + _0x5983b9 + _0x32782f(0x357))\n            }\n\n            var _0x90795 = _0x56409e(function (_0xb9c7d1) {\n                !(function () {\n                    var _0x2db296 = w_0x25f3,\n                        _0x1f977a = 'input\\x20is\\x20invalid\\x20type',\n                        _0x5a87b4 = _0x2db296(0x17d) == typeof window,\n                        _0x11d177 = _0x5a87b4 ? window : {}\n                    _0x11d177[_0x2db296(0x37a)] && (_0x5a87b4 = !(-0x15c4 + 0x97d * -0x2 + 0xb7 * 0x39))\n                    var _0x387fd8 = !_0x5a87b4 && _0x2db296(0x17d) == typeof self,\n                        _0x2e1226 =\n                            !_0x11d177[_0x2db296(0x216)] &&\n                            _0x2db296(0x17d) == typeof process &&\n                            process[_0x2db296(0x194)] &&\n                            process[_0x2db296(0x194)][_0x2db296(0x287)]\n                    _0x2e1226 ? (_0x11d177 = _0x1e7721) : _0x387fd8 && (_0x11d177 = self)\n                    var _0x299a21 = !_0x11d177['JS_MD5_NO_COMMON_JS'] && _0xb9c7d1[_0x2db296(0x1b8)],\n                        _0x5efc8f = !(-0x8c4 + -0xc3a + -0x1 * -0x14ff),\n                        _0x1edc95 = !_0x11d177[_0x2db296(0x2e6)] && 'undefined' != typeof ArrayBuffer,\n                        _0x142491 = _0x2db296(0x2d7)[_0x2db296(0x342)](''),\n                        _0x146907 = [\n                            0x148 * 0x5 + -0x753 * 0x2 + -0x175 * -0x6,\n                            0x1 * 0x340b + 0x460a + 0x1f9 * 0x3,\n                            0x2766cb + -0x6327ac + 0x353 * 0x387b,\n                            -(-0xc13e2aae + -0x3aff8440 + 0x17c3daeee)\n                        ],\n                        _0x4d13bd = [\n                            -0x1721 + -0x1 * 0x611 + 0x1d32,\n                            -0x390 + -0x3a5 * -0x3 + -0x757,\n                            0x5fc + -0x64d * -0x2 + -0x1286,\n                            0x278 + 0x3 * 0x105 + -0x56f\n                        ],\n                        _0x3f581b = [_0x2db296(0x352), _0x2db296(0x238), _0x2db296(0x19b), _0x2db296(0x275), 'arrayBuffer', _0x2db296(0x25f)],\n                        _0xcb4d61 = _0x2db296(0x315)[_0x2db296(0x342)](''),\n                        _0x5c5e45 = [],\n                        _0x54b265\n                    if (_0x1edc95) {\n                        var _0x171107 = new ArrayBuffer(0xc87 + -0xcd8 + 0x95)\n                            ; (_0x54b265 = new Uint8Array(_0x171107)), (_0x5c5e45 = new Uint32Array(_0x171107))\n                    }\n                    ; (!_0x11d177[_0x2db296(0x216)] && Array[_0x2db296(0x2af)]) ||\n                        (Array['isArray'] = function (_0x263669) {\n                            var _0x1dd8cd = _0x2db296\n                            return _0x1dd8cd(0x331) === Object['prototype']['toString']['call'](_0x263669)\n                        }),\n                        !_0x1edc95 ||\n                        (!_0x11d177[_0x2db296(0x305)] && ArrayBuffer['isView']) ||\n                        (ArrayBuffer['isView'] = function (_0x4d052f) {\n                            var _0x23ceed = _0x2db296\n                            return (\n                                _0x23ceed(0x17d) == typeof _0x4d052f &&\n                                _0x4d052f[_0x23ceed(0x275)] &&\n                                _0x4d052f['buffer'][_0x23ceed(0x2ac)] === ArrayBuffer\n                            )\n                        })\n                    var _0x2e393f = function (_0x55b71b) {\n                        return function (_0x6901ec) {\n                            var _0x38b178 = w_0x25f3\n                            return new _0x22f902(!(0x191d + 0x9e + -0x19bb))[_0x38b178(0x2d5)](_0x6901ec)[_0x55b71b]()\n                        }\n                    },\n                        _0x1edabb = function () {\n                            var _0x5664ca = _0x2db296,\n                                _0x4c275f = _0x2e393f(_0x5664ca(0x352))\n                            _0x2e1226 && (_0x4c275f = _0x4d7e2d(_0x4c275f)),\n                                (_0x4c275f[_0x5664ca(0x3b7)] = function () {\n                                    return new _0x22f902()\n                                }),\n                                (_0x4c275f['update'] = function (_0x5c3464) {\n                                    return _0x4c275f['create']()['update'](_0x5c3464)\n                                })\n                            for (var _0x349d5f = -0x9d * -0x1f + 0x1 * 0x230c + -0x15 * 0x293; _0x349d5f < _0x3f581b[_0x5664ca(0x259)]; ++_0x349d5f) {\n                                var _0x1537c4 = _0x3f581b[_0x349d5f]\n                                _0x4c275f[_0x1537c4] = _0x2e393f(_0x1537c4)\n                            }\n                            return _0x4c275f\n                        },\n                        _0x4d7e2d = function (_0x1afe1b) {\n                            var _0x3e0a6e = eval('var _0x13db80 = w_0x25f3;require(_0x13db80(628));'),\n                                _0x5bfe7e = eval(\"var _0x20dc8b = w_0x25f3;require('buffer')[_0x20dc8b(424)];\"),\n                                _0x3d7396 = function (_0x5142ff) {\n                                    var _0x30639a = w_0x25f3\n                                    if (_0x30639a(0x33c) == typeof _0x5142ff)\n                                        return _0x3e0a6e[_0x30639a(0x1ca)](_0x30639a(0x35c))\n                                        [_0x30639a(0x2d5)](_0x5142ff, _0x30639a(0x2a8))\n                                        [_0x30639a(0x19b)](_0x30639a(0x352))\n                                    if (null == _0x5142ff) throw _0x1f977a\n                                    return (\n                                        _0x5142ff[_0x30639a(0x2ac)] === ArrayBuffer && (_0x5142ff = new Uint8Array(_0x5142ff)),\n                                        Array[_0x30639a(0x2af)](_0x5142ff) ||\n                                            ArrayBuffer[_0x30639a(0x2c7)](_0x5142ff) ||\n                                            _0x5142ff[_0x30639a(0x2ac)] === _0x5bfe7e\n                                            ? _0x3e0a6e[_0x30639a(0x1ca)](_0x30639a(0x35c))\n                                            ['update'](new _0x5bfe7e(_0x5142ff))\n                                            [_0x30639a(0x19b)](_0x30639a(0x352))\n                                            : _0x1afe1b(_0x5142ff)\n                                    )\n                                }\n                            return _0x3d7396\n                        }\n\n                    function _0x22f902(_0xad0da7) {\n                        var _0x68ef08 = _0x2db296\n                        if (_0xad0da7)\n                            (_0x5c5e45[-0x1b4c * 0x1 + -0x126b * 0x2 + 0x4022] =\n                                _0x5c5e45[0x143f + -0x2217 + 0xde8] =\n                                _0x5c5e45[0x16 * 0x2e + -0x1d7c + 0x1989] =\n                                _0x5c5e45[0xa0 * -0x26 + -0x3 * 0x93f + 0x337f * 0x1] =\n                                _0x5c5e45[-0xed2 + 0xe1d + 0x2e * 0x4] =\n                                _0x5c5e45[-0x10ff + -0x1 * -0x394 + 0xd6f] =\n                                _0x5c5e45[-0x36f * -0x2 + 0x1 * 0x1a5 + -0x87e] =\n                                _0x5c5e45[-0x1f81 * 0x1 + 0x25ce * -0x1 + -0x1 * -0x4555] =\n                                _0x5c5e45[0x1ae7 * 0x1 + 0x1 * -0xe3c + -0xca4 * 0x1] =\n                                _0x5c5e45[-0x583 * -0x4 + -0x5f7 * -0x5 + -0x33d7] =\n                                _0x5c5e45[0x25e + -0x1d4b * 0x1 + -0x3a * -0x77] =\n                                _0x5c5e45[0xef9 + -0x30 * -0x57 + -0x1f3f] =\n                                _0x5c5e45[0x11e + -0x18f * 0x7 + 0x9d6] =\n                                _0x5c5e45[-0x2521 * -0x1 + 0x1 * 0x1bf4 + 0x4109 * -0x1] =\n                                _0x5c5e45[0x19 * 0xa6 + 0x1f06 + -0x2f2f] =\n                                _0x5c5e45[-0x22d0 + 0x1f1 * 0xf + 0x5bf] =\n                                _0x5c5e45[0x7 * 0x549 + -0xa39 + 0x1 * -0x1ab7] =\n                                0x1 * -0xfb + 0x1995 + 0xc4d * -0x2),\n                                (this['blocks'] = _0x5c5e45),\n                                (this[_0x68ef08(0x329)] = _0x54b265)\n                        else {\n                            if (_0x1edc95) {\n                                var _0x44d65b = new ArrayBuffer(0x11 * -0xb + 0xbfd + -0xafe)\n                                    ; (this[_0x68ef08(0x329)] = new Uint8Array(_0x44d65b)), (this[_0x68ef08(0x319)] = new Uint32Array(_0x44d65b))\n                            } else\n                                this[_0x68ef08(0x319)] = [\n                                    0x45 * 0x10 + -0xd15 + 0x8c5,\n                                    0x1d70 + 0x493 + -0x2203 * 0x1,\n                                    0x46 * 0x86 + 0x8 * -0x14e + -0x1a34,\n                                    0x9bb + 0x25 * 0xdf + -0x29f6,\n                                    -0x1c * -0xda + 0x188 + 0xcb * -0x20,\n                                    -0x442 + -0x199a + 0x1ddc,\n                                    -0x2 * -0x32d + -0x605 * -0x2 + -0x1264,\n                                    0x1af * -0x8 + -0xf3c + 0x29c * 0xb,\n                                    -0x8cc + 0x1c3 + 0x709 * 0x1,\n                                    0xb53 * 0x1 + 0x18e6 + -0x3 * 0xc13,\n                                    -0x2 * 0x135e + 0x444 + 0x2278,\n                                    0xe8 * 0x2b + 0x2106 + -0xa * 0x733,\n                                    0x3 * 0x449 + 0x1103 + -0x1dde,\n                                    0x30 + -0x3 * -0x95 + -0x1ef,\n                                    0x3ca * -0x3 + -0x9 * -0x1cb + -0x3 * 0x197,\n                                    -0x14ce + -0x1b9 + 0x1687,\n                                    -0xb2f + -0x53f * 0x3 + 0x1aec\n                                ]\n                        }\n                        ; (this['h0'] =\n                            this['h1'] =\n                            this['h2'] =\n                            this['h3'] =\n                            this[_0x68ef08(0x385)] =\n                            this[_0x68ef08(0x25b)] =\n                            this[_0x68ef08(0x1cd)] =\n                            -0x1 * 0x4f9 + 0xeb * -0xd + 0x10e8),\n                            (this[_0x68ef08(0x182)] = this[_0x68ef08(0x1e9)] = !(-0x983 + -0x5b1 * -0x1 + 0x3d3)),\n                            (this[_0x68ef08(0x19f)] = !(-0xcdf + 0x2157 + -0x1478))\n                    }\n\n                    ; (_0x22f902[_0x2db296(0x344)][_0x2db296(0x2d5)] = function (_0x36f09d) {\n                        var _0x449340 = _0x2db296\n                        if (!this['finalized']) {\n                            var _0x462898,\n                                _0x1dd68e = typeof _0x36f09d\n                            if (_0x449340(0x33c) !== _0x1dd68e) {\n                                if ('object' !== _0x1dd68e) throw _0x1f977a\n                                if (null === _0x36f09d) throw _0x1f977a\n                                if (_0x1edc95 && _0x36f09d['constructor'] === ArrayBuffer) _0x36f09d = new Uint8Array(_0x36f09d)\n                                else {\n                                    if (!(Array[_0x449340(0x2af)](_0x36f09d) || (_0x1edc95 && ArrayBuffer['isView'](_0x36f09d)))) throw _0x1f977a\n                                }\n                                _0x462898 = !(-0xfea + 0x449 * 0x3 + -0x1 * -0x30f)\n                            }\n                            for (\n                                var _0x2c6513,\n                                _0x1fd15b,\n                                _0x432ef6 = 0xadd + -0x4d7 * 0x2 + 0x1 * -0x12f,\n                                _0x383058 = _0x36f09d[_0x449340(0x259)],\n                                _0x17a6ed = this[_0x449340(0x319)],\n                                _0x161a31 = this[_0x449340(0x329)];\n                                _0x432ef6 < _0x383058;\n\n                            ) {\n                                if (\n                                    (this[_0x449340(0x1e9)] &&\n                                        ((this[_0x449340(0x1e9)] = !(-0x657 + 0x4fb + -0x15d * -0x1)),\n                                            (_0x17a6ed[0x22e1 * -0x1 + -0xeb2 + 0x3193] = _0x17a6ed[0x283 * -0xd + -0x141e + 0x34d5]),\n                                            (_0x17a6ed[0x1af3 * 0x1 + -0x14d1 * 0x1 + -0x15 * 0x4a] =\n                                                _0x17a6ed[-0xc3 * -0x2f + -0x49 * -0x31 + 0x3 * -0x1097] =\n                                                _0x17a6ed[0x1e34 + -0x1 * -0x1837 + -0x3669] =\n                                                _0x17a6ed[-0x12e3 + -0x1733 * -0x1 + 0x1 * -0x44d] =\n                                                _0x17a6ed[0x31 * -0x8b + 0x1643 * 0x1 + 0x45c] =\n                                                _0x17a6ed[0x87 * -0xd + -0x14d5 + 0x1bb5] =\n                                                _0x17a6ed[0x1d70 + 0x255a + 0x4 * -0x10b1] =\n                                                _0x17a6ed[0x1312 + 0x2e6 + 0x15f1 * -0x1] =\n                                                _0x17a6ed[0x1ed9 + 0x551 * -0x1 + -0x1980] =\n                                                _0x17a6ed[0x269 * -0x7 + 0x1d8 + 0xf10] =\n                                                _0x17a6ed[0x1134 + -0x1 * -0x15cd + -0xcfd * 0x3] =\n                                                _0x17a6ed[0x1229 * 0x1 + 0x23 * -0xe3 + 0xceb] =\n                                                _0x17a6ed[0x15 * 0x13a + -0x23e3 * 0x1 + 0x1 * 0xa2d] =\n                                                _0x17a6ed[-0x4 * 0x8ee + -0x1d7d + 0x4142 * 0x1] =\n                                                _0x17a6ed[0x9d9 + 0x1 * -0x215b + 0x34 * 0x74] =\n                                                _0x17a6ed[0x1e72 + -0x9 * 0x2b + 0xa8 * -0x2c] =\n                                                0x857 + 0x1cef + -0x2546)),\n                                        _0x462898)\n                                ) {\n                                    if (_0x1edc95) {\n                                        for (\n                                            _0x1fd15b = this[_0x449340(0x385)];\n                                            _0x432ef6 < _0x383058 && _0x1fd15b < -0x836 + 0x1150 + -0xce * 0xb;\n                                            ++_0x432ef6\n                                        )\n                                            _0x161a31[_0x1fd15b++] = _0x36f09d[_0x432ef6]\n                                    } else {\n                                        for (\n                                            _0x1fd15b = this[_0x449340(0x385)];\n                                            _0x432ef6 < _0x383058 && _0x1fd15b < -0x4 * -0x4e8 + -0xedb * 0x1 + -0x485;\n                                            ++_0x432ef6\n                                        )\n                                            _0x17a6ed[_0x1fd15b >> (0x11 * 0x5c + 0x1378 * -0x2 + 0x3 * 0xaf2)] |=\n                                                _0x36f09d[_0x432ef6] << _0x4d13bd[(0x1 * -0x4f + -0x2036 + -0x1044 * -0x2) & _0x1fd15b++]\n                                    }\n                                } else {\n                                    if (_0x1edc95) {\n                                        for (\n                                            _0x1fd15b = this[_0x449340(0x385)];\n                                            _0x432ef6 < _0x383058 && _0x1fd15b < 0xc4 * -0x1 + 0x78f * -0x1 + 0x893;\n                                            ++_0x432ef6\n                                        )\n                                            (_0x2c6513 = _0x36f09d[_0x449340(0x195)](_0x432ef6)) < 0xd * 0x1a + 0x8f + -0x161\n                                                ? (_0x161a31[_0x1fd15b++] = _0x2c6513)\n                                                : _0x2c6513 < 0x1b9a + 0x1 * -0x4a9 + 0xef1 * -0x1\n                                                    ? ((_0x161a31[_0x1fd15b++] =\n                                                        (-0x1aaa * -0x1 + 0x2511 * -0x1 + -0x23b * -0x5) |\n                                                        (_0x2c6513 >> (0x1568 + 0x75a * 0x1 + -0x994 * 0x3))),\n                                                        (_0x161a31[_0x1fd15b++] =\n                                                            (0x54a + -0x1 * 0x1a66 + -0x1cd * -0xc) | ((0x8ad * 0x4 + 0x6a3 * 0x1 + -0x2918) & _0x2c6513)))\n                                                    : _0x2c6513 < 0x1807f + -0x1 * -0x44d4 + 0xed53 * -0x1 ||\n                                                        _0x2c6513 >= -0x1 * -0x123e4 + 0x1be31 + -0x5 * 0x66d1\n                                                        ? ((_0x161a31[_0x1fd15b++] =\n                                                            (0x1 * 0x11f + 0xffd * -0x1 + 0xfbe) | (_0x2c6513 >> (0x1 * 0x65 + 0x533 + -0x11c * 0x5))),\n                                                            (_0x161a31[_0x1fd15b++] =\n                                                                (0x4 * 0x72b + 0x23c9 * 0x1 + -0x3ff5) |\n                                                                ((_0x2c6513 >> (0x9 * 0x9 + 0x5 * 0x517 + -0x5 * 0x526)) & (0x200b + 0x1 * 0xbe7 + -0x2bb3))),\n                                                            (_0x161a31[_0x1fd15b++] =\n                                                                (0x1 * 0x128f + 0x11 * -0x6a + -0xb05) | ((0x27 * 0x59 + -0x2126 + 0x1 * 0x13d6) & _0x2c6513)))\n                                                        : ((_0x2c6513 =\n                                                            -0xb295 +\n                                                            0x185 * 0x139 +\n                                                            -0x2908 +\n                                                            ((((-0x1ec2 * -0x1 + -0x183e + -0xf * 0x2b) & _0x2c6513) << (0x2e * 0x3 + 0x14b + 0x1 * -0x1cb)) |\n                                                                ((0x1225 * 0x1 + 0x2376 + -0x319c) & _0x36f09d[_0x449340(0x195)](++_0x432ef6)))),\n                                                            (_0x161a31[_0x1fd15b++] = (-0x969 + 0xc97 + -0x23e) | (_0x2c6513 >> (-0xc19 + -0x14f9 + 0x2124))),\n                                                            (_0x161a31[_0x1fd15b++] =\n                                                                (0x202 + 0x1 * 0x187 + -0x309) |\n                                                                ((_0x2c6513 >> (-0x1da3 + -0xa * 0xda + -0x379 * -0xb)) & (0x2 * -0x117b + -0x7c9 + 0x2afe))),\n                                                            (_0x161a31[_0x1fd15b++] =\n                                                                (0x1 * -0x1043 + 0x1185 + -0xc2) |\n                                                                ((_0x2c6513 >> (-0x8c6 + 0x1d87 + -0x1d * 0xb7)) & (0x2a * 0xe7 + -0x1 * 0x1869 + -0xd3e))),\n                                                            (_0x161a31[_0x1fd15b++] =\n                                                                (-0x58e + 0x6 * -0x216 + 0x949 * 0x2) | ((0x2474 * -0x1 + 0xa9 * 0xd + 0x1c1e) & _0x2c6513)))\n                                    } else {\n                                        for (\n                                            _0x1fd15b = this[_0x449340(0x385)];\n                                            _0x432ef6 < _0x383058 && _0x1fd15b < -0x48a * 0x7 + 0x1993 + -0xd * -0x7f;\n                                            ++_0x432ef6\n                                        )\n                                            (_0x2c6513 = _0x36f09d[_0x449340(0x195)](_0x432ef6)) < 0x2 * -0x86 + 0x101 * 0x1f + -0x1 * 0x1d93\n                                                ? (_0x17a6ed[_0x1fd15b >> (-0x1297 + 0x71a + 0xb7f)] |=\n                                                    _0x2c6513 << _0x4d13bd[(-0x1f26 + 0xd17 + 0x1212) & _0x1fd15b++])\n                                                : _0x2c6513 < 0x11b7 + -0x150d + 0xb56\n                                                    ? ((_0x17a6ed[_0x1fd15b >> (-0x231f + -0x8eb + 0x2c0c)] |=\n                                                        ((0x1ae0 + 0x70b + -0x212b) | (_0x2c6513 >> (-0x87f + -0x23f * 0x5 + -0x13c * -0x10))) <<\n                                                        _0x4d13bd[(0x3fb + 0x8e1 * -0x1 + 0x4e9) & _0x1fd15b++]),\n                                                        (_0x17a6ed[_0x1fd15b >> (-0x1d97 + 0x6ad + 0x16ec)] |=\n                                                            ((0x1d0e + 0xf0a + -0x2b98) | ((0xf2c + 0xbb * -0x20 + 0x873) & _0x2c6513)) <<\n                                                            _0x4d13bd[(0x8d9 + -0x17e0 + 0xf0a) & _0x1fd15b++]))\n                                                    : _0x2c6513 < -0x8b7d + 0x113bf + 0x4fbe || _0x2c6513 >= -0xc9c0 + 0x16d4a * 0x1 + 0x3c76\n                                                        ? ((_0x17a6ed[_0x1fd15b >> (0x2 * 0x74f + 0x1533 + -0x23cf)] |=\n                                                            ((-0x7 * 0x28 + -0x2 * -0x1bb + -0x17e) | (_0x2c6513 >> (0x1d5c + 0x1e6c + -0x1 * 0x3bbc))) <<\n                                                            _0x4d13bd[(0x12 * 0x119 + 0x4 * -0x1c6 + -0xca7) & _0x1fd15b++]),\n                                                            (_0x17a6ed[_0x1fd15b >> (-0x26 * 0x2e + -0x12aa * 0x2 + -0x2c2a * -0x1)] |=\n                                                                ((0x245a + -0x1aa1 + -0x1 * 0x939) |\n                                                                    ((_0x2c6513 >> (0x1fa6 + -0x735 + -0x2f * 0x85)) & (-0x5d3 + -0x1eb2 * -0x1 + -0x18a0))) <<\n                                                                _0x4d13bd[(0xa40 + 0x1f49 + -0x84e * 0x5) & _0x1fd15b++]),\n                                                            (_0x17a6ed[_0x1fd15b >> (0x21 * -0xa4 + -0x139 * -0x5 + 0x1 * 0xf09)] |=\n                                                                ((-0x1434 + 0x5 * -0x35 + 0x15bd) | ((-0xc2d + 0x2655 + 0x25b * -0xb) & _0x2c6513)) <<\n                                                                _0x4d13bd[(0x76 * 0x26 + -0x1 * 0x8ad + 0x1c4 * -0x5) & _0x1fd15b++]))\n                                                        : ((_0x2c6513 =\n                                                            0x12e * -0xbf +\n                                                            0x1cc8a +\n                                                            0x8c * 0x26 +\n                                                            ((((-0x3f5 * 0x3 + -0xfe8 + 0x1fc6) & _0x2c6513) << (0x29a + 0x13a9 + -0x1639)) |\n                                                                ((0x1 * -0x1dd7 + 0x6a5 + 0x1 * 0x1b31) & _0x36f09d[_0x449340(0x195)](++_0x432ef6)))),\n                                                            (_0x17a6ed[_0x1fd15b >> (0xd * 0x61 + 0xcb * -0x1e + 0x12df)] |=\n                                                                ((0x1 * -0xee4 + 0x2 * -0x767 + -0x6 * -0x51b) |\n                                                                    (_0x2c6513 >> (0x1 * 0x1a4d + -0x3 * 0x149 + -0x1660))) <<\n                                                                _0x4d13bd[(-0x1c70 + -0x1 * -0x57b + 0x1 * 0x16f8) & _0x1fd15b++]),\n                                                            (_0x17a6ed[_0x1fd15b >> (0xef1 + -0xba0 + -0x1 * 0x34f)] |=\n                                                                ((-0xa3 * -0x3 + 0x26af + 0x140c * -0x2) |\n                                                                    ((_0x2c6513 >> (-0x518 + 0x1 * -0xc26 + 0x114a)) &\n                                                                        (-0x25 * -0xd1 + -0x1130 * -0x1 + -0x2f26))) <<\n                                                                _0x4d13bd[(-0x73 * -0xb + -0x17d * 0x1 + 0x1 * -0x371) & _0x1fd15b++]),\n                                                            (_0x17a6ed[_0x1fd15b >> (0x3 * -0x107 + 0x1dbd + -0x1aa6)] |=\n                                                                ((-0x151c + 0x16 * -0x191 + 0x3812) |\n                                                                    ((_0x2c6513 >> (0xded * -0x1 + 0x45 + 0xdae)) & (-0x2af * -0x7 + -0x49 + 0x1241 * -0x1))) <<\n                                                                _0x4d13bd[(-0x19a2 + -0x7d2 + 0x2177) & _0x1fd15b++]),\n                                                            (_0x17a6ed[_0x1fd15b >> (-0x180e + 0x13d2 + -0x1 * -0x43e)] |=\n                                                                ((-0x9 * -0x1f5 + -0xf1 * 0xd + -0x6 * 0xd0) |\n                                                                    ((0x7f * 0x2f + 0x1 * 0x188c + -0x986 * 0x5) & _0x2c6513)) <<\n                                                                _0x4d13bd[(0x1cf9 + 0xb * -0xe7 + -0x1309) & _0x1fd15b++]))\n                                    }\n                                }\n                                ; (this['lastByteIndex'] = _0x1fd15b),\n                                    (this[_0x449340(0x25b)] += _0x1fd15b - this['start']),\n                                    _0x1fd15b >= -0xa42 + 0x2 * -0x11c3 + 0x2e08\n                                        ? ((this[_0x449340(0x385)] = _0x1fd15b - (-0x2b * 0xe2 + 0xa55 + 0xd * 0x225)),\n                                            this[_0x449340(0x2ba)](),\n                                            (this[_0x449340(0x1e9)] = !(0xc54 + -0x1 * -0xfa3 + -0x1 * 0x1bf7)))\n                                        : (this[_0x449340(0x385)] = _0x1fd15b)\n                            }\n                            return (\n                                this[_0x449340(0x25b)] > -0x14462193f + -0xd7facb0 + -0x2 * -0x128f0e2f7 &&\n                                ((this['hBytes'] +=\n                                    (this['bytes'] / (0x73e4b4e0 * 0x3 + -0x3fc * -0x40b5a1 + -0x486a * 0x4d396)) <<\n                                    (-0x1fbb * 0x1 + -0x1623 + 0x35de)),\n                                    (this[_0x449340(0x25b)] = this[_0x449340(0x25b)] % (0x7d756c * -0x1e1 + -0x3b6aede * -0x2 + 0x278 * 0xc42bda))),\n                                this\n                            )\n                        }\n                    }),\n                        (_0x22f902[_0x2db296(0x344)][_0x2db296(0x1d9)] = function () {\n                            var _0x8b694 = _0x2db296\n                            if (!this[_0x8b694(0x182)]) {\n                                this[_0x8b694(0x182)] = !(0x1038 + 0x1 * -0x247f + 0x1d * 0xb3)\n                                var _0x52f24a = this[_0x8b694(0x319)],\n                                    _0x21cbd8 = this[_0x8b694(0x32e)]\n                                    ; (_0x52f24a[_0x21cbd8 >> (0x4cd * 0x4 + -0x1 * -0x1511 + -0x2843)] |=\n                                        _0x146907[(0xb2e + -0x10 * -0xbf + -0x41 * 0x5b) & _0x21cbd8]),\n                                        _0x21cbd8 >= 0x8fe * 0x3 + -0x231c + -0x42d * -0x2 &&\n                                        (this['hashed'] || this['hash'](),\n                                            (_0x52f24a[0x666 + 0x1432 + -0x1a98] = _0x52f24a[0x24cd + 0x1e1 * 0x14 + 0x19 * -0x2f9]),\n                                            (_0x52f24a[-0x1f46 + 0x1 * 0x1015 + 0xf41] =\n                                                _0x52f24a[0xbe8 + 0x1a96 + 0xa7 * -0x3b] =\n                                                _0x52f24a[-0xb * 0x14d + -0x1 * 0x59 + -0xeaa * -0x1] =\n                                                _0x52f24a[-0x1f1 * -0x3 + -0x1d69 + 0x1799] =\n                                                _0x52f24a[0xa7b * -0x2 + 0xbb1 * -0x1 + -0x20ab * -0x1] =\n                                                _0x52f24a[-0x11dc + -0xaa + 0x2f * 0x65] =\n                                                _0x52f24a[-0x1 * 0x1f99 + -0x1e53 * 0x1 + 0x3df2] =\n                                                _0x52f24a[-0x103 * -0x5 + -0x2451 + 0x1f49] =\n                                                _0x52f24a[0x21e6 + -0xf9 * 0x1 + -0x1 * 0x20e5] =\n                                                _0x52f24a[0x88a + -0x1bea + -0x1 * -0x1369] =\n                                                _0x52f24a[0xf4d + -0x177d * -0x1 + -0x26c0] =\n                                                _0x52f24a[0x1e22 + 0x655 * 0x3 + -0x3116] =\n                                                _0x52f24a[-0x196b + 0x19b * -0x10 + -0x2d * -0x123] =\n                                                _0x52f24a[-0x1 * -0x228d + 0x1cfc + -0x3f7c] =\n                                                _0x52f24a[-0x13b4 + -0x5bc + 0x197e] =\n                                                _0x52f24a[0x1e68 + 0x1209 + -0x3062] =\n                                                0x26a1 + -0x124 * -0x20 + -0x4b21)),\n                                        (_0x52f24a[0xbb3 + 0x1210 + -0x1db5] = this[_0x8b694(0x25b)] << (-0x15 * -0x1d7 + 0x2 * -0xc2a + -0xe4c)),\n                                        (_0x52f24a[-0x19e2 + 0x28 * 0x55 + 0xca9] =\n                                            (this[_0x8b694(0x1cd)] << (-0x178 * 0x6 + 0xa67 + 0x194 * -0x1)) |\n                                            (this[_0x8b694(0x25b)] >>> (0x1a65 + -0x18 * 0x44 + -0x16c * 0xe))),\n                                        this['hash']()\n                            }\n                        }),\n                        (_0x22f902[_0x2db296(0x344)][_0x2db296(0x2ba)] = function () {\n                            var _0x2f0149 = _0x2db296,\n                                _0x227f23,\n                                _0x3952af,\n                                _0x2a0c94,\n                                _0x39eb64,\n                                _0x2fd641,\n                                _0x113678,\n                                _0x128d32 = this[_0x2f0149(0x319)]\n                            this['first']\n                                ? (_0x3952af =\n                                    ((((_0x3952af =\n                                        ((_0x227f23 =\n                                            ((((_0x227f23 =\n                                                _0x128d32[0xe * 0xd4 + 0x18b * -0x13 + 0x11b9] - (0x1ffe472d + -0x1 * 0x229b4beb + 0x8a3acdb * 0x5)) <<\n                                                (-0xe3 + 0x794 * 0x5 + 0x2 * -0x127d)) |\n                                                (_0x227f23 >>> (-0x2125 + 0x21d4 + -0x96))) -\n                                                (-0xa42713c + -0x131 * -0xc4faf + 0xbc9d634)) <<\n                                            (-0x76 + -0x13ee + 0x1464)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 =\n                                                    (-(0x1d99 * -0x236f + 0xdf * -0x44be3 + 0x18092f8b) ^\n                                                        ((_0x39eb64 =\n                                                            ((((_0x39eb64 =\n                                                                (-(-0xfc * -0xaf0303 + 0x524d2f32 + -0xcedcd * 0xbb4) ^\n                                                                    ((0x1 * 0x7b470ebd + 0x1 * 0x4d64e86c + -0x51347fb2) & _0x227f23)) +\n                                                                _0x128d32[-0x2684 + 0x1f4e * -0x1 + 0x8f * 0x7d] -\n                                                                (0x563f0e * -0x16 + 0x59003ae + 0x46faddd * 0x2)) <<\n                                                                (-0x684 + 0xa * 0x289 + -0x1a * 0xb9)) |\n                                                                (_0x39eb64 >>> (-0x1116 * -0x2 + 0xee9 * -0x1 + -0x132f * 0x1))) +\n                                                                _0x227f23) <<\n                                                            (-0x2687 * -0x1 + 0xfe3 + -0x1 * 0x366a)) &\n                                                            (-(0x1a9157f + 0x1e0df645 + -0xf84b74d) ^ _0x227f23))) +\n                                                    _0x128d32[0x144d + 0x15b * -0x18 + 0xc3d] -\n                                                    (-0x1 * 0x5504eeba + 0x76f3f96f * 0x1 + -0x2 * -0x109ad3b9)) <<\n                                                    (0x1af4 + -0x12cb + -0x818)) |\n                                                    (_0x2a0c94 >>> (0x7aa * 0x1 + -0x1994 * -0x1 + -0x212f))) +\n                                                    _0x39eb64) <<\n                                                (-0x9fc + -0x14 * 0xfa + -0x1d84 * -0x1)) &\n                                                (_0x39eb64 ^ _0x227f23))) +\n                                        _0x128d32[-0x2a * 0x97 + 0x18c8 + 0x1 * 0x1] -\n                                        (-0x992 * 0x9361 + 0x23b1c4 + 0x1 * 0x53d34a17)) <<\n                                        (-0x7 * 0x1b1 + -0x234d + -0x136 * -0x27)) |\n                                        (_0x3952af >>> (-0x113f * 0x1 + 0x5 * -0x7f + 0x1cc * 0xb))) +\n                                        _0x2a0c94) <<\n                                    (-0x4f0 + -0x1 * -0x1f3d + -0x1a4d))\n                                : ((_0x227f23 = this['h0']),\n                                    (_0x3952af = this['h1']),\n                                    (_0x2a0c94 = this['h2']),\n                                    (_0x3952af =\n                                        ((((_0x3952af +=\n                                            ((_0x227f23 =\n                                                ((((_0x227f23 +=\n                                                    ((_0x39eb64 = this['h3']) ^ (_0x3952af & (_0x2a0c94 ^ _0x39eb64))) +\n                                                    _0x128d32[0x3a5 + -0x1684 + 0x12df * 0x1] -\n                                                    (0x2b26bdc2 + -0x1 * -0x4468952b + -0x5773 * 0xcfc7)) <<\n                                                    (-0x1805 + -0x18cb + 0x30d7)) |\n                                                    (_0x227f23 >>> (0x21ec * -0x1 + -0x53c * -0x1 + 0x1cc9))) +\n                                                    _0x3952af) <<\n                                                (0xfe0 + 0x16a4 + -0x2684)) ^\n                                                ((_0x2a0c94 =\n                                                    ((((_0x2a0c94 +=\n                                                        (_0x3952af ^\n                                                            ((_0x39eb64 =\n                                                                ((((_0x39eb64 +=\n                                                                    (_0x2a0c94 ^ (_0x227f23 & (_0x3952af ^ _0x2a0c94))) +\n                                                                    _0x128d32[0x1 * -0x480 + 0x1 * 0x112f + -0xcae] -\n                                                                    (0x1e4d0bcf + 0x1be * -0xbfe2b + 0xdd00bc5)) <<\n                                                                    (-0x26fe + -0x462 + 0x2b6c)) |\n                                                                    (_0x39eb64 >>> (-0x1 * 0x251 + -0xd16 + 0xf7b))) +\n                                                                    _0x227f23) <<\n                                                                (0x15be * 0x1 + 0x2e3 * 0x8 + -0x2cd6)) &\n                                                                (_0x227f23 ^ _0x3952af))) +\n                                                        _0x128d32[-0xa5 * -0x1d + 0x5 * -0x105 + 0x2f * -0x4a] +\n                                                        (0x15 * 0x27c2519 + -0x1cb83878 + 0x654cf23 * 0x2)) <<\n                                                        (-0x9d5 + -0x221e + -0xeac * -0x3)) |\n                                                        (_0x2a0c94 >>> (-0x718 * 0x2 + -0x5 * -0x556 + -0x425 * 0x3))) +\n                                                        _0x39eb64) <<\n                                                    (0x223 * -0xb + -0x92 * 0x22 + 0x2ae5)) &\n                                                    (_0x39eb64 ^ _0x227f23))) +\n                                            _0x128d32[-0x141c + 0x376 + 0x10a9] -\n                                            (0x29f06346 + 0x14e90f87 * -0x3 + -0x3 * -0x1baefecb)) <<\n                                            (0x103a + -0x24f4 + 0x14d0)) |\n                                            (_0x3952af >>> (-0x16a5 + -0xe92 + 0xbb * 0x33))) +\n                                            _0x2a0c94) <<\n                                        (0x25a2 * 0x1 + 0x1a76 + -0x4018 * 0x1))),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x227f23 =\n                                            ((((_0x227f23 +=\n                                                (_0x39eb64 ^ (_0x3952af & (_0x2a0c94 ^ _0x39eb64))) +\n                                                _0x128d32[-0x2552 + 0x577 + 0x1fdf] -\n                                                (-0xec5a4e1 + 0x23fe4 * -0x78c + -0x9e * -0x447abf)) <<\n                                                (-0x46e + 0x19b5 + -0x8 * 0x2a8)) |\n                                                (_0x227f23 >>> (0x100e + 0xd63 + -0x1d58))) +\n                                                _0x3952af) <<\n                                            (-0x237d + 0x1955 * -0x1 + 0x3cd2)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x3952af ^\n                                                        ((_0x39eb64 =\n                                                            ((((_0x39eb64 +=\n                                                                (_0x2a0c94 ^ (_0x227f23 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[-0x203 + 0xd54 + -0x2d3 * 0x4] +\n                                                                (0x1 * -0x20e3c675 + 0x8ef8e325 + 0x4e53fd * -0x7e)) <<\n                                                                (-0x9e3 * 0x2 + 0x2 * -0x8fd + 0x25cc)) |\n                                                                (_0x39eb64 >>> (-0x7bd + 0x2 * -0x844 + 0x1859 * 0x1))) +\n                                                                _0x227f23) <<\n                                                            (-0x3dc + -0x122e + 0x326 * 0x7)) &\n                                                            (_0x227f23 ^ _0x3952af))) +\n                                                    _0x128d32[-0xbfd + -0x1 * 0xba3 + 0x17a6] -\n                                                    (-0x93f8bbe0 + -0x43dcbb55 + 0x1 * 0x12fa53122)) <<\n                                                    (0x185 * -0x10 + -0x76c + 0x1fcd)) |\n                                                    (_0x2a0c94 >>> (0x19b + 0x51 * 0x6d + 0x171 * -0x19))) +\n                                                    _0x39eb64) <<\n                                                (0x971 + 0x1958 + -0x5 * 0x6f5)) &\n                                                (_0x39eb64 ^ _0x227f23))) +\n                                        _0x128d32[-0x978 * -0x3 + 0x315 + -0x2 * 0xfbb] -\n                                        (-0x99026a + 0xa6ba6 * 0x47 + 0xc4927 * 0x9)) <<\n                                        (0x212 + 0x1 * 0x4c3 + 0xb * -0x9d)) |\n                                        (_0x3952af >>> (-0x152a + 0x1 * -0x17b4 + -0x77c * -0x6))) +\n                                        _0x2a0c94) <<\n                                    (-0xa7 * 0x1f + 0x2379 + -0xf40)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x227f23 =\n                                            ((((_0x227f23 +=\n                                                (_0x39eb64 ^ (_0x3952af & (_0x2a0c94 ^ _0x39eb64))) +\n                                                _0x128d32[-0x251a + -0x14 * -0x18d + 0x61e] +\n                                                (0xb19f3051 + -0xb487bda1 * 0x1 + 0x6c692628)) <<\n                                                (0x1cc + -0x171a + 0x1555)) |\n                                                (_0x227f23 >>> (0x1 * -0x223b + -0x282 + 0x24d6))) +\n                                                _0x3952af) <<\n                                            (0x1453 + 0x1aee + -0x2f41)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x3952af ^\n                                                        ((_0x39eb64 =\n                                                            ((((_0x39eb64 +=\n                                                                (_0x2a0c94 ^ (_0x227f23 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[-0x1c63 + -0x1a88 + 0x36f4] -\n                                                                (0x334017ba + 0x1 * -0x90d7af8d + -0x86 * -0x191cf86)) <<\n                                                                (-0x1db2 + 0x1 * 0x10b1 + 0xd0d)) |\n                                                                (_0x39eb64 >>> (-0x4 * -0x20 + -0xd81 * -0x1 + -0xded))) +\n                                                                _0x227f23) <<\n                                                            (-0x2b0 + 0x4 * -0x5b0 + -0x94 * -0x2c)) &\n                                                            (_0x227f23 ^ _0x3952af))) +\n                                                    _0x128d32[-0x1 * -0xf25 + 0xe75 * 0x1 + -0x1d90] -\n                                                    (-0x5 * 0x4eb + 0x12ff3 * -0x1 + 0x1 * 0x1ecd9)) <<\n                                                    (-0xa43 + 0x1eed + 0x1 * -0x1499)) |\n                                                    (_0x2a0c94 >>> (-0x1878 + -0x92b + 0x21b2))) +\n                                                    _0x39eb64) <<\n                                                (-0x1 * 0x2515 + -0x8c8 + -0x3b * -0xc7)) &\n                                                (_0x39eb64 ^ _0x227f23))) +\n                                        _0x128d32[0x80b * -0x4 + 0xff5 + 0x1042] -\n                                        (-0x2d479161 * 0x5 + -0x139 * 0x33685d + 0x197e398dc)) <<\n                                        (-0x178 + -0x22bf + 0x1 * 0x244d)) |\n                                        (_0x3952af >>> (0x15cc + -0x26b6 + -0x5 * -0x364))) +\n                                        _0x2a0c94) <<\n                                    (0x293 * -0x2 + 0x18f7 + -0x13d1)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x227f23 =\n                                            ((((_0x227f23 +=\n                                                (_0x39eb64 ^ (_0x3952af & (_0x2a0c94 ^ _0x39eb64))) +\n                                                _0x128d32[-0x1225 + -0xa * -0x348 + 0x13 * -0xc5] +\n                                                (-0x36f3e05c + 0x4445538c + 0x5e3e9df2)) <<\n                                                (-0x1b3 * -0x3 + 0x2702 + -0x2c14)) |\n                                                (_0x227f23 >>> (-0x2 * 0x1006 + 0x25 * 0xc5 + 0x3ac))) +\n                                                _0x3952af) <<\n                                            (0x2501 + 0x18fb + 0xf7f * -0x4)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x3952af ^\n                                                        ((_0x39eb64 =\n                                                            ((((_0x39eb64 +=\n                                                                (_0x2a0c94 ^ (_0x227f23 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[-0x13cb + -0xcd4 + 0x20ac] -\n                                                                (-0x24 * 0x1e9ae6 + -0xa0ba1 * 0x72 + -0x18cc1 * -0x737)) <<\n                                                                (0x702 + 0x2b * -0x35 + 0x1f1)) |\n                                                                (_0x39eb64 >>> (-0x15dd + -0x22eb * -0x1 + 0x1 * -0xcfa))) +\n                                                                _0x227f23) <<\n                                                            (0x224b * 0x1 + 0x2f * 0x33 + 0x4 * -0xaea)) &\n                                                            (_0x227f23 ^ _0x3952af))) +\n                                                    _0x128d32[0xec7 * -0x1 + -0x61 * -0x25 + 0xd0] -\n                                                    (0x48e87164 + 0x613cb841 + -0x509e6d33)) <<\n                                                    (-0x1c0d + 0x5d0 + 0x164e)) |\n                                                    (_0x2a0c94 >>> (0x156a * 0x1 + 0x16e7 + -0x2c42))) +\n                                                    _0x39eb64) <<\n                                                (-0x1 * -0x19ec + 0x8b4 + -0x22a0)) &\n                                                (_0x39eb64 ^ _0x227f23))) +\n                                        _0x128d32[0x1df0 + -0x2365 + -0x1 * -0x584] +\n                                        (0x34eb7 * 0x25f0 + -0x3 * -0x1a616a08 + -0x82ea7487)) <<\n                                        (-0x3 * 0xc8c + 0x1fc2 * -0x1 + -0x457c * -0x1)) |\n                                        (_0x3952af >>> (-0x2464 + 0x2705 + -0xdd * 0x3))) +\n                                        _0x2a0c94) <<\n                                    (-0x504 + 0x2 * -0x5f9 + 0x10f6)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    (_0x2a0c94 &\n                                                        ((_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2a0c94 ^ (_0x39eb64 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[0x1b4d + 0x2d4 * 0x5 + -0x2970] -\n                                                                (0x30139 * 0x8d + -0x738f7c2 + -0x1 * -0xf7325fb)) <<\n                                                                (0x1acc + -0x13e5 + -0x6e2)) |\n                                                                (_0x227f23 >>> (0x7 * 0x1 + -0x10e9 + 0x10fd * 0x1))) +\n                                                                _0x3952af) <<\n                                                            (-0x18fd + 0x10cc + 0x831)) ^\n                                                            _0x3952af))) +\n                                                _0x128d32[0x2 * 0x131e + -0x2511 + 0x1 * -0x125] -\n                                                (-0x1f * -0x3953eea + -0x4 * -0x12786c0f + -0x793501d2)) <<\n                                                (0x210d + 0x11 * -0x241 + 0x54d * 0x1)) |\n                                                (_0x39eb64 >>> (-0x4 * -0x265 + -0x292 + 0xfd * -0x7))) +\n                                                _0x227f23) <<\n                                            (-0x200b + -0xa * 0xff + -0x1 * -0x2a01)) ^\n                                            (_0x227f23 &\n                                                ((_0x2a0c94 =\n                                                    ((((_0x2a0c94 +=\n                                                        (_0x227f23 ^ (_0x3952af & (_0x39eb64 ^ _0x227f23))) +\n                                                        _0x128d32[-0x92 * -0x13 + 0x6b0 + -0x117b] +\n                                                        (-0x4be8e758 + -0x1a3c * -0x1e38f + 0x40b96625)) <<\n                                                        (-0x1 * 0x13d1 + 0x22da + -0xefb)) |\n                                                        (_0x2a0c94 >>> (0x166d + -0x955 + -0xd06))) +\n                                                        _0x39eb64) <<\n                                                    (-0x13af * 0x1 + -0x1 * -0x1307 + 0xa8)) ^\n                                                    _0x39eb64))) +\n                                        _0x128d32[-0x547 + -0x1 * 0x1c0b + -0x2152 * -0x1] -\n                                        (0x7 * 0x14d828a + 0x7d4a6f4 + -0x3 * -0x1c75534)) <<\n                                        (0x1bb9 * -0x1 + -0x26ee + 0x42bb * 0x1)) |\n                                        (_0x3952af >>> (0x8 * 0x296 + 0x1ce9 * 0x1 + -0x318d))) +\n                                        _0x2a0c94) <<\n                                    (0x897 * 0x4 + 0x2ca + 0x3 * -0xc62)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    (_0x2a0c94 &\n                                                        ((_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2a0c94 ^ (_0x39eb64 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[0x107f * -0x1 + -0x1299 + -0x59 * -0x65] -\n                                                                (0x1079c263 + -0x1889 * -0x11026 + -0xbe0716)) <<\n                                                                (-0x260c + -0x1c23 + 0x2 * 0x211a)) |\n                                                                (_0x227f23 >>> (0x22b * 0x1 + -0x16f3 + -0x14e3 * -0x1))) +\n                                                                _0x3952af) <<\n                                                            (0x183b + -0x5 * -0x72a + -0x3c0d * 0x1)) ^\n                                                            _0x3952af))) +\n                                                _0x128d32[0x4 * 0x86b + 0x1064 + -0x3206] +\n                                                (-0x1177f56 + -0x27de7f4 + -0x540d * -0x11d1)) <<\n                                                (0x167 * 0x5 + -0x5 * 0x531 + 0x12fb * 0x1)) |\n                                                (_0x39eb64 >>> (0x244b + -0x13 * 0x139 + -0x9 * 0x171))) +\n                                                _0x227f23) <<\n                                            (-0xf6d + -0x1f9e + 0x2f0b * 0x1)) ^\n                                            (_0x227f23 &\n                                                ((_0x2a0c94 =\n                                                    ((((_0x2a0c94 +=\n                                                        (_0x227f23 ^ (_0x3952af & (_0x39eb64 ^ _0x227f23))) +\n                                                        _0x128d32[0x187 * 0x4 + 0x1e69 + -0x2476] -\n                                                        (-0x10191ede + -0xd72a9b7 + 0x44e9e214)) <<\n                                                        (0x90 * 0xc + -0x2 * 0x12 + -0x68e)) |\n                                                        (_0x2a0c94 >>> (0x16 * 0x1c5 + 0x137b + 0x1d * -0x203))) +\n                                                        _0x39eb64) <<\n                                                    (-0x14fa + 0x43 * -0x74 + -0x3356 * -0x1)) ^\n                                                    _0x39eb64))) +\n                                        _0x128d32[-0xf4a + -0x1992 + 0x4 * 0xa38] -\n                                        (-0xae6496c + 0x21ece5a8 + 0x12567fc)) <<\n                                        (0x1ac8 + -0x1ed2 + 0x3e * 0x11)) |\n                                        (_0x3952af >>> (0x1268 + 0x100d + 0x1 * -0x2269))) +\n                                        _0x2a0c94) <<\n                                    (0x1817 * -0x1 + 0x239b + -0xb84 * 0x1)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    (_0x2a0c94 &\n                                                        ((_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2a0c94 ^ (_0x39eb64 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[0x5 * 0x19c + 0xef3 + -0x16f6] +\n                                                                (0x39d62e7 + 0xb397e9b + 0x130aec64)) <<\n                                                                (0x11 * 0x21f + -0x1c66 + -0x7a4)) |\n                                                                (_0x227f23 >>> (-0xf86 + 0x2 * -0x4e5 + 0x879 * 0x3))) +\n                                                                _0x3952af) <<\n                                                            (0x258a + 0x19ec + -0x3f76)) ^\n                                                            _0x3952af))) +\n                                                _0x128d32[0x914 + 0xd73 + 0x20b * -0xb] -\n                                                (-0xab52d21 + -0x845d9 * 0x1f7 + 0x57bf62aa)) <<\n                                                (-0x1 * 0x2f + -0x1280 + 0x12b8)) |\n                                                (_0x39eb64 >>> (0x2e * -0x9 + 0x85 * 0x4b + -0x2542))) +\n                                                _0x227f23) <<\n                                            (-0x151 * 0x9 + 0x20da + -0x1501)) ^\n                                            (_0x227f23 &\n                                                ((_0x2a0c94 =\n                                                    ((((_0x2a0c94 +=\n                                                        (_0x227f23 ^ (_0x3952af & (_0x39eb64 ^ _0x227f23))) +\n                                                        _0x128d32[-0x84 * 0x39 + 0x57f + 0x2fd * 0x8] -\n                                                        (0x852a967 + 0xa4943f2 + -0x770fae0)) <<\n                                                        (-0x5 * -0x722 + 0x1 * -0x155f + -0xe3d)) |\n                                                        (_0x2a0c94 >>> (0x171b + -0x2709 * 0x1 + 0x8 * 0x200))) +\n                                                        _0x39eb64) <<\n                                                    (-0x267 + 0x6fb * -0x4 + -0x7 * -0x455)) ^\n                                                    _0x39eb64))) +\n                                        _0x128d32[0xd73 + -0xe3f + 0xd4] +\n                                        (-0x882b6c12 + 0x26ddcab5 + 0x9d1 * 0x10fa2a)) <<\n                                        (-0x1 * -0xb31 + 0xa * -0x175 + 0x375)) |\n                                        (_0x3952af >>> (0x106 * 0x26 + 0x2e9 + -0x29c1))) +\n                                        _0x2a0c94) <<\n                                    (-0x198a + 0xb33 * -0x1 + 0x24bd)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    (_0x2a0c94 &\n                                                        ((_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2a0c94 ^ (_0x39eb64 & (_0x3952af ^ _0x2a0c94))) +\n                                                                _0x128d32[0x1d4f + -0x10ae + -0xc94] -\n                                                                (0x76d313f * 0xd + -0x5 * -0x7a635fc + -0x2 * 0x18573b92)) <<\n                                                                (0x612 + -0x1 * 0x40 + -0x5cd)) |\n                                                                (_0x227f23 >>> (-0x12e9 * 0x2 + -0x1 * -0x19e7 + -0x1 * -0xc06))) +\n                                                                _0x3952af) <<\n                                                            (0x10db + 0x10b5 * 0x1 + -0x3 * 0xb30)) ^\n                                                            _0x3952af))) +\n                                                _0x128d32[-0x796 + -0x13b9 + 0x1b51] -\n                                                (-0x17e5b * 0x29 + 0x48058e0 + -0x132c045)) <<\n                                                (0x26d * -0x2 + 0x4 * -0x34e + -0x5 * -0x39f)) |\n                                                (_0x39eb64 >>> (0x198d * -0x1 + -0x25d4 + -0xa94 * -0x6))) +\n                                                _0x227f23) <<\n                                            (0x206d + -0xd3f + -0x132e)) ^\n                                            (_0x227f23 &\n                                                ((_0x2a0c94 =\n                                                    ((((_0x2a0c94 +=\n                                                        (_0x227f23 ^ (_0x3952af & (_0x39eb64 ^ _0x227f23))) +\n                                                        _0x128d32[-0x1f * 0x95 + 0x6 * -0x3dc + -0x3 * -0xdbe] +\n                                                        (-0x2 * 0x5ec874bd + -0x4537c41d * -0x1 + 0xdfc82836)) <<\n                                                        (0x1336 + -0x12bc + -0x6c)) |\n                                                        (_0x2a0c94 >>> (0x119 * -0x1d + -0x3 * 0xc41 + 0x44aa * 0x1))) +\n                                                        _0x39eb64) <<\n                                                    (0xe * -0x29c + 0x4ea + 0x1f9e)) ^\n                                                    _0x39eb64))) +\n                                        _0x128d32[0x985 + -0x1177 + 0x1 * 0x7fe] -\n                                        (-0x3d273af + -0x1 * -0x72611590 + 0x4471195)) <<\n                                        (0x112 * 0x15 + -0xa30 + -0x412 * 0x3)) |\n                                        (_0x3952af >>> (0x1 * 0xe74 + 0x6 * 0x1f7 + -0x1a32))) +\n                                        _0x2a0c94) <<\n                                    (0xf1 + -0xe43 * -0x2 + -0x1d77 * 0x1)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x113678 =\n                                            (_0x39eb64 =\n                                                ((((_0x39eb64 +=\n                                                    ((_0x2fd641 = _0x3952af ^ _0x2a0c94) ^\n                                                        (_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2fd641 ^ _0x39eb64) +\n                                                                _0x128d32[-0x87 * -0x1 + -0x1 * -0x1626 + -0x16a8] -\n                                                                (-0x3ca72 + -0xac995 + 0x145ac5)) <<\n                                                                (-0x1231 + -0x1 * -0xb05 + 0x730)) |\n                                                                (_0x227f23 >>> (0x20dd * 0x1 + -0x16b8 + -0xa09))) +\n                                                                _0x3952af) <<\n                                                            (0x1 * 0xe63 + 0xa34 * -0x2 + 0x605))) +\n                                                    _0x128d32[-0x9a * -0x23 + 0x25fd + -0x3b03] -\n                                                    (0xb06c444e + 0x2d68c * 0x1574 + 0x9 * -0xcf8fe07)) <<\n                                                    (0x1f60 * -0x1 + -0x1fc2 + -0x1 * -0x3f2d)) |\n                                                    (_0x39eb64 >>> (0x1c0e + 0x7c * -0x3b + 0x9b * 0x1))) +\n                                                    _0x227f23) <<\n                                                (-0x1 * 0x7db + 0x143d * 0x1 + -0x2 * 0x631)) ^ _0x227f23) ^\n                                            (_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x113678 ^ _0x3952af) +\n                                                    _0x128d32[0x1315 + 0x22f5 + -0x35ff] +\n                                                    (0x1 * -0xc1ee2861 + 0x5f64a13c + 0xd026e847)) <<\n                                                    (0x10b * 0x15 + 0x9e2 + -0x1fb9)) |\n                                                    (_0x2a0c94 >>> (0x213e + -0x11 * -0x93 + -0x1 * 0x2af1))) +\n                                                    _0x39eb64) <<\n                                                (-0x4 * 0x7c8 + 0x1 * 0x33d + 0x1be3))) +\n                                        _0x128d32[0x18c5 * 0x1 + 0x94d * -0x3 + 0x2 * 0x198] -\n                                        (0xbbbcc3 + 0x1509 * -0x2a32 + 0x4d6a0f3)) <<\n                                        (0x12b5 * 0x1 + -0xc * 0xa2 + -0xb06)) |\n                                        (_0x3952af >>> (-0x596 * 0x5 + 0x2 * -0x655 + 0x28a1))) +\n                                        _0x2a0c94) <<\n                                    (0x5f * -0x36 + 0x2b1 * 0x4 + 0x946)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x113678 =\n                                            (_0x39eb64 =\n                                                ((((_0x39eb64 +=\n                                                    ((_0x2fd641 = _0x3952af ^ _0x2a0c94) ^\n                                                        (_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2fd641 ^ _0x39eb64) +\n                                                                _0x128d32[-0xaa9 + 0x6 * 0x54e + 0x7e * -0x2b] -\n                                                                (-0x1309d * -0x67b3 + -0x8e97ecd6 + 0x6e74d9cb)) <<\n                                                                (-0x1 * 0x1169 + -0x1c3f + 0x2dac)) |\n                                                                (_0x227f23 >>> (-0x12f * 0x1d + 0x178 + 0x20f7))) +\n                                                                _0x3952af) <<\n                                                            (-0x1554 + 0x2 * -0x136e + 0x9 * 0x6b0))) +\n                                                    _0x128d32[0x8bd * 0x4 + 0x993 + -0x2c83] +\n                                                    (-0x1ec1ce29 + 0x12d9d323 + 0x57c6caaf)) <<\n                                                    (0x2f9 * 0x1 + 0x1a55 + -0x1d43)) |\n                                                    (_0x39eb64 >>> (-0xdf6 + 0x94 * 0x2 + 0xce3))) +\n                                                    _0x227f23) <<\n                                                (-0xd5 + -0x197e + 0x1a53)) ^ _0x227f23) ^\n                                            (_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x113678 ^ _0x3952af) +\n                                                    _0x128d32[0x697 * -0x1 + -0x617 + 0xcb5] -\n                                                    (0x2 * -0x11de459 + 0xaabba88 + 0xd4c2ca)) <<\n                                                    (-0x1198 * 0x1 + -0x42c * 0x3 + 0x2 * 0xf16)) |\n                                                    (_0x2a0c94 >>> (0x28e * 0x2 + 0x1547 + -0x125 * 0x17))) +\n                                                    _0x39eb64) <<\n                                                (0x45 * 0x21 + -0x14 * -0x7 + 0x971 * -0x1))) +\n                                        _0x128d32[-0x1 * -0x118b + 0x1f4 + -0x1375] -\n                                        (0x2 * -0x34ed62bd + -0x6d39a445 + -0x11854ad4f * -0x1)) <<\n                                        (-0x27f * -0x1 + -0x4 * 0x31a + 0xa00)) |\n                                        (_0x3952af >>> (-0x319 + -0x1 * -0x247d + -0x215b * 0x1))) +\n                                        _0x2a0c94) <<\n                                    (-0x1bc7 * 0x1 + 0x1 * -0x4f7 + 0x20be)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x113678 =\n                                            (_0x39eb64 =\n                                                ((((_0x39eb64 +=\n                                                    ((_0x2fd641 = _0x3952af ^ _0x2a0c94) ^\n                                                        (_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2fd641 ^ _0x39eb64) +\n                                                                _0x128d32[-0x1 * -0x1eb5 + -0x1ba5 + -0x3 * 0x101] +\n                                                                (0x338d6ddd + 0x1 * 0x3db4c799 + -0x48a6b6b0)) <<\n                                                                (0x126a + 0x1 * 0x407 + -0x166d * 0x1)) |\n                                                                (_0x227f23 >>> (-0x1f97 + -0x2566 * -0x1 + 0x5b3 * -0x1))) +\n                                                                _0x3952af) <<\n                                                            (0x2175 + 0x2187 * 0x1 + -0x42fc))) +\n                                                    _0x128d32[0x1701 + 0x1fb6 + 0x36b7 * -0x1] -\n                                                    (0x1e38ad99 + -0x3 * -0x1727b1c + -0xd3146e7)) <<\n                                                    (0x15 * -0x18d + -0x4 * -0x75e + 0x324)) |\n                                                    (_0x39eb64 >>> (-0x7f8 + 0x1 * 0xc1 + 0x74c))) +\n                                                    _0x227f23) <<\n                                                (-0x86 * 0x27 + -0x1 * 0x1a93 + -0x17 * -0x20b)) ^ _0x227f23) ^\n                                            (_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x113678 ^ _0x3952af) +\n                                                    _0x128d32[0x1 * -0x1c6f + -0x10f0 + -0x4a * -0x9d] -\n                                                    (-0x353a5 * 0xce7 + 0x510a05c * 0xe + 0xf144056)) <<\n                                                    (0x2c * -0x8f + -0x20 * -0x11b + 0x2af * -0x4)) |\n                                                    (_0x2a0c94 >>> (-0x167c * -0x1 + 0x1bef * -0x1 + 0x583))) +\n                                                    _0x39eb64) <<\n                                                (-0x3 * 0x3b + 0x1555 + 0xa52 * -0x2))) +\n                                        _0x128d32[0x35 * -0x27 + -0x1 * 0xdb8 + -0x1 * -0x15d1] +\n                                        (0x2e39f97 * 0x1 + -0x1 * 0x58f09b4 + 0x7338722)) <<\n                                        (0x1d3 * -0x6 + 0x1 * 0x171b + 0x406 * -0x3)) |\n                                        (_0x3952af >>> (0x3c1 + -0x1cbf + 0x1907))) +\n                                        _0x2a0c94) <<\n                                    (0x1b73 + 0x1d44 + 0x38b7 * -0x1)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x113678 =\n                                            (_0x39eb64 =\n                                                ((((_0x39eb64 +=\n                                                    ((_0x2fd641 = _0x3952af ^ _0x2a0c94) ^\n                                                        (_0x227f23 =\n                                                            ((((_0x227f23 +=\n                                                                (_0x2fd641 ^ _0x39eb64) +\n                                                                _0x128d32[0x30b * 0x2 + 0xa52 + -0x105f] -\n                                                                (0x131 * 0x25e655 + -0xe61e * 0x48b + 0xe5c * -0x33bb)) <<\n                                                                (0x17a1 + -0x26 * 0x3f + 0x3 * -0x4c1)) |\n                                                                (_0x227f23 >>> (0x1079 + -0x13 * 0xf5 + 0x1d2))) +\n                                                                _0x3952af) <<\n                                                            (-0xf27 + -0x1 * -0x21d1 + 0x955 * -0x2))) +\n                                                    _0x128d32[0x20e * -0x3 + -0x4a7 * 0x8 + 0x2b6e] -\n                                                    (0x1 * 0x79f0ea3 + -0x184cea1d + -0x11d * -0x2590d9)) <<\n                                                    (0x12e3 + 0x12b * -0x2 + -0x1082)) |\n                                                    (_0x39eb64 >>> (-0x485 * 0x2 + -0x61 * 0x1a + 0x12f9))) +\n                                                    _0x227f23) <<\n                                                (0x1 * -0x34c + -0x6 * 0x4dc + -0x1 * -0x2074)) ^ _0x227f23) ^\n                                            (_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x113678 ^ _0x3952af) +\n                                                    _0x128d32[-0x3e3 + 0x22d * -0x2 + 0x84c] +\n                                                    (-0xdb8446c + -0x1 * -0x5cb3a83 + 0x278f86e1)) <<\n                                                    (-0x7 * -0x3f1 + 0x17f * 0x7 + -0x2600)) |\n                                                    (_0x2a0c94 >>> (-0x47e + 0xce * 0x2 + 0x2 * 0x179))) +\n                                                    _0x39eb64) <<\n                                                (0x1 * 0x9fe + 0x1 * 0x17f5 + -0x21f3))) +\n                                        _0x128d32[-0x18 * -0x18e + -0x1dff + -0x74f * 0x1] -\n                                        (0x12fee507 + -0x1 * 0x6a5c4769 + -0x1 * -0x92b10bfd)) <<\n                                        (0x5 * -0x52a + -0x1e75 + 0xde * 0x41)) |\n                                        (_0x3952af >>> (0x116b + -0x1 * 0x9ed + 0x53 * -0x17))) +\n                                        _0x2a0c94) <<\n                                    (0x264e * -0x1 + -0x11fd + 0x384b)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    ((_0x227f23 =\n                                                        ((((_0x227f23 +=\n                                                            (_0x2a0c94 ^ (_0x3952af | ~_0x39eb64)) +\n                                                            _0x128d32[-0x1524 + 0x65 * 0x5b + 0x1 * -0xec3] -\n                                                            (0x63c0c3 * 0x1f + 0x11a61fd * -0xc + -0xcff1dfb * -0x1)) <<\n                                                            (0x36c + -0x4eb * 0x5 + 0x1531)) |\n                                                            (_0x227f23 >>> (-0x941 * -0x2 + -0x1b * -0x9b + -0x22c1))) +\n                                                            _0x3952af) <<\n                                                        (0x1862 + -0x1359 + -0x509)) |\n                                                        ~_0x2a0c94)) +\n                                                _0x128d32[-0x26d + -0x6 * 0xbd + 0x6e2] +\n                                                (-0x690c7 * 0xd6d + 0x2c437c8e * 0x1 + -0x3786a162 * -0x2)) <<\n                                                (0x54a + -0x1bd3 + 0x1693)) |\n                                                (_0x39eb64 >>> (0x1076 + 0xa0d + -0x1a6d))) +\n                                                _0x227f23) <<\n                                            (-0x1d37 + 0x1 * 0x14fb + 0x83c)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x227f23 ^ (_0x39eb64 | ~_0x3952af)) +\n                                                    _0x128d32[0x190f * -0x1 + -0x1503 + 0x2e20] -\n                                                    (0x12aa3 * 0x80ad + 0x5 * 0x123e2fa3 + -0x9ce661fd)) <<\n                                                    (-0x204a + -0x22cf + 0x4328)) |\n                                                    (_0x2a0c94 >>> (0x1 * 0xcac + -0x1bbf * -0x1 + -0x142d * 0x2))) +\n                                                    _0x39eb64) <<\n                                                (-0x11b4 + 0x10b1 * 0x1 + -0x25 * -0x7)) |\n                                                ~_0x227f23)) +\n                                        _0x128d32[0x1 * -0x10d + 0x5f4 + -0x19 * 0x32] -\n                                        (0x2181582 + -0x55ca10e + 0x6b0eb53)) <<\n                                        (-0xd3d * 0x1 + -0x1dd7 + -0x1 * -0x2b29)) |\n                                        (_0x3952af >>> (0x676 + 0xa84 * 0x1 + -0x10ef))) +\n                                        _0x2a0c94) <<\n                                    (-0x2 * 0xc83 + 0x15 * -0x10c + -0x1781 * -0x2)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    ((_0x227f23 =\n                                                        ((((_0x227f23 +=\n                                                            (_0x2a0c94 ^ (_0x3952af | ~_0x39eb64)) +\n                                                            _0x128d32[0x2 * -0x527 + 0x246c + -0x8e * 0x2f] +\n                                                            (0x62359ef1 + 0xc3bd213a + -0xc0976668)) <<\n                                                            (-0x22fa * 0x1 + 0x2af + 0x2051)) |\n                                                            (_0x227f23 >>> (-0x92b + -0x4b4 * 0x1 + 0xdf9))) +\n                                                            _0x3952af) <<\n                                                        (0x494 + -0x1902 + -0x1 * -0x146e)) |\n                                                        ~_0x2a0c94)) +\n                                                _0x128d32[0x1d8 * 0x1 + 0x1 * -0x5ce + 0x3f9] -\n                                                (-0x324 * -0x49722 + 0xde * 0x31ad3b + -0x1bba29be * -0x2)) <<\n                                                (0x941 + -0x1651 + -0x4e * -0x2b)) |\n                                                (_0x39eb64 >>> (0x2 * -0xc2 + -0x112a + 0x12c4))) +\n                                                _0x227f23) <<\n                                            (0x1369 + -0x1261 + -0x3 * 0x58)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x227f23 ^ (_0x39eb64 | ~_0x3952af)) +\n                                                    _0x128d32[0x10c5 + 0x78f + 0x1 * -0x184a] -\n                                                    (-0x3b62a * 0x6 + 0x15245b + 0x89612 * 0x2)) <<\n                                                    (0x252f + -0x5 * -0x661 + -0x4505)) |\n                                                    (_0x2a0c94 >>> (0x251e + 0x6 * 0x2b7 + -0x3557 * 0x1))) +\n                                                    _0x39eb64) <<\n                                                (-0x1 * -0xa79 + -0x8d * -0x33 + -0x2690)) |\n                                                ~_0x227f23)) +\n                                        _0x128d32[0x395 * 0x8 + -0x24a9 + -0x52 * -0x19] -\n                                        (-0xc3191853 + -0x57fdcd8 * 0x29 + -0x141d00ee * -0x1b)) <<\n                                        (0x132b * -0x1 + -0x13 * -0x15 + 0x11b1)) |\n                                        (_0x3952af >>> (-0x175f + 0x16 * 0xc2 + -0x2 * -0x35f))) +\n                                        _0x2a0c94) <<\n                                    (-0xc * -0x2de + -0x1 * -0x261a + 0x1 * -0x4882)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    ((_0x227f23 =\n                                                        ((((_0x227f23 +=\n                                                            (_0x2a0c94 ^ (_0x3952af | ~_0x39eb64)) +\n                                                            _0x128d32[0x4 * -0x527 + -0xb71 + 0x2015 * 0x1] +\n                                                            (0x2 * -0x2405587c + 0x963dc885 * 0x1 + 0x217566c2)) <<\n                                                            (0x14cb + -0x647 * -0x1 + -0x1b0c)) |\n                                                            (_0x227f23 >>> (-0xbd * 0x30 + -0x13 * 0x14f + 0x7 * 0x8a1))) +\n                                                            _0x3952af) <<\n                                                        (-0xd * 0x215 + 0xcc + 0x1a45)) |\n                                                        ~_0x2a0c94)) +\n                                                _0x128d32[-0x638 * 0x6 + -0x25fa + 0x4b59] -\n                                                (0xab1cd2 + -0x184b1f6 + 0x2acae44)) <<\n                                                (-0x177b + -0x500 + 0x1c85)) |\n                                                (_0x39eb64 >>> (-0x1e73 + -0x3 * 0x1f1 + -0x2 * -0x122e))) +\n                                                _0x227f23) <<\n                                            (0xb5 * -0x3 + 0x158f + -0x4 * 0x4dc)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x227f23 ^ (_0x39eb64 | ~_0x3952af)) +\n                                                    _0x128d32[-0xe39 + 0x452 + 0x9ed] -\n                                                    (0x5a22d2a4 + 0x3a146128 + 0x154a34 * -0x298)) <<\n                                                    (0x1 * -0x1fd0 + 0x1837 * 0x1 + 0x7a8)) |\n                                                    (_0x2a0c94 >>> (0x1212 + 0x2 * -0xc47 + 0x68d))) +\n                                                    _0x39eb64) <<\n                                                (-0x20ba + 0xbb2 + -0x8 * -0x2a1)) |\n                                                ~_0x227f23)) +\n                                        _0x128d32[0x283 * 0x8 + -0x5f * 0x37 + 0x5e] +\n                                        (-0x15db9faa + 0x3841d * -0x1db3 + 0xcc505a92)) <<\n                                        (-0x172f + -0x5f * -0x1 + 0x16e5)) |\n                                        (_0x3952af >>> (0x6c + 0x2 * 0x530 + 0xac1 * -0x1))) +\n                                        _0x2a0c94) <<\n                                    (0x3 * 0x312 + 0x19 * -0x107 + 0x1079)),\n                                (_0x3952af =\n                                    ((((_0x3952af +=\n                                        ((_0x39eb64 =\n                                            ((((_0x39eb64 +=\n                                                (_0x3952af ^\n                                                    ((_0x227f23 =\n                                                        ((((_0x227f23 +=\n                                                            (_0x2a0c94 ^ (_0x3952af | ~_0x39eb64)) +\n                                                            _0x128d32[-0x5bc + -0x1 * -0x887 + -0x1 * 0x2c7] -\n                                                            (0xd0d1959 + 0x9a4d1b1 + -0xe05698c)) <<\n                                                            (0x3 * 0x6a7 + 0x252e + -0x391d)) |\n                                                            (_0x227f23 >>> (-0x2292 + -0x1385 + 0x1 * 0x3631))) +\n                                                            _0x3952af) <<\n                                                        (-0x2483 * -0x1 + 0x93e + 0xd * -0x385)) |\n                                                        ~_0x2a0c94)) +\n                                                _0x128d32[-0x1fd2 + 0x1bb0 + -0x1 * -0x42d] -\n                                                (-0x9b7 * 0xd9fae + -0x9fdcf8b * -0x7 + 0xb3bb54 * 0xb8)) <<\n                                                (0x1f * 0xec + -0x260 + -0x18a * 0x11)) |\n                                                (_0x39eb64 >>> (0x140 * -0x6 + 0x2231 * -0x1 + 0x29c7))) +\n                                                _0x227f23) <<\n                                            (0x26ef * -0x1 + -0x112b + 0x2b * 0x14e)) ^\n                                            ((_0x2a0c94 =\n                                                ((((_0x2a0c94 +=\n                                                    (_0x227f23 ^ (_0x39eb64 | ~_0x3952af)) +\n                                                    _0x128d32[-0x1 * -0x100d + 0xdc0 + -0x1d * 0x107] +\n                                                    (0x43dc7475 + 0x524cbd91 + -0x82661 * 0xd2b)) <<\n                                                    (-0x1f * -0xf + -0x1d3a + -0x1 * -0x1b78)) |\n                                                    (_0x2a0c94 >>> (0x235b + 0x162b + -0x3975))) +\n                                                    _0x39eb64) <<\n                                                (-0xf * -0x27b + -0xc58 + -0x18dd)) |\n                                                ~_0x227f23)) +\n                                        _0x128d32[-0x72 * -0x1f + 0xac4 + -0x1889] -\n                                        (0xa * -0x3c812a2 + -0x2c * 0x1bc4a2 + -0x3 * -0x15053b89)) <<\n                                        (0x4 * 0x9c2 + -0xd46 * 0x2 + -0xc67)) |\n                                        (_0x3952af >>> (-0x8b9 + -0x1ed3 * 0x1 + -0x1 * -0x2797))) +\n                                        _0x2a0c94) <<\n                                    (-0x1 * -0xede + 0x15d3 + -0x1f * 0x12f)),\n                                this['first']\n                                    ? ((this['h0'] =\n                                        (_0x227f23 + (-0x295123b + 0xc62a6020 * 0x1 + -0x22 * 0x2b71052)) << (-0x2 * -0x602 + -0x1 * 0x12c2 + 0x6be)),\n                                        (this['h1'] = (_0x3952af - (0x3a5b52c + 0x1d978e61 + 0x7 * -0x26f46ba)) << (0x5ea * 0x4 + 0xe5 + -0x4e9 * 0x5)),\n                                        (this['h2'] = (_0x2a0c94 - (0xa6be44c7 + 0xc54d85a4 + -0x104c6a769)) << (0x6d * 0x53 + 0x1809 + -0x3b60)),\n                                        (this['h3'] =\n                                            (_0x39eb64 + (-0x1fdbc0b + 0x1 * 0x1a1047ff + 0x85f6 * -0xf0d)) << (0x26e8 + -0x5d * 0x1f + 0x151 * -0x15)),\n                                        (this[_0x2f0149(0x19f)] = !(0x25a2 + -0x5 * 0x1d5 + -0x38f * 0x8)))\n                                    : ((this['h0'] = (this['h0'] + _0x227f23) << (0x923 + 0xb1c + -0x143f)),\n                                        (this['h1'] = (this['h1'] + _0x3952af) << (-0x23 * 0xc0 + 0x1aef + -0xaf)),\n                                        (this['h2'] = (this['h2'] + _0x2a0c94) << (-0x1b53 + -0x1acc + -0xa3 * -0x55)),\n                                        (this['h3'] = (this['h3'] + _0x39eb64) << (-0xba0 * 0x1 + 0x146 + 0xa * 0x109)))\n                        }),\n                        (_0x22f902[_0x2db296(0x344)]['hex'] = function () {\n                            this['finalize']()\n                            var _0x58d18c = this['h0'],\n                                _0x4e2807 = this['h1'],\n                                _0x41534b = this['h2'],\n                                _0x136921 = this['h3']\n                            return (\n                                _0x142491[(_0x58d18c >> (0x3cb * -0x4 + -0x6e * -0x3 + 0xde6)) & (0x3b * 0x47 + 0x1567 + -0x25b5)] +\n                                _0x142491[(-0x1731 + -0x16e + 0x9 * 0x2be) & _0x58d18c] +\n                                _0x142491[(_0x58d18c >> (-0xa78 + 0x18d4 + 0xe5 * -0x10)) & (0x81e + -0x6 * 0x529 + 0x16e7)] +\n                                _0x142491[(_0x58d18c >> (0x1894 + -0x3c + -0x1850)) & (-0x2228 * -0x1 + 0x3 * 0x4ff + -0x3116)] +\n                                _0x142491[(_0x58d18c >> (-0x67 * -0x1 + -0x1842 + 0x17ef)) & (0x580 * -0x6 + 0x1b * 0x171 + -0x5dc)] +\n                                _0x142491[(_0x58d18c >> (-0x1 * -0x709 + 0x1594 + -0x1 * 0x1c8d)) & (0x1633 + -0x70d + -0xf17)] +\n                                _0x142491[(_0x58d18c >> (-0xaf6 + 0x1ddb * 0x1 + -0x12c9)) & (-0x4b * 0x7b + 0x5 * 0x41b + 0xf91)] +\n                                _0x142491[(_0x58d18c >> (-0x1 * 0x1543 + -0x1795 * -0x1 + -0x23a)) & (-0x1e70 + 0xcc5 + -0x11ba * -0x1)] +\n                                _0x142491[(_0x4e2807 >> (0x651 + -0x10f7 * -0x2 + -0x283b)) & (0x1199 + -0x47 * -0x59 + -0x2a39)] +\n                                _0x142491[(0xe3 * -0x22 + 0x2479 + 0x644 * -0x1) & _0x4e2807] +\n                                _0x142491[(_0x4e2807 >> (0x121a + 0x1a84 + -0x2c92)) & (-0x65 * -0x4a + -0x5db + -0x1748)] +\n                                _0x142491[(_0x4e2807 >> (0x14a3 + -0x11 * 0x55 + -0x5 * 0x2fe)) & (-0x24e3 * -0x1 + 0xf64 + -0x3438)] +\n                                _0x142491[(_0x4e2807 >> (0x1cf + -0x1c89 + -0x2 * -0xd67)) & (-0xd47 * -0x2 + -0x1 * 0x221b + 0x1e7 * 0x4)] +\n                                _0x142491[(_0x4e2807 >> (0x673 + 0x1d12 + -0x1 * 0x2375)) & (0x12ce + -0x8 * -0xb5 + -0x1867)] +\n                                _0x142491[(_0x4e2807 >> (0x1 * 0x1499 + 0x1a6b * 0x1 + -0x98 * 0x4f)) & (0x1516 + -0x147 * -0x2 + -0x1795 * 0x1)] +\n                                _0x142491[(_0x4e2807 >> (0x4 * 0x570 + -0x2 * 0x622 + -0x2 * 0x4b2)) & (-0x6 * -0x15d + -0x7eb + -0x34)] +\n                                _0x142491[(_0x41534b >> (0x1738 + -0x6 * 0x23b + -0x3 * 0x346)) & (-0x97 * -0x3a + 0x3a6 + -0x25cd)] +\n                                _0x142491[(-0x48 * -0x11 + 0x1 * -0x2502 + 0x13 * 0x1b3) & _0x41534b] +\n                                _0x142491[(_0x41534b >> (-0x1 * -0x1556 + 0x3 * 0x623 + -0x27b3 * 0x1)) & (-0x6b * 0x1f + 0x1 * -0x49 + -0x3 * -0x46f)] +\n                                _0x142491[(_0x41534b >> (-0x794 + -0x1 * 0x2443 + 0x2bdf)) & (0x26ca + -0xb02 + 0x2f * -0x97)] +\n                                _0x142491[(_0x41534b >> (0x177f + -0x57b + -0x11f * 0x10)) & (0x1eed + 0xbb2 + -0x2a90)] +\n                                _0x142491[(_0x41534b >> (0xab7 * -0x2 + 0x3ba + 0x11c4)) & (-0x1621 + 0xa3f * 0x2 + -0xd9 * -0x2)] +\n                                _0x142491[(_0x41534b >> (0x607 + -0x2065 + 0x1a7a)) & (0x2 * -0xb0f + 0x629 * -0x5 + 0x1a7d * 0x2)] +\n                                _0x142491[(_0x41534b >> (-0x2205 + 0x20ac + 0x171)) & (-0x1 * -0x1337 + 0x6e * -0x1 + -0x22 * 0x8d)] +\n                                _0x142491[(_0x136921 >> (-0x845 + -0x1 * 0x267b + 0x1762 * 0x2)) & (0x340 + -0x21 * 0xcb + 0x16fa)] +\n                                _0x142491[(0x4 * -0x8e2 + -0xdea + 0x3181) & _0x136921] +\n                                _0x142491[(_0x136921 >> (0x1784 + 0xa * 0x31b + -0x1 * 0x3686)) & (-0x26 * 0x4f + -0x1 * -0xca8 + 0xdf * -0x1)] +\n                                _0x142491[(_0x136921 >> (0x1823 * -0x1 + 0xe5c * -0x2 + 0x1 * 0x34e3)) & (0x34e * 0x6 + 0x47f + -0x1844 * 0x1)] +\n                                _0x142491[(_0x136921 >> (0x1 * -0x10af + 0x39a + 0xd29)) & (-0xea2 + 0x2 * -0xad2 + 0x2455)] +\n                                _0x142491[(_0x136921 >> (0xadf + 0x2db * -0x7 + 0x92e)) & (-0x493 * 0x3 + 0x15e1 + -0x819)] +\n                                _0x142491[(_0x136921 >> (-0x22d6 + 0x20 * -0x17 + 0x25d2)) & (-0x17 * 0x83 + 0x1214 + -0x640)] +\n                                _0x142491[(_0x136921 >> (-0x96e + -0x1e99 + 0x281f)) & (-0x18c8 + 0x33 * 0x89 + -0x274)]\n                            )\n                        }),\n                        (_0x22f902['prototype'][_0x2db296(0x3ae)] = _0x22f902[_0x2db296(0x344)]['hex']),\n                        (_0x22f902[_0x2db296(0x344)]['digest'] = function () {\n                            var _0x5a0a9e = _0x2db296\n                            this[_0x5a0a9e(0x1d9)]()\n                            var _0x2a8796 = this['h0'],\n                                _0x2d7c31 = this['h1'],\n                                _0x1378d3 = this['h2'],\n                                _0x2e667f = this['h3']\n                            return [\n                                (0x1 * 0x4bd + 0x1f15 + 0x5 * -0x6f7) & _0x2a8796,\n                                (_0x2a8796 >> (0xbcd + -0x25f7 + 0x1a32)) & (0x1507 + -0x177d + 0x1 * 0x375),\n                                (_0x2a8796 >> (-0x141c + 0x1ae2 + -0x6b6)) & (0x132a + -0x3 * 0x423 + 0xb * -0x86),\n                                (_0x2a8796 >> (-0x1 * -0x261f + 0x115 * -0xc + -0x190b)) & (0x1233 * -0x1 + 0xacf * -0x3 + 0x339f),\n                                (-0x16a0 + 0x1002 + 0x79d * 0x1) & _0x2d7c31,\n                                (_0x2d7c31 >> (-0x2 * 0xff4 + -0x541 * 0x2 + -0xe26 * -0x3)) & (0x54e + -0x1c * -0x148 + -0x282f * 0x1),\n                                (_0x2d7c31 >> (-0x4 * -0x83f + 0x20ab * -0x1 + -0x41)) & (0x427 * 0x5 + 0xdd1 + -0x2195 * 0x1),\n                                (_0x2d7c31 >> (0xf * -0x201 + 0x1c26 + -0x9 * -0x39)) & (0x7 * -0x235 + 0x1be + 0xeb4 * 0x1),\n                                (0x34 * 0x9b + 0xa36 + -0x28b3) & _0x1378d3,\n                                (_0x1378d3 >> (0x463 * 0x1 + -0x1f0d + 0x1ab2)) & (0x13 * -0x17f + -0x536 + 0x22a2),\n                                (_0x1378d3 >> (0x4a7 + -0x1a4 + -0x2f3)) & (0x1066 + 0xb3d + -0x1aa4),\n                                (_0x1378d3 >> (-0xc00 + -0x2 * 0xfcb + 0x2bae)) & (0x11a7 * -0x1 + 0x3a1 * -0x1 + 0x1647),\n                                (-0xa38 + -0x1304 + 0x1e3b) & _0x2e667f,\n                                (_0x2e667f >> (0x1102 + 0x1896 + -0x2f8 * 0xe)) & (-0x15b2 * -0x1 + -0xa6 * 0x31 + -0xf * -0xbd),\n                                (_0x2e667f >> (0x25a2 + -0x4 * 0x103 + -0x2186)) & (-0xa83 * -0x3 + -0x15f1 + -0x899),\n                                (_0x2e667f >> (0xb95 * 0x3 + -0x1a34 + -0x873)) & (0xfb6 * -0x2 + 0x3b * 0x3a + 0x130d)\n                            ]\n                        }),\n                        (_0x22f902[_0x2db296(0x344)][_0x2db296(0x238)] = _0x22f902['prototype'][_0x2db296(0x19b)]),\n                        (_0x22f902['prototype'][_0x2db296(0x249)] = function () {\n                            var _0x45ab2e = _0x2db296\n                            this[_0x45ab2e(0x1d9)]()\n                            var _0x31d586 = new ArrayBuffer(0x13 * -0x20e + -0x4 * -0x62f + 0xe5e),\n                                _0x2d9fbd = new Uint32Array(_0x31d586)\n                            return (\n                                (_0x2d9fbd[-0xbcc + -0xf5 * -0x3 + -0x5 * -0x1c9] = this['h0']),\n                                (_0x2d9fbd[0x5 * 0x103 + 0x26ee + -0x2bfc] = this['h1']),\n                                (_0x2d9fbd[0x7d + -0x1b05 * -0x1 + -0x1b80] = this['h2']),\n                                (_0x2d9fbd[0x1 * 0x1c1c + 0x1 * 0x4eb + -0x2104] = this['h3']),\n                                _0x31d586\n                            )\n                        }),\n                        (_0x22f902['prototype']['buffer'] = _0x22f902[_0x2db296(0x344)][_0x2db296(0x249)]),\n                        (_0x22f902[_0x2db296(0x344)][_0x2db296(0x25f)] = function () {\n                            var _0x16e12f = _0x2db296\n                            for (\n                                var _0x1dad5c,\n                                _0x24f20d,\n                                _0x70d99b,\n                                _0xb48dfc = '',\n                                _0x13e0cb = this[_0x16e12f(0x238)](),\n                                _0x12e65e = -0x719 * -0x5 + -0x747 * -0x5 + 0x170 * -0x32;\n                                _0x12e65e < -0x8c + 0x164f + -0x15b4;\n\n                            )\n                                (_0x1dad5c = _0x13e0cb[_0x12e65e++]),\n                                    (_0x24f20d = _0x13e0cb[_0x12e65e++]),\n                                    (_0x70d99b = _0x13e0cb[_0x12e65e++]),\n                                    (_0xb48dfc +=\n                                        _0xcb4d61[_0x1dad5c >>> (0x13b + 0x209 * -0xb + 0x152a)] +\n                                        _0xcb4d61[\n                                        (0x13d3 + 0x4c7 + -0x185b) &\n                                        ((_0x1dad5c << (0x1334 + 0x1dd7 + 0x7 * -0x701)) |\n                                            (_0x24f20d >>> (-0x3b3 * 0xa + -0x17b * -0x13 + -0x1 * -0x8e1)))\n                                        ] +\n                                        _0xcb4d61[\n                                        (-0x25dd + 0x14bd + 0x115f) &\n                                        ((_0x24f20d << (-0x787 + 0x888 + -0xff)) | (_0x70d99b >>> (0xe74 + -0x104f + 0xd * 0x25)))\n                                        ] +\n                                        _0xcb4d61[(0x68e + -0x1082 + -0x175 * -0x7) & _0x70d99b])\n                            return (\n                                (_0x1dad5c = _0x13e0cb[_0x12e65e]),\n                                (_0xb48dfc +=\n                                    _0xcb4d61[_0x1dad5c >>> (0x2b * -0x77 + 0x29e * 0x2 + 0xec3)] +\n                                    _0xcb4d61[(_0x1dad5c << (-0x14c0 + -0x2 * -0x11a4 + 0x2 * -0x742)) & (0xe5f + -0x1dab + 0xf8b * 0x1)] +\n                                    '==')\n                            )\n                        })\n                    var _0x336469 = _0x1edabb()\n                    _0x299a21\n                        ? (_0xb9c7d1[_0x2db296(0x1b8)] = _0x336469)\n                        : ((_0x11d177[_0x2db296(0x35c)] = _0x336469),\n                            _0x5efc8f &&\n                            (void (0x1118 + -0x25 * 0x98 + 0x1a0 * 0x3))(function () {\n                                return _0x336469\n                            }))\n                })()\n            })\n\n            function _0x5dd467(_0x2e8eb5) {\n                var _0x344c50 = _0x5612de\n                return w_0x5c3140(\n                    _0x344c50(0x333),\n                    {\n                        get 0x0() {\n                            return _0x90795\n                        },\n                        0x1: arguments,\n                        0x2: _0x2e8eb5\n                    },\n                    this\n                )\n            }\n\n            function _0x176a57() {\n                var _0x33742c = _0x5612de\n                return !!document[_0x33742c(0x373)]\n            }\n\n            function _0x1230e7() {\n                return 'undefined' != typeof InstallTrigger\n            }\n\n            function _0xf8ccf1() {\n                var _0x25d57d = _0x5612de\n                return (\n                    /constructor/i[_0x25d57d(0x22b)](window['HTMLElement']) ||\n                    _0x25d57d(0x226) === (!window['safari'] || (_0x25d57d(0x384) != typeof safari && safari['pushNotification']))[_0x25d57d(0x3ae)]()\n                )\n            }\n\n            function _0x30c916() {\n                var _0x56f7c2 = _0x5612de\n                return new Date()[_0x56f7c2(0x16d)]()\n            }\n\n            function _0x5af46a(_0xeaff35) {\n                return null == _0xeaff35 ? '' : 'boolean' == typeof _0xeaff35 ? (_0xeaff35 ? '1' : '0') : _0xeaff35\n            }\n\n            function _0x325f58(_0x3fdcb7, _0x2838bc) {\n                var _0x17d12c = _0x5612de\n                _0x2838bc || (_0x2838bc = _0x17d12c(0x24c))\n                for (var _0x3b8f2c = '', _0x98f0de = _0x3fdcb7; _0x98f0de > -0x2 * -0x90e + 0x4 * -0x3ae + -0x364; --_0x98f0de)\n                    _0x3b8f2c += _0x2838bc[Math[_0x17d12c(0x1cf)](Math['random']() * _0x2838bc[_0x17d12c(0x259)])]\n                return _0x3b8f2c\n            }\n\n            var _0x39693d = {\n                sec: 0x9,\n                asgw: 0x5,\n                init: 0x0\n            },\n                _0x6caf = {\n                    bogusIndex: 0x0,\n                    msNewTokenList: [],\n                    moveList: [],\n                    clickList: [],\n                    keyboardList: [],\n                    activeState: [],\n                    aidList: []\n                }\n\n            function _0x53b77d(_0x357347) {\n                return w_0x5c3140(\n                    '484e4f4a403f5243001714366d6da13c00000025f8c25369000000ee00110307070002161103021200031103070700021303062b2f11030207000335490700044211010044001400011101014a1200001100010700010d05000000003c000e00054303491101034a12000607000711000143024911010433000611010412000833000911010412000812000947002100110107070002161101021200031101070700021303062b2f110102070003354902110105430047004f11010433002511010412000a11010412000b190400962934001111010412000c11010412000d190400962947002100110107070002161101021200031101070700021303062b2f11010207000335490842000e0e7170737c7b7045677a657067616c027c7108717077607272706707707b63767a71700003727061047c7b737a02307607767a7b667a797007737c67707760720a7a60617067427c71617d0a7c7b7b7067427c71617d0b7a606170675d707c727d610b7c7b7b70675d707c727d61',\n                    {\n                        get 0x0() {\n                            return Image\n                        },\n                        0x1: Object,\n                        get 0x2() {\n                            return _0x6caf\n                        },\n                        get 0x3() {\n                            return console\n                        },\n                        get 0x4() {\n                            return window\n                        },\n                        get 0x5() {\n                            return _0x1230e7\n                        },\n                        0x6: arguments,\n                        0x7: _0x357347\n                    },\n                    this\n                )\n            }\n\n            function _0x3ed707() {\n                var _0x2077c7 = _0x5612de\n                return w_0x5c3140(\n                    _0x2077c7(0x31d),\n                    {\n                        get 0x0() {\n                            return navigator\n                        },\n                        get 0x1() {\n                            var _0x573a52 = _0x2077c7\n                            return _0x573a52(0x384) != typeof global ? global : void (-0x11 * -0x1cf + 0x95 * 0x16 + -0x1 * 0x2b8d)\n                        },\n                        0x2: Object,\n                        get 0x3() {\n                            var _0x4b9092 = _0x2077c7\n                            return _0x4b9092(0x384) != typeof process ? process : void (-0x65 * 0x2 + 0x2579 * 0x1 + -0x1 * 0x24af)\n                        },\n                        get 0x4() {\n                            return _0x1db123\n                        },\n                        0x5: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x328bde(_0xacb410, _0x4ed7bd, _0x49d137) {\n                var _0x197e65 = _0x5612de,\n                    _0x2d8b28 = _0x197e65(0x2ce),\n                    _0x4dd4b8 = '='\n                _0x49d137 && (_0x4dd4b8 = ''), _0x4ed7bd && (_0x2d8b28 = _0x4ed7bd)\n                for (\n                    var _0x1aa067, _0x3b8c55 = '', _0x2d1a36 = 0xe0f * 0x2 + -0x35b * -0x8 + 0x29e * -0x15;\n                    _0xacb410[_0x197e65(0x259)] >= _0x2d1a36 + (0x73 * -0x26 + -0xb4e + 0x1c63);\n\n                )\n                    (_0x1aa067 =\n                        (((-0x1cb9 + 0x2c6 + -0x1 * -0x1af2) & _0xacb410[_0x197e65(0x195)](_0x2d1a36++)) << (0x1de9 + 0x1c + -0x1 * 0x1df5)) |\n                        (((-0x1 * 0xd91 + -0x23a + 0x10ca) & _0xacb410[_0x197e65(0x195)](_0x2d1a36++)) << (-0x16 * 0x135 + 0x9e2 * 0x3 + -0x188 * 0x2)) |\n                        ((-0x752 + -0x2 * 0xaf3 + 0x1e37) & _0xacb410[_0x197e65(0x195)](_0x2d1a36++))),\n                        (_0x3b8c55 += _0x2d8b28[_0x197e65(0x25c)](\n                            ((0x1c78125 + -0x1df1122 + -0xb * -0x190d17) & _0x1aa067) >> (0x59 * 0x4f + -0x1176 + -0x1 * 0x9ef)\n                        )),\n                        (_0x3b8c55 += _0x2d8b28['charAt'](\n                            ((-0x1 * 0x13b6b + -0x13 * -0x65aa + -0x26033) & _0x1aa067) >> (0x17ea * -0x1 + 0xef7 + 0x8ff)\n                        )),\n                        (_0x3b8c55 += _0x2d8b28['charAt'](\n                            ((-0x1 * 0x16bd + 0x115 + 0x10a * 0x24) & _0x1aa067) >> (0x29c * -0x1 + -0x1 * 0x1475 + 0x1717)\n                        )),\n                        (_0x3b8c55 += _0x2d8b28[_0x197e65(0x25c)]((-0xc * 0x196 + 0x1fae + -0xc67) & _0x1aa067))\n                return (\n                    _0xacb410[_0x197e65(0x259)] - _0x2d1a36 > -0x69f + -0x1 * 0xe5c + 0x14fb &&\n                    ((_0x1aa067 =\n                        (((0x740 + -0x1ed1 + 0x1890) & _0xacb410['charCodeAt'](_0x2d1a36++)) << (-0x7 * 0xec + 0x2167 * 0x1 + -0x1ae3)) |\n                        (_0xacb410['length'] > _0x2d1a36\n                            ? ((0x16aa + -0x762 * 0x1 + -0xe49) & _0xacb410[_0x197e65(0x195)](_0x2d1a36)) << (0x1af7 + -0x26be + 0xbcf)\n                            : 0x1 * -0x649 + -0x1 * 0xe16 + 0x2e9 * 0x7)),\n                        (_0x3b8c55 += _0x2d8b28[_0x197e65(0x25c)](\n                            ((-0x1 * 0x484e9 + -0x13c88 * -0x4a + -0x28bd * -0x40d) & _0x1aa067) >> (0x6c * -0x4a + -0x81c * -0x2 + 0xf12)\n                        )),\n                        (_0x3b8c55 += _0x2d8b28['charAt'](((-0x1ad98 + 0x1a5c8 + 0x3f7d0) & _0x1aa067) >> (0x1f95 + -0x1c06 + -0x383))),\n                        (_0x3b8c55 +=\n                            _0xacb410['length'] > _0x2d1a36\n                                ? _0x2d8b28[_0x197e65(0x25c)](((-0x2447 + -0x1 * -0x1efe + 0x1509) & _0x1aa067) >> (0x1d66 + 0x2 * 0x202 + -0x2164))\n                                : _0x4dd4b8),\n                        (_0x3b8c55 += _0x4dd4b8)),\n                    _0x3b8c55\n                )\n            }\n\n            function _0x389396(_0x49fdfd, _0x32eedf) {\n                var _0x36dcb8 = _0x5612de\n                return w_0x5c3140(\n                    _0x36dcb8(0x3ad),\n                    {\n                        0x0: arguments,\n                        0x1: _0x49fdfd,\n                        0x2: _0x32eedf\n                    },\n                    this\n                )\n            }\n\n            function _0x3262d3(_0xb01975) {\n                var _0x55341a = _0x5612de\n                return _0x55341a(0x315)[_0x55341a(0x2c5)](_0xb01975)\n            }\n\n            function _0xb5350b(_0x1289f5) {\n                var _0x341e09 = _0x5612de,\n                    _0x5b1849,\n                    _0x40ad1e,\n                    _0x341488,\n                    _0x5980c5,\n                    _0x31f759,\n                    _0x5bebd7 = ''\n                for (\n                    _0x5b1849 = 0x13d5 + -0xc4f * 0x1 + -0x786;\n                    _0x5b1849 < _0x1289f5[_0x341e09(0x259)] - (0xe50 * 0x1 + 0x17f3 + -0x2640);\n                    _0x5b1849 += -0xeed + 0x1 * 0x10c0 + -0x1cf * 0x1\n                )\n                    (_0x40ad1e = _0x3262d3(_0x1289f5[_0x341e09(0x25c)](_0x5b1849))),\n                        (_0x341488 = _0x3262d3(_0x1289f5[_0x341e09(0x25c)](_0x5b1849 + (0x1103 + 0xa86 + 0x1 * -0x1b88)))),\n                        (_0x5980c5 = _0x3262d3(_0x1289f5[_0x341e09(0x25c)](_0x5b1849 + (-0x1c54 + -0xf15 + 0x2b6b)))),\n                        (_0x31f759 = _0x3262d3(_0x1289f5['charAt'](_0x5b1849 + (0xd1a + 0x1 * -0x175d + -0x5 * -0x20e)))),\n                        (_0x5bebd7 += String[_0x341e09(0x1e2)](\n                            (_0x40ad1e << (0x33 * -0x3f + 0xe73 * -0x2 + 0x2975)) | (_0x341488 >>> (0x12d2 + 0x851 + -0x1b1f))\n                        )),\n                        '=' !== _0x1289f5[_0x341e09(0x25c)](_0x5b1849 + (0x51 * -0x25 + -0x21d * 0x12 + 0x31c1 * 0x1)) &&\n                        (_0x5bebd7 += String['fromCharCode'](\n                            ((_0x341488 << (-0xa0c + 0xee3 + -0x4d3)) & (0x1 * 0x397 + -0x113f + 0xe98)) |\n                            ((_0x5980c5 >>> (0x2161 + 0x1b7 * -0x5 + 0xc66 * -0x2)) & (0x22bb + -0xf08 + 0x6 * -0x346))\n                        )),\n                        '=' !== _0x1289f5[_0x341e09(0x25c)](_0x5b1849 + (0x125d * 0x2 + -0x3d * -0x31 + 0x146 * -0x26)) &&\n                        (_0x5bebd7 += String[_0x341e09(0x1e2)](\n                            ((_0x5980c5 << (-0x2650 + 0x17 * 0xe9 + -0x3 * -0x5cd)) & (0x754 + -0x5df + -0xb5)) | _0x31f759\n                        ))\n                return _0x5bebd7\n            }\n\n            ; (_0x6caf[_0x5612de(0x380)] = -0x14e * -0x2 + 0x2519 + -0x217 * 0x13),\n                (_0x6caf['msToken'] = ''),\n                (_0x6caf[_0x5612de(0x263)] = _0x39693d[_0x5612de(0x3b9)]),\n                (_0x6caf[_0x5612de(0x3b5)] = ''),\n                (_0x6caf['ttwid'] = ''),\n                (_0x6caf[_0x5612de(0x316)] = ''),\n                (_0x6caf[_0x5612de(0x339)] = '')\n            var _0x28d239 = 0x778 + 0xa41 + 0x1 * -0x11b9,\n                _0x2d6b72,\n                _0x1e9bba,\n                _0xdc7355,\n                _0xf08186\n\n            function _0x33f406(_0x4b5fb5) {\n                var _0x1d1da4 = _0x5612de\n                return (\n                    (_0x4b5fb5 &= -0x2632 + 0x3 * -0x591 + 0x3724),\n                    String[_0x1d1da4(0x1e2)](\n                        _0x4b5fb5 +\n                        (_0x4b5fb5 < 0x22f * 0x1 + -0x1cac + 0x3 * 0x8dd\n                            ? -0xd * 0x123 + 0x19ac + -0x552 * 0x2\n                            : _0x4b5fb5 < -0x1 * -0x1646 + 0x1 * -0x1f21 + -0x305 * -0x3\n                                ? -0x2b4 * 0x1 + -0x45 * 0xb + -0x2 * -0x2f9\n                                : _0x4b5fb5 < 0x1 * 0x70c + 0x123f + -0x190d * 0x1\n                                    ? -(0x1f73 + -0x1 * -0x3d7 + -0x46 * 0x81)\n                                    : -(-0x248f + 0x20d3 + 0x3cd))\n                    )\n                )\n            }\n\n            function _0x4da136(_0x620f42) {\n                var _0xca40fa = _0x33f406\n                return (\n                    _0xca40fa(_0x620f42 >> (0x420 * -0x4 + -0x53f * -0x4 + -0x464)) +\n                    _0xca40fa(_0x620f42 >> (-0x1492 + -0x11c3 + -0x3 * -0xccd)) +\n                    _0xca40fa(_0x620f42 >> (0x1479 + 0x571 * 0x6 + -0x795 * 0x7)) +\n                    _0xca40fa(_0x620f42 >> (-0x1d * 0x4f + 0x313 * -0xb + 0x2aca)) +\n                    _0xca40fa(_0x620f42)\n                )\n            }\n\n            ; (_0x2d6b72 = _0x1e9bba =\n                function (_0x5d2d39) {\n                    return (_0x2d6b72 = _0xdc7355), (_0x28d239 = _0x5d2d39), _0x4da136(_0x5d2d39 >> (-0x418 * 0x8 + 0x9fe + 0x7c * 0x2f))\n                }),\n                (_0xdc7355 = function (_0x135d9a) {\n                    _0x2d6b72 = _0xf08186\n                    var _0x9cdabb = (_0x28d239 << (-0xa41 + -0x164f + 0x2b9 * 0xc)) | (_0x135d9a >>> (0xee4 + 0x1 * -0x143 + 0xcd * -0x11))\n                    return (_0x28d239 = _0x135d9a), _0x4da136(_0x9cdabb)\n                }),\n                (_0xf08186 = function (_0x36c054) {\n                    return (\n                        (_0x2d6b72 = _0x1e9bba),\n                        _0x4da136((_0x28d239 << (-0x302 + 0x1 * 0x2447 + -0x7 * 0x4bd)) | (_0x36c054 >>> (-0x1f5e + 0x1aa0 + 0x3d * 0x14))) +\n                        _0x33f406(_0x36c054)\n                    )\n                })\n            var _0x539097 = -0x2 * -0x621a4af5 + 0xc681287f + -0xec7e44b0,\n                _0x12ada0\n\n            function _0x75d5b3(_0x5a0afa, _0x1ccbbd) {\n                var _0x13780b = _0x5612de,\n                    _0xc312d4 = _0x5a0afa['length'],\n                    _0x102845 = _0xc312d4 << (-0x3 * -0x711 + 0x9a9 * 0x2 + -0x2883)\n                if (_0x1ccbbd) {\n                    var _0x25438e = _0x5a0afa[_0xc312d4 - (0x1b18 + 0x1 * 0xfb6 + -0x1 * 0x2acd)]\n                    if (_0x25438e < (_0x102845 -= 0x1f * 0x62 + -0xac0 + -0x8d * 0x2) - (-0xfed + -0x8a * 0x23 + 0x22ce) || _0x25438e > _0x102845)\n                        return null\n                    _0x102845 = _0x25438e\n                }\n                for (var _0x41e0a1 = -0x13b + -0x1963 + -0xd4f * -0x2; _0x41e0a1 < _0xc312d4; _0x41e0a1++)\n                    _0x5a0afa[_0x41e0a1] = String['fromCharCode'](\n                        (-0x30 * -0x12 + -0x235b + -0x15 * -0x192) & _0x5a0afa[_0x41e0a1],\n                        (_0x5a0afa[_0x41e0a1] >>> (-0x1839 * -0x1 + -0x5 * -0x196 + 0x1 * -0x201f)) & (-0x2 * 0x2b3 + 0x1 * 0x19c9 + -0x1364),\n                        (_0x5a0afa[_0x41e0a1] >>> (-0x12b * 0x1 + 0xa54 * 0x1 + -0x11 * 0x89)) & (0xc36 * 0x2 + 0x2 * 0x1259 + 0x1 * -0x3c1f),\n                        (_0x5a0afa[_0x41e0a1] >>> (0x564 + 0x2325 + -0x15 * 0x1ed)) & (0x2673 + -0x1411 + -0x1163)\n                    )\n                var _0x5ef85e = _0x5a0afa[_0x13780b(0x24f)]('')\n                return _0x1ccbbd ? _0x5ef85e['substring'](0x3 * -0x388 + -0xe41 + 0x18d9, _0x102845) : _0x5ef85e\n            }\n\n            function _0x183951(_0x15f4d9, _0x59200b) {\n                var _0x4f373f = _0x5612de,\n                    _0x40761a,\n                    _0x6155ee = _0x15f4d9[_0x4f373f(0x259)],\n                    _0x21fe82 = _0x6155ee >> (0xb8d * -0x1 + -0x1 * 0x5fe + -0x1 * -0x118d)\n                0x4 * -0xbc + 0x12f0 + -0x1000 != ((-0x79 * 0x2 + -0xb1 * 0x16 + 0x102b) & _0x6155ee) && ++_0x21fe82,\n                    _0x59200b\n                        ? ((_0x40761a = new Array(_0x21fe82 + (0x13 * -0x65 + -0x14ef + 0xfb * 0x1d)))[_0x21fe82] = _0x6155ee)\n                        : (_0x40761a = new Array(_0x21fe82))\n                for (var _0x56bca4 = -0x9e0 + 0x51 * 0x1a + 0x1a6; _0x56bca4 < _0x6155ee; ++_0x56bca4)\n                    _0x40761a[_0x56bca4 >> (-0xc1b * -0x2 + -0xc2 * -0x21 + 0x1 * -0x3136)] |=\n                        _0x15f4d9['charCodeAt'](_0x56bca4) << (((0x3 * -0x4cd + -0xdfc + 0x1c66) & _0x56bca4) << (0x1 * -0x133b + 0x21a5 + 0xe67 * -0x1))\n                return _0x40761a\n            }\n\n            function _0x25c901(_0x431b9d) {\n                return (0x1a1299587 + 0x91539 * -0x1c1b + -0x202b07 * -0x2ed) & _0x431b9d\n            }\n\n            function _0x38d33e(_0x1aed31, _0x212e8a, _0x427b15, _0x8fcd39, _0x4eaad6, _0x532b8e) {\n                return (\n                    (((_0x427b15 >>> (-0x1 * -0x1ddb + -0x20f7 + -0x3 * -0x10b)) ^ (_0x212e8a << (-0x1 * -0x407 + -0x132e + -0xf29 * -0x1))) +\n                        ((_0x212e8a >>> (-0x828 + -0xf23 + -0x9d * -0x26)) ^ (_0x427b15 << (-0xd51 + 0xc9f + 0xb6)))) ^\n                    ((_0x1aed31 ^ _0x212e8a) + (_0x532b8e[((0x9ad + -0x763 + -0xb * 0x35) & _0x8fcd39) ^ _0x4eaad6] ^ _0x427b15))\n                )\n            }\n\n            function _0x231484(_0xefe811) {\n                var _0x13eaf5 = _0x5612de\n                return (\n                    _0xefe811[_0x13eaf5(0x259)] < -0xa13 + 0x1086 + -0x66f && (_0xefe811[_0x13eaf5(0x259)] = -0x1371 + -0x1ec1 * -0x1 + 0x5a6 * -0x2),\n                    _0xefe811\n                )\n            }\n\n            function _0x3d58e7(_0x5e28f2, _0x468b52) {\n                var _0x50c100 = _0x5612de,\n                    _0x7c35df,\n                    _0x4c97b3,\n                    _0x5e0270,\n                    _0x3034db,\n                    _0x56f817,\n                    _0x3084b8,\n                    _0x66df40 = _0x5e28f2[_0x50c100(0x259)],\n                    _0x5506f5 = _0x66df40 - (-0x1c76 + 0x2246 + -0x5cf)\n                for (\n                    _0x4c97b3 = _0x5e28f2[_0x5506f5],\n                    _0x5e0270 = 0x22ee + 0xa15 * -0x1 + -0x18d9 * 0x1,\n                    _0x3084b8 =\n                    (0x1 * 0x36f + -0x2707 + 0x2398) |\n                    Math[_0x50c100(0x1cf)](0xc72 * 0x2 + -0xe3 * 0x2b + 0xd43 + (0x1a + 0x1c2a + -0x1c10) / _0x66df40);\n                    _0x3084b8 > 0x1 * -0x1cd + -0x2476 + 0x2643;\n                    --_0x3084b8\n                ) {\n                    for (\n                        _0x3034db =\n                        ((_0x5e0270 = _0x25c901(_0x5e0270 + _0x539097)) >>> (0x3b * -0x2f + 0x1290 + 0x3 * -0x293)) & (0x1533 + -0x116d + -0x3c3),\n                        _0x56f817 = 0x8 * 0x23b + -0xb89 + 0x64f * -0x1;\n                        _0x56f817 < _0x5506f5;\n                        ++_0x56f817\n                    )\n                        (_0x7c35df = _0x5e28f2[_0x56f817 + (0x3b * 0x5f + -0x1e1 * 0x1 + -0x1403)]),\n                            (_0x4c97b3 = _0x5e28f2[_0x56f817] =\n                                _0x25c901(_0x5e28f2[_0x56f817] + _0x38d33e(_0x5e0270, _0x7c35df, _0x4c97b3, _0x56f817, _0x3034db, _0x468b52)))\n                            ; (_0x7c35df = _0x5e28f2[-0x1570 + -0x1 * -0x385 + -0x8b * -0x21]),\n                                (_0x4c97b3 = _0x5e28f2[_0x5506f5] =\n                                    _0x25c901(_0x5e28f2[_0x5506f5] + _0x38d33e(_0x5e0270, _0x7c35df, _0x4c97b3, _0x5506f5, _0x3034db, _0x468b52)))\n                }\n                return _0x5e28f2\n            }\n\n            function _0x4aaf04(_0x33a7ba, _0x386196) {\n                var _0x257c0b = _0x5612de,\n                    _0x379288,\n                    _0x247a8b,\n                    _0x334bb9,\n                    _0x2fa83f,\n                    _0x417a88,\n                    _0x2a3ae5 = _0x33a7ba[_0x257c0b(0x259)],\n                    _0x429a0d = _0x2a3ae5 - (0xc1 * -0x11 + 0x1f99 + -0xb * 0x1b5)\n                for (\n                    _0x379288 = _0x33a7ba[-0x1 * -0x1397 + -0x13 * -0x187 + -0x309c],\n                    _0x334bb9 = _0x25c901(\n                        Math[_0x257c0b(0x1cf)](0xe52 * -0x1 + -0x10 * 0xb + -0x34 * -0x4a + (-0x3 * -0xd9 + 0x9f * 0x2f + 0xfc4 * -0x2) / _0x2a3ae5) *\n                        _0x539097\n                    );\n                    -0x2e * 0x1f + 0x2223 + -0x47 * 0x67 !== _0x334bb9;\n                    _0x334bb9 = _0x25c901(_0x334bb9 - _0x539097)\n                ) {\n                    for (\n                        _0x2fa83f = (_0x334bb9 >>> (0x437 * 0x5 + -0xfd * 0x22 + -0xc89 * -0x1)) & (0x1 * 0x863 + 0x2267 * 0x1 + -0x2f * 0xe9),\n                        _0x417a88 = _0x429a0d;\n                        _0x417a88 > 0xfc7 + -0x788 * -0x1 + -0x15f * 0x11;\n                        --_0x417a88\n                    )\n                        (_0x247a8b = _0x33a7ba[_0x417a88 - (0x3b * -0x4f + 0x6d * -0xa + 0xb3c * 0x2)]),\n                            (_0x379288 = _0x33a7ba[_0x417a88] =\n                                _0x25c901(_0x33a7ba[_0x417a88] - _0x38d33e(_0x334bb9, _0x379288, _0x247a8b, _0x417a88, _0x2fa83f, _0x386196)))\n                            ; (_0x247a8b = _0x33a7ba[_0x429a0d]),\n                                (_0x379288 = _0x33a7ba[-0x1fb + 0x1952 * -0x1 + -0x1d * -0xf1] =\n                                    _0x25c901(\n                                        _0x33a7ba[0x7 * 0x59 + 0x5 * -0x2d2 + 0xbab] -\n                                        _0x38d33e(_0x334bb9, _0x379288, _0x247a8b, -0xbac + -0x7 * 0xea + -0x606 * -0x3, _0x2fa83f, _0x386196)\n                                    ))\n                }\n                return _0x33a7ba\n            }\n\n            function _0x532596(_0x2394ed) {\n                var _0x22f5e8 = _0x5612de\n                if (/^[\\x00-\\x7f]*$/[_0x22f5e8(0x22b)](_0x2394ed)) return _0x2394ed\n                for (\n                    var _0x47e840 = [],\n                    _0x5f04b8 = _0x2394ed[_0x22f5e8(0x259)],\n                    _0x150666 = -0xe97 + 0xd02 + 0x195,\n                    _0x19b157 = 0xf1c + -0x1f5 * 0x8 + 0x8c;\n                    _0x150666 < _0x5f04b8;\n                    ++_0x150666, ++_0x19b157\n                ) {\n                    var _0x44de53 = _0x2394ed[_0x22f5e8(0x195)](_0x150666)\n                    if (_0x44de53 < -0x1 * -0xb7b + 0x1566 + -0x2061) _0x47e840[_0x19b157] = _0x2394ed[_0x22f5e8(0x25c)](_0x150666)\n                    else {\n                        if (_0x44de53 < -0x3 * 0xcd2 + 0x1168 + 0x1 * 0x1d0e)\n                            _0x47e840[_0x19b157] = String['fromCharCode'](\n                                (0x2 * 0x579 + 0x263c * 0x1 + 0x306e * -0x1) | (_0x44de53 >> (0xca4 * -0x1 + 0x6f * 0x13 + -0x46d * -0x1)),\n                                (0x7 * -0x5 + 0x35 * 0x73 + -0x172c) | ((0xf88 * -0x1 + -0x108f * -0x1 + -0xc8) & _0x44de53)\n                            )\n                        else {\n                            if (!(_0x44de53 < -0xaebb * 0x1 + -0x3 * -0x3a46 + 0x6f7 * 0x1f || _0x44de53 > 0x1679b * 0x1 + -0x121 * -0x15 + -0x9f51)) {\n                                if (_0x150666 + (0x15a6 + 0x1ec1 + -0x26 * 0x161) < _0x5f04b8) {\n                                    var _0x254ff6 = _0x2394ed[_0x22f5e8(0x195)](_0x150666 + (-0x42 * -0x7a + 0x4 * 0x91d + -0x43e7))\n                                    if (\n                                        _0x44de53 < -0x181e4 + 0xbcbb + 0x1a129 &&\n                                        -0x17db * -0xf + 0xac6d * -0x1 + -0x3d8 * -0x9 <= _0x254ff6 &&\n                                        _0x254ff6 <= 0x159a + 0x17967 + 0x9b9 * -0x12\n                                    ) {\n                                        var _0x304310 =\n                                            -0x1862f +\n                                            0x1121d +\n                                            0x2 * 0xba09 +\n                                            ((((0x1 * -0x140f + -0x18dd + 0x30eb) & _0x44de53) << (-0xb0 * -0x8 + 0x875 + -0x7 * 0x1fd)) |\n                                                ((0x2301 + 0x171f + 0x3621 * -0x1) & _0x254ff6))\n                                            ; (_0x47e840[_0x19b157] = String[_0x22f5e8(0x1e2)](\n                                                (0x1afc * -0x1 + 0x26f4 + -0xb08) |\n                                                ((_0x304310 >> (0xb * 0x14e + -0x119 * -0x1d + -0x2e1d)) & (0x1037 * 0x1 + -0x1090 + -0x2 * -0x4c)),\n                                                (0x1922 + 0x4 * 0x351 + -0x25e6) | ((_0x304310 >> (0x1e93 + -0x517 + -0x1970)) & (0x2481 + 0x1591 + -0x39d3)),\n                                                (-0xace * -0x1 + 0x1ef3 + -0x2941) |\n                                                ((_0x304310 >> (-0xb7f * -0x3 + -0x1 * 0xe7d + -0x13fa)) & (-0x10d * -0x6 + 0x252a * 0x1 + -0x2b39)),\n                                                (-0x1c61 * 0x1 + 0x1 * -0x5e7 + -0x13e * -0x1c) |\n                                                ((0x13 * -0x1f9 + 0x16 * -0x164 + -0x37 * -0x13e) & _0x304310)\n                                            )),\n                                                ++_0x150666\n                                        continue\n                                    }\n                                }\n                                throw new Error(_0x22f5e8(0x297))\n                            }\n                            _0x47e840[_0x19b157] = String[_0x22f5e8(0x1e2)](\n                                (-0x170b + 0x109b + 0x750) | (_0x44de53 >> (-0xbf0 * -0x2 + 0x25bc + -0x3d90)),\n                                (0x4ec + 0x1f0c + -0x8de * 0x4) |\n                                ((_0x44de53 >> (0x2 * 0x829 + -0x1b * -0x10c + -0x2c90)) & (-0x2322 + 0x19d5 + 0x34 * 0x2f)),\n                                (0x2a1 + 0x1 * 0x1ac0 + 0x1 * -0x1ce1) | ((-0xe95 + 0x1cf * 0x11 + 0x1 * -0xfeb) & _0x44de53)\n                            )\n                        }\n                    }\n                }\n                return _0x47e840[_0x22f5e8(0x24f)]('')\n            }\n\n            function _0x45fbef(_0x316827, _0x2a039f) {\n                var _0x1c80ac = _0x5612de\n                for (\n                    var _0x4921e2 = new Array(_0x2a039f),\n                    _0x79a402 = 0x20bd + -0x10b1 + -0x1 * 0x100c,\n                    _0x28b895 = -0xd2c + -0x1730 + 0x1 * 0x245c,\n                    _0x2bc88b = _0x316827[_0x1c80ac(0x259)];\n                    _0x79a402 < _0x2a039f && _0x28b895 < _0x2bc88b;\n                    _0x79a402++\n                ) {\n                    var _0x43b518 = _0x316827[_0x1c80ac(0x195)](_0x28b895++)\n                    switch (_0x43b518 >> (-0x1342 + 0x67 * -0x53 + 0x34ab)) {\n                        case -0x410 * -0x3 + -0xd9 + -0xb57:\n                        case -0x17cb + 0x2362 + -0xb96 * 0x1:\n                        case -0x24 * 0x7f + -0x1 * -0xcfc + 0x19 * 0x32:\n                        case 0x2025 + 0x1102 + -0x3124:\n                        case 0x1b0d + 0xcb4 + 0xd3f * -0x3:\n                        case -0x11d9 + 0x9 * 0x16d + -0x1 * -0x509:\n                        case 0x79 * 0x49 + 0x1 * 0x1b8e + -0x3e09 * 0x1:\n                        case 0x26c1 + -0x2137 * 0x1 + -0x583:\n                            _0x4921e2[_0x79a402] = _0x43b518\n                            break\n                        case 0x10f * -0x13 + 0x426 + 0x1003:\n                        case 0x164d * 0x1 + 0xb5a * 0x3 + 0x1c27 * -0x2:\n                            if (!(_0x28b895 < _0x2bc88b)) throw new Error('Unfinished\\x20UTF-8\\x20octet\\x20sequence')\n                            _0x4921e2[_0x79a402] =\n                                (((-0x1f7 * 0xb + -0x1fa0 + 0x2ab * 0x14) & _0x43b518) << (-0x233b + 0x160e + 0xd33)) |\n                                ((-0x1e40 + 0x22b9 + -0x2 * 0x21d) & _0x316827[_0x1c80ac(0x195)](_0x28b895++))\n                            break\n                        case -0x2512 + -0x1595 + 0x3ab5:\n                            if (!(_0x28b895 + (0xba3 * -0x1 + -0x17dd * 0x1 + 0x1 * 0x2381) < _0x2bc88b)) throw new Error(_0x1c80ac(0x394))\n                            _0x4921e2[_0x79a402] =\n                                (((0x247f * -0x1 + 0xec2 * 0x1 + -0x136 * -0x12) & _0x43b518) << (0x1 * 0x1bcd + -0x3dd + -0x17e4)) |\n                                (((0x1631 + -0x1058 + 0x2 * -0x2cd) & _0x316827[_0x1c80ac(0x195)](_0x28b895++)) <<\n                                    (0x889 * 0x4 + 0x11c8 * 0x2 + -0x45ae)) |\n                                ((-0x698 * -0x4 + -0x2f * -0x4f + -0x28a2) & _0x316827[_0x1c80ac(0x195)](_0x28b895++))\n                            break\n                        case -0x85 * -0x8 + 0x1148 + -0x1561:\n                            if (!(_0x28b895 + (0x1 * -0x8f1 + -0x67 * 0x3e + 0x21e5) < _0x2bc88b)) throw new Error(_0x1c80ac(0x394))\n                            var _0x1740ac =\n                                ((((0x1 * -0x1d4f + 0x1 * 0x24bf + -0x769) & _0x43b518) << (0xb19 + 0x4a * -0x48 + -0x3 * -0x343)) |\n                                    (((-0x1ab4 + -0x205 * -0x8 + -0x3 * -0x399) & _0x316827[_0x1c80ac(0x195)](_0x28b895++)) <<\n                                        (0x1e52 + -0x144b + -0x5 * 0x1ff)) |\n                                    (((0x4c5 * -0x3 + 0x1 * -0x70b + 0x1599) & _0x316827[_0x1c80ac(0x195)](_0x28b895++)) <<\n                                        (-0xf6e + -0x37 * -0x86 + 0x239 * -0x6)) |\n                                    ((0x2 * -0xc31 + 0x26b5 + -0xe14) & _0x316827[_0x1c80ac(0x195)](_0x28b895++))) -\n                                (0x1 * -0x6b6b + -0x14502 + -0x1 * -0x2b06d)\n                            if (!(0x86 * 0xd + -0x2210 + 0x1b42 <= _0x1740ac && _0x1740ac <= 0x141d1 * 0x1 + -0x3044 * -0x8b + 0x1 * -0xb76be))\n                                throw new Error(_0x1c80ac(0x24e) + _0x1740ac['toString'](-0x959 * 0x3 + -0x50e * -0x5 + -0x1 * -0x2d5))\n                                ; (_0x4921e2[_0x79a402++] =\n                                    ((_0x1740ac >> (-0x1a89 * 0x1 + 0x125 * -0x1 + 0x1bb8)) & (-0x2 * 0x12e4 + 0xc1e + 0x1da9)) |\n                                    (-0x4e * -0x332 + -0x6764 * -0x2 + -0xf004 * 0x1)),\n                                    (_0x4921e2[_0x79a402] = ((0x23f0 + 0x2b * 0x11 + -0x4 * 0x8b3) & _0x1740ac) | (0xb45d + -0xd352 + 0x3 * 0x53a7))\n                            break\n                        default:\n                            throw new Error(_0x1c80ac(0x330) + _0x43b518[_0x1c80ac(0x3ae)](-0x1f71 + 0xdc3 * -0x1 + 0x2d44))\n                    }\n                }\n                return _0x79a402 < _0x2a039f && (_0x4921e2[_0x1c80ac(0x259)] = _0x79a402), String[_0x1c80ac(0x1e2)]['apply'](String, _0x4921e2)\n            }\n\n            function _0x25bfe1(_0x5ad020, _0x1001f1) {\n                var _0xa8facb = _0x5612de\n                for (\n                    var _0xdb2671 = [],\n                    _0x67f891 = new Array(-0x29 * 0x169 + 0x1d * -0x3c7 + -0x6 * -0x313a),\n                    _0x3fce02 = -0x47c * -0x1 + -0xc83 + 0x2ad * 0x3,\n                    _0x47254b = 0x1010 + -0xb * 0x29 + -0xe4d,\n                    _0x4445a9 = _0x5ad020[_0xa8facb(0x259)];\n                    _0x3fce02 < _0x1001f1 && _0x47254b < _0x4445a9;\n                    _0x3fce02++\n                ) {\n                    var _0x488af6 = _0x5ad020['charCodeAt'](_0x47254b++)\n                    switch (_0x488af6 >> (-0x1148 + 0xbd2 + 0x57a)) {\n                        case -0x1 * -0xb6b + 0x16f6 + -0x2261:\n                        case -0x1678 + -0x1c12 + 0x3 * 0x10d9:\n                        case 0xd01 * -0x2 + 0x2c2 + -0x1a * -0xe5:\n                        case 0x1985 + 0x49 * -0x6d + 0x593:\n                        case 0xbac + 0xd1a * 0x1 + -0x18c2:\n                        case -0x11 * -0x1 + 0x1 * -0x18bd + 0x18b1:\n                        case 0x1e6 + -0x129a * -0x1 + 0x1 * -0x147a:\n                        case -0x1 * 0xf49 + 0xed + 0xe63:\n                            _0x67f891[_0x3fce02] = _0x488af6\n                            break\n                        case 0x30e * 0xb + 0x255b + -0x1 * 0x46e9:\n                        case 0x71 * -0xf + -0x1371 + 0x1a1d:\n                            if (!(_0x47254b < _0x4445a9)) throw new Error(_0xa8facb(0x394))\n                            _0x67f891[_0x3fce02] =\n                                (((-0x407 * -0x5 + -0xcb5 + 0x74f * -0x1) & _0x488af6) << (-0x585 + -0xbf8 + 0x1183)) |\n                                ((-0x1 * 0x1e25 + 0x6d * -0x3b + 0x1281 * 0x3) & _0x5ad020['charCodeAt'](_0x47254b++))\n                            break\n                        case -0x676 * -0x4 + -0x351 + -0x1679:\n                            if (!(_0x47254b + (0x1b63 + -0x5 * 0x463 + -0x573) < _0x4445a9)) throw new Error(_0xa8facb(0x394))\n                            _0x67f891[_0x3fce02] =\n                                (((0x2dd * 0x7 + -0x15dd + 0x1e1) & _0x488af6) << (0x141c + 0x18e3 + -0x2cf3)) |\n                                (((-0x1 * -0x619 + 0x1 * 0x18bf + -0xa33 * 0x3) & _0x5ad020[_0xa8facb(0x195)](_0x47254b++)) <<\n                                    (0x1343 * -0x1 + -0x9 * 0x198 + 0x21a1)) |\n                                ((0x455 + -0x1ef3 + 0x1add) & _0x5ad020['charCodeAt'](_0x47254b++))\n                            break\n                        case -0x21f + -0x13f9 * 0x1 + -0x6b * -0x35:\n                            if (!(_0x47254b + (-0xde * -0xb + 0x20cf + -0x2a57) < _0x4445a9)) throw new Error(_0xa8facb(0x394))\n                            var _0x59357e =\n                                ((((0x1081 + -0x1b6f + 0xaf5) & _0x488af6) << (-0x1 * -0x511 + -0x45 * 0x55 + 0x11ea)) |\n                                    (((0x125a * 0x2 + 0x4bd * -0x2 + -0x1afb) & _0x5ad020[_0xa8facb(0x195)](_0x47254b++)) <<\n                                        (0xbf4 * -0x2 + -0x1512 + 0x2d06)) |\n                                    (((0x1aae + 0xd81 + -0x27f0) & _0x5ad020[_0xa8facb(0x195)](_0x47254b++)) << (0x1759 + -0x9a1 * -0x1 + 0x4c * -0x6f)) |\n                                    ((0x352 * -0xb + -0xde7 + 0x32ac) & _0x5ad020[_0xa8facb(0x195)](_0x47254b++))) -\n                                (-0x57e9 + 0x19207 + -0x3a1e)\n                            if (!(0x41b * -0x7 + 0x1658 + 0x1 * 0x665 <= _0x59357e && _0x59357e <= -0xf6 * -0x7ed + -0x1bcf3b + -0x4 * -0x90c5f))\n                                throw new Error(\n                                    'Character\\x20outside\\x20valid\\x20Unicode\\x20range:\\x200x' +\n                                    _0x59357e['toString'](-0x40f + -0x5 * -0x61f + 0x1c4 * -0xf)\n                                )\n                                ; (_0x67f891[_0x3fce02++] =\n                                    ((_0x59357e >> (-0x15e2 + 0x1 * -0xb51 + -0x43 * -0x7f)) & (-0x11a2 + 0xb * -0x29 + 0x7cc * 0x3)) |\n                                    (0x1 * -0x3d14 + 0x159a9 + -0x1 * 0x4495)),\n                                    (_0x67f891[_0x3fce02] = ((0x1 * 0x101 + -0x499 + 0x797) & _0x59357e) | (0x1dec + 0x87f7 + 0x361d))\n                            break\n                        default:\n                            throw new Error('Bad\\x20UTF-8\\x20encoding\\x200x' + _0x488af6[_0xa8facb(0x3ae)](-0x11 * 0x1dc + 0x1a53 + 0x559))\n                    }\n                    if (_0x3fce02 >= -0xb3 * -0x16e + 0x1616 + 0x1a6 * -0x5b) {\n                        var _0x2ceb4e = _0x3fce02 + (0x4 * -0x8fe + 0x665 * 0x3 + 0x10ca)\n                            ; (_0x67f891[_0xa8facb(0x259)] = _0x2ceb4e),\n                                (_0xdb2671[_0xdb2671[_0xa8facb(0x259)]] = String[_0xa8facb(0x1e2)][_0xa8facb(0x207)](String, _0x67f891)),\n                                (_0x1001f1 -= _0x2ceb4e),\n                                (_0x3fce02 = -(-0x18 * -0x111 + 0x2 * 0x9e3 + -0x2d5d))\n                    }\n                }\n                return (\n                    _0x3fce02 > 0x1 * 0xb5d + -0x20a3 + 0x1546 &&\n                    ((_0x67f891['length'] = _0x3fce02),\n                        (_0xdb2671[_0xdb2671[_0xa8facb(0x259)]] = String['fromCharCode'][_0xa8facb(0x207)](String, _0x67f891))),\n                    _0xdb2671['join']('')\n                )\n            }\n\n            function _0x31dfb5(_0x360a73, _0xe765ba) {\n                var _0x293f34 = _0x5612de\n                return (\n                    (null == _0xe765ba || _0xe765ba < -0x1605 + 0xf7 * 0xe + 0x883) && (_0xe765ba = _0x360a73[_0x293f34(0x259)]),\n                    -0x6 * 0x30b + -0x1608 + 0x284a === _0xe765ba\n                        ? ''\n                        : /^[\\x00-\\x7f]*$/[_0x293f34(0x22b)](_0x360a73) || !/^[\\x00-\\xff]*$/[_0x293f34(0x22b)](_0x360a73)\n                            ? _0xe765ba === _0x360a73[_0x293f34(0x259)]\n                                ? _0x360a73\n                                : _0x360a73[_0x293f34(0x3a7)](0x169 + 0x887 + 0x6a * -0x18, _0xe765ba)\n                            : _0xe765ba < 0x1d0d6 + 0x73e5 + -0x4 * 0x512f\n                                ? _0x45fbef(_0x360a73, _0xe765ba)\n                                : _0x25bfe1(_0x360a73, _0xe765ba)\n                )\n            }\n\n            function _0xdda738(_0x21d8ce, _0x4bf3f9) {\n                var _0x46d91f = _0x5612de\n                return null == _0x21d8ce || 0x1 * -0xab1 + -0x2567 * -0x1 + -0x1ab6 === _0x21d8ce[_0x46d91f(0x259)]\n                    ? _0x21d8ce\n                    : ((_0x21d8ce = _0x532596(_0x21d8ce)),\n                        (_0x4bf3f9 = _0x532596(_0x4bf3f9)),\n                        _0x75d5b3(\n                            _0x3d58e7(\n                                _0x183951(_0x21d8ce, !(0xad5 + 0xaa1 + -0x2 * 0xabb)),\n                                _0x231484(_0x183951(_0x4bf3f9, !(-0x106c + -0x1173 * -0x2 + -0x1279)))\n                            ),\n                            !(-0x1 * 0x2c8 + -0xc8 + 0x391)\n                        ))\n            }\n\n            function _0x4bb829(_0x1f763e, _0x47e9cd) {\n                var _0x18b798 = _0x5612de\n                return null == _0x1f763e || -0x12 * 0xe1 + 0x3cb * -0x5 + 0x22c9 === _0x1f763e[_0x18b798(0x259)]\n                    ? _0x1f763e\n                    : ((_0x47e9cd = _0x532596(_0x47e9cd)),\n                        _0x31dfb5(\n                            _0x75d5b3(\n                                _0x4aaf04(\n                                    _0x183951(_0x1f763e, !(-0x40 * -0x16 + -0x133 * -0x1d + -0x2846)),\n                                    _0x231484(_0x183951(_0x47e9cd, !(0x1e64 + 0xcee + -0x2b51)))\n                                ),\n                                !(-0x1daa + -0xbb1 + 0x295b)\n                            )\n                        ))\n            }\n\n            function _0x39dfe4() {\n                var _0x2fd4da = _0x5612de,\n                    _0x21e994 = ''\n                try {\n                    window[_0x2fd4da(0x3be)] && (_0x21e994 = window[_0x2fd4da(0x3be)]['getItem']('_byted_param_sw')),\n                        (_0x21e994 && !window[_0x2fd4da(0x1dc)]) || (_0x21e994 = window['localStorage'][_0x2fd4da(0x2d8)]('_byted_param_sw'))\n                } catch (_0x3b8cd9) { }\n                if (_0x21e994)\n                    try {\n                        var _0x25acb5 = _0x4bb829(\n                            _0xb5350b(_0x21e994[_0x2fd4da(0x2a5)](0x19 * 0xc9 + -0x1bc8 + -0x82f * -0x1)),\n                            _0x21e994[_0x2fd4da(0x2a5)](0x2 * 0xa88 + -0x25 * -0x94 + -0x2a74, 0x2c6 * 0x5 + -0x14c6 + 0x1bc * 0x4)\n                        )\n                        if ('on' === _0x25acb5) return !(0x527 * -0x7 + 0x7b7 + 0x1c5a)\n                        if (_0x2fd4da(0x304) === _0x25acb5) return !(0x1b29 * -0x1 + -0xd8d + 0x1 * 0x28b7)\n                    } catch (_0x1da1e4) { }\n                return !(-0x158c + 0x10 * -0x13d + 0x1 * 0x295d)\n            }\n\n            function _0x1b4bf1() {\n                var _0x4eb990 = _0x5612de\n                return w_0x5c3140(\n                    _0x4eb990(0x211),\n                    {\n                        get 0x0() {\n                            var _0x448d97 = _0x4eb990\n                            return _0x448d97(0x384) != typeof navigator ? navigator : void (-0xd95 * -0x2 + -0x1 * 0x16ed + 0x5 * -0xd9)\n                        },\n                        get 0x1() {\n                            var _0x389269 = _0x4eb990\n                            return _0x389269(0x384) != typeof window ? window : void (0x63e + 0xb * -0x32b + -0x1c9b * -0x1)\n                        },\n                        get 0x2() {\n                            return _0x1db123\n                        },\n                        0x3: Object,\n                        get 0x4() {\n                            return 'undefined' != typeof document ? document : void (0xe3a + 0x2499 + -0x32d3)\n                        },\n                        get 0x5() {\n                            var _0x813809 = _0x4eb990\n                            return _0x813809(0x384) != typeof location ? location : void (-0x1 * -0x2145 + 0x54e * -0x7 + -0x1 * -0x3dd)\n                        },\n                        get 0x6() {\n                            return _0x176a57\n                        },\n                        get 0x7() {\n                            return 'undefined' != typeof history ? history : void (-0x17d + -0x1ef4 + 0x2071)\n                        },\n                        0x8: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x532cd9() {\n                var _0x3b3ba1 = _0x5612de\n                return w_0x5c3140(\n                    _0x3b3ba1(0x190),\n                    {\n                        get 0x0() {\n                            return _0x176a57\n                        },\n                        get 0x1() {\n                            return navigator\n                        },\n                        get 0x2() {\n                            return PluginArray\n                        },\n                        get 0x3() {\n                            return window\n                        },\n                        0x4: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x3391fc() {\n                var _0x2aea9b = _0x5612de\n                return w_0x5c3140(\n                    _0x2aea9b(0x266),\n                    {\n                        get 0x0() {\n                            return _0x12ada0\n                        },\n                        get 0x1() {\n                            return navigator\n                        },\n                        0x2: Object,\n                        get 0x3() {\n                            return window\n                        },\n                        0x4: arguments,\n                        0x5: RegExp\n                    },\n                    this\n                )\n            }\n\n            function _0x21fa28() {\n                var _0x1106df = _0x5612de\n                return w_0x5c3140(\n                    _0x1106df(0x17b),\n                    {\n                        set 0x0(_0x2b3a0b) {\n                            _0x12ada0 = _0x2b3a0b\n                        },\n                        0x1: Object,\n                        get 0x2() {\n                            return window\n                        },\n                        0x3: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x49b1d7(_0x4f4807) {\n                var _0x4f1753 = _0x5612de\n                return w_0x5c3140(\n                    _0x4f1753(0x171),\n                    {\n                        get 0x0() {\n                            return _0x1230e7\n                        },\n                        get 0x1() {\n                            return indexedDB\n                        },\n                        get 0x2() {\n                            return _0xf8ccf1\n                        },\n                        get 0x3() {\n                            return window\n                        },\n                        get 0x4() {\n                            return DOMException\n                        },\n                        get 0x5() {\n                            return _0x176a57\n                        },\n                        get 0x6() {\n                            return _0x6caf\n                        },\n                        0x7: arguments,\n                        0x8: _0x4f4807\n                    },\n                    this\n                )\n            }\n\n            function _0x462256() {\n                var _0x1ed1aa = _0x5612de\n                return w_0x5c3140(\n                    _0x1ed1aa(0x163),\n                    {\n                        get 0x0() {\n                            return _0x176a57\n                        },\n                        get 0x1() {\n                            return document\n                        },\n                        get 0x2() {\n                            return navigator\n                        },\n                        0x3: arguments,\n                        0x4: RegExp\n                    },\n                    this\n                )\n            }\n\n            function _0x3cee0e() {\n                var _0x5f1e22 = _0x5612de\n                return w_0x5c3140(\n                    _0x5f1e22(0x2dd),\n                    {\n                        get 0x0() {\n                            return navigator\n                        },\n                        get 0x1() {\n                            return window\n                        },\n                        0x2: arguments,\n                        0x3: RegExp\n                    },\n                    this\n                )\n            }\n\n            function _0x1f9824() {\n                var _0x1d4f72 = _0x5612de,\n                    _0x5821af = ''\n                if (_0x6caf['PLUGIN']) _0x5821af = _0x6caf[_0x1d4f72(0x354)]\n                else {\n                    for (\n                        var _0x580f96 = [], _0x3ca683 = navigator[_0x1d4f72(0x1ba)] || [], _0x15f771 = 0x389 * 0x5 + -0x2a * -0xe2 + -0x36c1;\n                        _0x15f771 < -0xe3b * 0x1 + 0x1a76 + -0x6 * 0x209;\n                        _0x15f771++\n                    )\n                        try {\n                            for (\n                                var _0x5a4f6c = _0x3ca683[_0x15f771], _0x3a1f6 = [], _0x1a6da9 = -0x869 + -0x111 * 0x14 + -0x1dbd * -0x1;\n                                _0x1a6da9 < _0x5a4f6c[_0x1d4f72(0x259)];\n                                _0x1a6da9++\n                            )\n                                _0x5a4f6c[_0x1d4f72(0x37c)](_0x1a6da9) && _0x3a1f6[_0x1d4f72(0x36e)](_0x5a4f6c['item'](_0x1a6da9)[_0x1d4f72(0x1ab)])\n                            var _0x1ae7c8 = _0x5a4f6c[_0x1d4f72(0x341)] + ''\n                            _0x5a4f6c['version'] && (_0x1ae7c8 += _0x5a4f6c[_0x1d4f72(0x2c1)] + ''),\n                                (_0x1ae7c8 += _0x5a4f6c['filename'] + ''),\n                                (_0x1ae7c8 += _0x3a1f6[_0x1d4f72(0x24f)]('')),\n                                _0x580f96['push'](_0x1ae7c8)\n                        } catch (_0x4e31c6) { }\n                    ; (_0x5821af = _0x580f96[_0x1d4f72(0x24f)]('##')), (_0x6caf[_0x1d4f72(0x354)] = _0x5821af)\n                }\n                return _0x5821af[_0x1d4f72(0x2a5)](-0x1 * 0x26c + -0x1e2f + 0x209b, -0x26ff + 0x1b6e * 0x1 + 0xf91)\n            }\n\n            function _0x30412e() {\n                var _0x5a747f = _0x5612de,\n                    _0x5640f8 = []\n                try {\n                    var _0x3405cb = navigator[_0x5a747f(0x1ba)]\n                    if (_0x3405cb) {\n                        for (var _0x53b06e = -0x8aa + 0x341 + 0x115 * 0x5; _0x53b06e < _0x3405cb[_0x5a747f(0x259)]; _0x53b06e++)\n                            for (var _0xa74ec6 = -0x1829 + 0x1f9c + -0x773; _0xa74ec6 < _0x3405cb[_0x53b06e][_0x5a747f(0x259)]; _0xa74ec6++) {\n                                var _0x2bcc6c = [\n                                    _0x3405cb[_0x53b06e][_0x5a747f(0x19e)],\n                                    _0x3405cb[_0x53b06e][_0xa74ec6][_0x5a747f(0x1ab)],\n                                    _0x3405cb[_0x53b06e][_0xa74ec6][_0x5a747f(0x169)]\n                                ][_0x5a747f(0x24f)]('|')\n                                _0x5640f8['push'](_0x2bcc6c)\n                            }\n                    }\n                } catch (_0x11c0f4) { }\n                return _0x5640f8\n            }\n\n            function _0x28e2ec() {\n                var _0x3301ae = _0x5612de\n                return w_0x5c3140(\n                    _0x3301ae(0x1a6),\n                    {\n                        get 0x0() {\n                            return navigator\n                        },\n                        get 0x1() {\n                            return _0x1f9824\n                        },\n                        get 0x2() {\n                            return window\n                        },\n                        0x3: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x5863d1() {\n                var _0x247350 = _0x5612de\n                return w_0x5c3140(\n                    _0x247350(0x21c),\n                    {\n                        get 0x0() {\n                            return _0x462335\n                        },\n                        get 0x1() {\n                            return _0x39dfe4\n                        },\n                        get 0x2() {\n                            return _0x1b4bf1\n                        },\n                        get 0x3() {\n                            return _0x53b77d\n                        },\n                        get 0x4() {\n                            return _0x49b1d7\n                        },\n                        get 0x5() {\n                            return _0x3ed707\n                        },\n                        get 0x6() {\n                            return _0x532cd9\n                        },\n                        get 0x7() {\n                            return _0x3391fc\n                        },\n                        get 0x8() {\n                            return _0x462256\n                        },\n                        get 0x9() {\n                            return _0x3cee0e\n                        },\n                        get 0xa() {\n                            return _0x28e2ec\n                        },\n                        get 0xb() {\n                            return _0x6caf\n                        },\n                        0xc: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x2a900b(_0x29489b) {\n                var _0x3163ac = _0x5612de\n                for (\n                    var _0x2edc36 = Object[_0x3163ac(0x17f)](_0x29489b),\n                    _0x4da10f = -0x26c9 + -0x11f1 * -0x1 + 0x14d8,\n                    _0x26fc90 = _0x2edc36[_0x3163ac(0x259)] - (0x1cea + -0x5 * 0x2f5 + 0x8 * -0x1c4);\n                    _0x26fc90 >= -0x2 * -0x397 + 0x17ce + -0x1efc;\n                    _0x26fc90--\n                ) {\n                    _0x4da10f =\n                        ((_0x29489b[_0x2edc36[_0x26fc90]] ? 0x455 * 0x9 + 0x1715 + -0x3e11 : -0x1 * -0x22f7 + 0x1f6c * 0x1 + -0x203 * 0x21) <<\n                            (_0x2edc36[_0x3163ac(0x259)] - _0x26fc90 - (-0x64c * -0x6 + -0x163 + -0x224 * 0x11))) |\n                        _0x4da10f\n                }\n                return _0x4da10f\n            }\n\n            function _0x246aeb(_0x1b02ae, _0x32abc9) {\n                var _0x172517 = _0x5612de\n                for (var _0x4d2e6c = 0x1e44 + 0x2 * 0x443 + 0x2 * -0x1365; _0x4d2e6c < _0x32abc9[_0x172517(0x259)]; _0x4d2e6c++)\n                    _0x1b02ae =\n                        ((-0xa15f + -0x1a803 + 0x349a1) * _0x1b02ae + _0x32abc9[_0x172517(0x195)](_0x4d2e6c)) >>> (-0x2c6 + 0x2 * -0x126c + 0x279e)\n                return _0x1b02ae\n            }\n\n            function _0x184783(_0x9867bc, _0x21d0e6) {\n                var _0x25b989 = _0x5612de\n                for (var _0x21703e = -0xa6 * -0x1 + 0xbf * -0x5 + -0x315 * -0x1; _0x21703e < _0x21d0e6[_0x25b989(0x259)]; _0x21703e++)\n                    _0x9867bc =\n                        ((-0x6275 + 0xd966 + -0x5f * -0x172) * (_0x9867bc ^ _0x21d0e6['charCodeAt'](_0x21703e))) >>>\n                        (-0xf * 0x1a + 0x7 * -0x543 + 0x443 * 0x9)\n                return _0x9867bc\n            }\n\n            function _0xf119da(_0x57529f, _0x19340f) {\n                var _0x1de06d = _0x5612de\n                for (var _0x3e7b02 = 0x45a * 0x1 + -0xe5d * 0x2 + 0x1860; _0x3e7b02 < _0x19340f[_0x1de06d(0x259)]; _0x3e7b02++) {\n                    var _0x25af5d = _0x19340f[_0x1de06d(0x195)](_0x3e7b02)\n                    if (\n                        _0x25af5d >= -0x12321 + 0x417 * -0xa + 0x22407 &&\n                        _0x25af5d <= 0x92d4 + 0xb6fd + -0x6dd2 &&\n                        _0x3e7b02 < _0x19340f[_0x1de06d(0x259)]\n                    ) {\n                        var _0xfb40a0 = _0x19340f['charCodeAt'](_0x3e7b02 + (0x688 * 0x4 + 0x145 * 0x17 + -0x3752))\n                            ; -0xa62a + -0x10ba7 + -0x5d67 * -0x7 == ((0xfbaf + 0x1ce63 + -0x1ce12) & _0xfb40a0) &&\n                                ((_0x25af5d =\n                                    (((-0x9fe * 0x1 + 0x2 * -0xf33 + 0x2c63) & _0x25af5d) << (-0x86d * 0x4 + -0x211 * 0x9 + -0x1 * -0x3457)) +\n                                    ((-0x1b17 + 0xb6c + 0x13aa) & _0xfb40a0) +\n                                    (0x2 * 0xab9c + -0x18f24 + -0x4 * -0x4dfb)),\n                                    (_0x3e7b02 += -0x1e31 + -0xa * 0x38b + -0x150 * -0x32))\n                    }\n                    _0x57529f = ((-0x3a * 0x7e4 + -0x3827 * -0x2 + 0x151 * 0x1c9) * _0x57529f + _0x25af5d) >>> (0x3e7 + -0x1 * -0x5e7 + -0x9ce)\n                }\n                return _0x57529f\n            }\n\n            function _0x53f850(_0x450920) {\n                var _0x30ac3f = _0x5612de,\n                    _0x4eeea4 = _0x450920 || ''\n                return (_0x4eeea4 =\n                    (_0x4eeea4 =\n                        -(-0x13 * -0x5a + 0xb2f + -0x11dc) !==\n                            (_0x4eeea4 = _0x4eeea4[_0x30ac3f(0x377)](/(http:\\/\\/|https:\\/\\/|\\/\\/)?[^\\/]*/, ''))['indexOf']('?')\n                            ? _0x4eeea4[_0x30ac3f(0x3a7)](-0x819 * 0x3 + 0x1d1c + -0x9 * 0x89, _0x4eeea4[_0x30ac3f(0x2c5)]('?'))\n                            : _0x4eeea4) || '/')\n            }\n\n            function _0x446110(_0xc80785) {\n                var _0x5bf664 = _0x5612de,\n                    _0x471548 = _0xc80785 || '',\n                    _0x2cf363 = _0x471548[_0x5bf664(0x1c2)](/[?](\\w+=.*&?)*/),\n                    _0x137237 = (_0x471548 = _0x2cf363\n                        ? _0x2cf363[-0x2292 + -0x4 * 0x520 + 0x173 * 0x26][_0x5bf664(0x3a7)](0x112 * 0x11 + 0x61 + -0x2 * 0x949)\n                        : '')\n                        ? _0x471548[_0x5bf664(0x342)]('&')\n                        : null,\n                    _0x290269 = {}\n                if (_0x137237) {\n                    for (var _0x15cd4c = 0xd54 + -0x49f + 0x2e7 * -0x3; _0x15cd4c < _0x137237[_0x5bf664(0x259)]; _0x15cd4c++)\n                        _0x290269[_0x137237[_0x15cd4c]['split']('=')[0x65c + 0x3f8 * -0x2 + 0x194]] =\n                            _0x137237[_0x15cd4c][_0x5bf664(0x342)]('=')[0x15bb * -0x1 + -0x50b * 0x4 + 0x29e8]\n                }\n                return _0x290269\n            }\n\n            function _0x3a1cf3(_0x8af04, _0xe4b509) {\n                var _0x28f81c = _0x5612de\n                if (!_0x8af04 || '{}' === JSON[_0x28f81c(0x1e6)](_0x8af04)) return {}\n                for (\n                    var _0x257ee8 = Object[_0x28f81c(0x17f)](_0x8af04)['sort'](), _0x24c84a = {}, _0x4bfbcd = -0x1 * 0x21fb + -0x25 * -0x16 + 0x1ecd;\n                    _0x4bfbcd < _0x257ee8[_0x28f81c(0x259)];\n                    _0x4bfbcd++\n                )\n                    _0x24c84a[_0x257ee8[_0x4bfbcd]] = _0xe4b509 ? _0x8af04[_0x257ee8[_0x4bfbcd]] + '' : _0x8af04[_0x257ee8[_0x4bfbcd]]\n                return _0x24c84a\n            }\n\n            function _0x20b77a(_0x3745f1) {\n                var _0x211da5 = _0x5612de\n                return Array[_0x211da5(0x2af)](_0x3745f1)\n                    ? _0x3745f1['map'](_0x20b77a)\n                    : _0x3745f1 instanceof Object\n                        ? Object[_0x211da5(0x17f)](_0x3745f1)\n                        [_0x211da5(0x38e)]()\n                        [_0x211da5(0x376)](function (_0x4b45b3, _0x5188a8) {\n                            return (_0x4b45b3[_0x5188a8] = _0x20b77a(_0x3745f1[_0x5188a8])), _0x4b45b3\n                        }, {})\n                        : _0x3745f1\n            }\n\n            function _0x483e03(_0x44c650) {\n                var _0x498394 = _0x5612de\n                if (!_0x44c650 || '{}' === JSON[_0x498394(0x1e6)](_0x44c650)) return ''\n                for (\n                    var _0x52341a = Object['keys'](_0x44c650)['sort'](), _0x3c151a = '', _0x4f5c3f = -0xefc + 0x25ba + 0x29 * -0x8e;\n                    _0x4f5c3f < _0x52341a[_0x498394(0x259)];\n                    _0x4f5c3f++\n                )\n                    _0x3c151a += [_0x52341a[_0x4f5c3f]] + '=' + _0x44c650[_0x52341a[_0x4f5c3f]] + '&'\n                return _0x3c151a\n            }\n\n            function _0x4bae98() {\n                var _0x33d77a = _0x5612de\n                try {\n                    return !!window[_0x33d77a(0x3be)]\n                } catch (_0x2002b2) {\n                    return !(0xcab + -0xcff + 0x2 * 0x2a)\n                }\n            }\n\n            function _0x275e5a() {\n                try {\n                    return !!window['localStorage']\n                } catch (_0x2df8fe) {\n                    return !(-0x1ff * -0xd + 0x1cf1 * -0x1 + -0x17f * -0x2)\n                }\n            }\n\n            function _0x4fdb47() {\n                var _0x34b6b1 = _0x5612de\n                try {\n                    return !!window[_0x34b6b1(0x218)]\n                } catch (_0x3b6071) {\n                    return !(0xedb * -0x1 + 0x41b * -0x5 + -0x2 * -0x11b1)\n                }\n            }\n\n            function _0x1afbc2() {\n                return _0x5af46a(_0x4fdb47()) + _0x5af46a(_0x275e5a()) + _0x5af46a(_0x4bae98())\n            }\n\n            function _0xc6f828(_0x23a724) {\n                var _0x198ea0 = _0x5612de,\n                    _0x112670,\n                    _0x256bde = document[_0x198ea0(0x260)](_0x198ea0(0x24d))\n                    ; (_0x256bde[_0x198ea0(0x302)] = 0x1813 * -0x1 + 0x1f94 + 0x751 * -0x1), (_0x256bde[_0x198ea0(0x245)] = -0x205f + 0x4f6 + -0x1b79 * -0x1)\n                var _0xa760ad = _0x256bde['getContext']('2d')\n                    ; (_0xa760ad[_0x198ea0(0x18f)] = '14px\\x20serif'),\n                        _0xa760ad[_0x198ea0(0x196)]('龘ฑภ경', 0x2162 * 0x1 + 0xbbb + -0x2d1b, -0x1 * -0x138a + -0x164e + 0x90 * 0x5),\n                        (_0xa760ad[_0x198ea0(0x3a0)] = -0xa67 + 0x7c * 0x39 + 0x103 * -0x11),\n                        (_0xa760ad[_0x198ea0(0x268)] = 0x22cf * 0x1 + -0x4d3 + 0x5 * -0x5ff),\n                        (_0xa760ad[_0x198ea0(0x340)] = _0x198ea0(0x21b)),\n                        _0xa760ad['arc'](\n                            -0x1 * -0x5dd + -0x6de + 0x109,\n                            -0x336 * 0x4 + -0x167a + 0x712 * 0x5,\n                            -0x7c8 + 0xb80 + -0x3b * 0x10,\n                            0x411 + 0x38 * -0xaa + 0x3d * 0x8b,\n                            0x7f * -0x20 + 0x11bb + -0x1d9\n                        ),\n                        _0xa760ad['stroke'](),\n                        (_0x112670 = _0x256bde[_0x198ea0(0x239)]())\n                for (var _0x367ff8 = 0xfa7 * -0x1 + -0x53 * 0x6d + 0x32fe; _0x367ff8 < 0x17b + -0x1b0e * 0x1 + 0x2b * 0x99; _0x367ff8++)\n                    _0x23a724 =\n                        ((0x1675 * -0xc + -0xe91a + 0x2f6d5) * _0x23a724 + _0x112670['charCodeAt'](_0x23a724 % _0x112670[_0x198ea0(0x259)])) >>>\n                        (-0x44 + 0xfa0 * -0x2 + -0x1f84 * -0x1)\n                return _0x23a724\n            }\n\n            var _0x37a93a = -0x1b3b + 0x2136 + -0x1 * 0x5fb\n\n            function _0x18b4be() {\n                var _0x4d1378 = _0x5612de\n                try {\n                    return (\n                        _0x37a93a ||\n                        (_0x462335[_0x4d1378(0x219)]\n                            ? -(-0x1 * 0x19d5 + -0x1e5d + 0x3833)\n                            : (_0x37a93a = _0xc6f828(0x15 * 0x144d79ba + 0x8831fd63 + -0x153df3ab6)))\n                    )\n                } catch (_0x3c9d0d) {\n                    return -(0x1e58 + -0x26 * -0xcb + 0x3c79 * -0x1)\n                }\n            }\n\n            function _0x1a39c4() {\n                if (_0x37a93a) return _0x37a93a\n                _0x37a93a = _0xc6f828(-0x361cdc2a * -0x5 + 0x17c5 * 0xb369b + -0x2f7 * 0x6a0ca6)\n            }\n\n            var _0x45ece5 = {\n                fpProfileUrl: _0x5612de(0x172)\n            }\n\n            function _0x130155() {\n                var _0x5e9262 = _0x5612de,\n                    _0x380346 = window[_0x5e9262(0x328)]\n                return _0x380346[_0x5e9262(0x302)] + '_' + _0x380346[_0x5e9262(0x245)] + '_' + _0x380346[_0x5e9262(0x17e)]\n            }\n\n            function _0x2a76f8() {\n                var _0x1d2b79 = _0x5612de,\n                    _0xa8cb6a = window['screen']\n                return _0xa8cb6a[_0x1d2b79(0x38a)] + '_' + _0xa8cb6a[_0x1d2b79(0x276)]\n            }\n\n            function _0x3da279() {\n                return new Promise(function (_0x2a10ed) {\n                    var _0x7d3f27 = w_0x25f3\n                    if (_0x7d3f27(0x1b2) in navigator)\n                        try {\n                            navigator['getBattery']()[_0x7d3f27(0x1ed)](function (_0x13ff1d) {\n                                var _0x479b99 = _0x7d3f27\n                                _0x2a10ed(\n                                    _0x13ff1d[_0x479b99(0x3ac)] +\n                                    '_' +\n                                    _0x13ff1d[_0x479b99(0x2b0)] +\n                                    '_' +\n                                    _0x13ff1d[_0x479b99(0x353)] +\n                                    '_' +\n                                    _0x13ff1d[_0x479b99(0x213)]\n                                )\n                            })\n                        } catch (_0x2c28b8) {\n                            _0x2a10ed('')\n                        }\n                    else _0x2a10ed('')\n                })\n            }\n\n            var _0x47ec2a = {}\n\n            function _0x299f3a() {\n                var _0x2531b6 = _0x5612de,\n                    _0x1a8a34,\n                    _0x2e0843 = _0x2531b6(0x33b),\n                    _0x29ea20 = -0x12a4 + 0x30b + 0xf99\n                void (-0x2b * 0xa + -0x1d8d + 0x1f3b) !== navigator[_0x2e0843] && (_0x29ea20 = navigator[_0x2e0843])\n                try {\n                    document[_0x2531b6(0x188)](_0x2531b6(0x240)), (_0x1a8a34 = !(-0x1f61 + 0x19 * 0x22 + 0x1c0f))\n                } catch (_0x3992e0) {\n                    _0x1a8a34 = !(0x17 * -0x5d + -0x1 * 0x209 + 0x377 * 0x3)\n                }\n                var _0x11190a = _0x2531b6(0x1ea) in window\n                return (\n                    Object[_0x2531b6(0x2a0)](_0x47ec2a, {\n                        maxTouchPoints: _0x29ea20,\n                        touchEvent: _0x1a8a34,\n                        touchStart: _0x11190a\n                    }),\n                    _0x29ea20 + '_' + _0x1a8a34 + '_' + _0x11190a\n                )\n            }\n\n            function _0xbe842b() {\n                return _0x47ec2a\n            }\n\n            function _0x4649a1() {\n                var _0x3b6f20 = _0x5612de,\n                    _0x4256a7 = new Date()\n                _0x4256a7[_0x3b6f20(0x22d)](-0x1477 + 0xde4 * -0x1 + 0xb74 * 0x3), _0x4256a7[_0x3b6f20(0x294)](-0x360 + -0x263d + 0x29a2)\n                var _0x213a03 = -_0x4256a7[_0x3b6f20(0x237)]()\n                _0x4256a7[_0x3b6f20(0x294)](-0x9b5 + 0x5 * 0x77e + -0x2 * 0xddb)\n                var _0x5a2621 = -_0x4256a7[_0x3b6f20(0x237)]()\n                return Math['min'](_0x213a03, _0x5a2621)\n            }\n\n            function _0x487576() {\n                var _0x5557a1 = _0x5612de\n                if (_0x6caf[_0x5557a1(0x2db)]) return _0x6caf[_0x5557a1(0x2db)]\n                try {\n                    var _0x4f28ec = document[_0x5557a1(0x260)](_0x5557a1(0x24d))[_0x5557a1(0x2f9)]('webgl'),\n                        _0x36473d = _0x4f28ec['getExtension'](_0x5557a1(0x375)),\n                        _0x3ebb8d =\n                            _0x4f28ec[_0x5557a1(0x383)](_0x36473d['UNMASKED_VENDOR_WEBGL']) + '/' + _0x4f28ec['getParameter'](_0x36473d[_0x5557a1(0x39e)])\n                    return (_0x6caf[_0x5557a1(0x2db)] = _0x3ebb8d), _0x3ebb8d\n                } catch (_0x2b9fa5) {\n                    return ''\n                }\n            }\n\n            function _0x4f323e() {\n                var _0x2968a5 = _0x5612de,\n                    _0xf55c22 = [_0x2968a5(0x27b), 'sans-serif', _0x2968a5(0x1fb)],\n                    _0x3ed5f8 = {},\n                    _0x2fef11 = {}\n                if (!document[_0x2968a5(0x189)]) return '0'\n                for (var _0x6f70bc = -0x2271 + 0x2f * 0x72 + 0xd83, _0x3e66d7 = _0xf55c22; _0x6f70bc < _0x3e66d7['length']; _0x6f70bc++) {\n                    var _0x189f91 = _0x3e66d7[_0x6f70bc],\n                        _0x2bf145 = document[_0x2968a5(0x260)](_0x2968a5(0x1f7))\n                        ; (_0x2bf145['innerHTML'] = _0x2968a5(0x2a3)),\n                            (_0x2bf145['style'][_0x2968a5(0x362)] = '72px'),\n                            (_0x2bf145['style']['fontFamily'] = _0x189f91),\n                            document[_0x2968a5(0x189)][_0x2968a5(0x26c)](_0x2bf145),\n                            (_0x3ed5f8[_0x189f91] = _0x2bf145[_0x2968a5(0x2ee)]),\n                            (_0x2fef11[_0x189f91] = _0x2bf145['offsetHeight']),\n                            document[_0x2968a5(0x189)][_0x2968a5(0x30d)](_0x2bf145)\n                }\n                var _0x4f59cf,\n                    _0x4abd0f = [\n                        'Trebuchet\\x20MS',\n                        _0x2968a5(0x177),\n                        _0x2968a5(0x25d),\n                        'Segoe\\x20UI',\n                        _0x2968a5(0x321),\n                        _0x2968a5(0x192),\n                        'MT\\x20Extra',\n                        _0x2968a5(0x3a9),\n                        _0x2968a5(0x28e),\n                        _0x2968a5(0x346),\n                        'Meiryo',\n                        _0x2968a5(0x247),\n                        _0x2968a5(0x1ef),\n                        _0x2968a5(0x1d8),\n                        'IrisUPC',\n                        'Palatino',\n                        'Colonna\\x20MT',\n                        'Playbill',\n                        _0x2968a5(0x1f4),\n                        _0x2968a5(0x288),\n                        _0x2968a5(0x1f2),\n                        _0x2968a5(0x38d),\n                        'OPTIMA',\n                        _0x2968a5(0x2d9),\n                        _0x2968a5(0x348),\n                        _0x2968a5(0x2b3),\n                        'Savoye\\x20LET',\n                        _0x2968a5(0x3c5),\n                        _0x2968a5(0x21e)\n                    ]\n                _0x4f59cf = -0x255b * -0x1 + -0x1 * -0x139d + -0x38f8\n                for (var _0x16c300 = -0x1 * 0xc3e + -0x20ff + 0x2d3d; _0x16c300 < _0x4abd0f[_0x2968a5(0x259)]; _0x16c300++) {\n                    var _0x2c3be4,\n                        _0x37b937 = _0x350075(_0xf55c22)\n                    try {\n                        for (_0x37b937['s'](); !(_0x2c3be4 = _0x37b937['n']())[_0x2968a5(0x1e3)];) {\n                            var _0x400340 = _0x2c3be4['value'],\n                                _0x200821 = document[_0x2968a5(0x260)]('span')\n                                ; (_0x200821[_0x2968a5(0x36a)] = _0x2968a5(0x2a3)),\n                                    (_0x200821['style'][_0x2968a5(0x362)] = _0x2968a5(0x283)),\n                                    (_0x200821[_0x2968a5(0x280)]['fontFamily'] = _0x4abd0f[_0x16c300] + ',' + _0x400340),\n                                    document['body'][_0x2968a5(0x26c)](_0x200821)\n                            var _0x533f71 = _0x200821[_0x2968a5(0x2ee)] !== _0x3ed5f8[_0x400340] || _0x200821[_0x2968a5(0x2a4)] !== _0x2fef11[_0x400340]\n                            if ((document[_0x2968a5(0x189)][_0x2968a5(0x30d)](_0x200821), _0x533f71)) {\n                                _0x16c300 < -0x45 * -0x8a + -0x7a9 + -0x1d6b && (_0x4f59cf |= (-0x239 + 0x3 * -0x458 + 0xf42) << _0x16c300)\n                                break\n                            }\n                        }\n                    } catch (_0x5c1c6e) {\n                        _0x37b937['e'](_0x5c1c6e)\n                    } finally {\n                        _0x37b937['f']()\n                    }\n                }\n                return _0x4f59cf[_0x2968a5(0x3ae)](-0xe97 + -0x183c + -0x1 * -0x26e3)\n            }\n\n            function _0x5090f5() {\n                var _0x458c87 = _0x5612de\n                try {\n                    new WebSocket(_0x458c87(0x199))\n                } catch (_0x34e866) {\n                    return _0x34e866[_0x458c87(0x312)]\n                }\n            }\n\n            function _0x468d57() {\n                var _0x2ef0c5 = _0x5612de\n                return eval[_0x2ef0c5(0x3ae)]()[_0x2ef0c5(0x259)]\n            }\n\n            function _0x5bbaf0() {\n                var _0x5ec561 = _0x5612de,\n                    _0x5971d6 = window['RTCPeerConnection'] || window[_0x5ec561(0x2e0)] || window[_0x5ec561(0x19a)],\n                    _0x5aac87 = []\n                return new Promise(function (_0x4e6ec1) {\n                    var _0x5af634 = _0x5ec561\n                        ; (_0x176a57() ||\n                            navigator[_0x5af634(0x229)][_0x5af634(0x202)]()[_0x5af634(0x2c5)](_0x5af634(0x20e)) > -0x707 + -0x106 * 0x10 + -0x1 * -0x1767) &&\n                            _0x4e6ec1('')\n                    try {\n                        if (_0x5971d6 && 'function' == typeof _0x5971d6) {\n                            var _0xadabb6 = new _0x5971d6({\n                                iceServers: [\n                                    {\n                                        urls: _0x5af634(0x27c)\n                                    }\n                                ]\n                            }),\n                                _0x4405e6 = function () { },\n                                _0x4de1d1 = /([0-9]{1,3}(\\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/\n                                ; (_0xadabb6[_0x5af634(0x1eb)] = function () {\n                                    var _0x374eb0 = _0x5af634\n                                    _0x374eb0(0x162) === _0xadabb6['iceGatheringState'] && (_0xadabb6[_0x374eb0(0x27a)](), (_0xadabb6 = null))\n                                }),\n                                    (_0xadabb6['onicecandidate'] = function (_0x4e2717) {\n                                        var _0x18e62e = _0x5af634\n                                        if (_0x4e2717 && _0x4e2717[_0x18e62e(0x227)] && _0x4e2717[_0x18e62e(0x227)][_0x18e62e(0x227)]) {\n                                            if ('' === _0x4e2717['candidate'][_0x18e62e(0x227)]) return\n                                            var _0x1d1cd1 = _0x4de1d1['exec'](_0x4e2717[_0x18e62e(0x227)][_0x18e62e(0x227)])\n                                            if (null !== _0x1d1cd1 && _0x1d1cd1[_0x18e62e(0x259)] > -0x1675 * 0x1 + -0x19 * 0xdd + 0x19 * 0x1c3) {\n                                                var _0xbaa956 = _0x1d1cd1[-0x1bdd * 0x1 + 0x13 * -0x1df + -0x11 * -0x3bb]\n                                                    ; -(0x1 * -0x12c1 + -0xa * 0x38c + -0x4ee * -0xb) === _0x5aac87[_0x18e62e(0x2c5)](_0xbaa956) &&\n                                                        _0x5aac87[_0x18e62e(0x36e)](_0xbaa956)\n                                            }\n                                        } else _0x4e6ec1(_0x5aac87[_0x18e62e(0x24f)]())\n                                    }),\n                                    _0xadabb6[_0x5af634(0x1e5)]('')\n                            // setTimeout(function () {\n                            //     var _0x36b72e = _0x5af634;\n                            //     _0x4e6ec1(_0x5aac87[_0x36b72e(0x24f)]());\n                            // }, 0x2205 * 0x1 + 0x1d4 * -0x10 + -0x67 * 0x7);\n                            var _0x38a358 = _0xadabb6[_0x5af634(0x2f5)]()\n                            _0x38a358 instanceof Promise\n                                ? _0x38a358[_0x5af634(0x1ed)](function (_0x33e26c) {\n                                    return _0xadabb6['setLocalDescription'](_0x33e26c)\n                                })[_0x5af634(0x1ed)](_0x4405e6)\n                                : _0xadabb6['createOffer'](function (_0x1c6e51) {\n                                    _0xadabb6['setLocalDescription'](_0x1c6e51, _0x4405e6, _0x4405e6)\n                                }, _0x4405e6)\n                        } else _0x4e6ec1('')\n                    } catch (_0x31debb) {\n                        _0x4e6ec1('')\n                    }\n                })\n            }\n\n            function _0x2e02ca() {\n                var _0x74cdcb = _0x5612de\n                return _0x74cdcb(0x3af)[_0x74cdcb(0x377)](/[xy]/g, function (_0x5790dd) {\n                    var _0x52f0b5 = _0x74cdcb,\n                        _0x2eeaf3 = ((0x506 + -0x85c + -0x2 * -0x1b3) * Math[_0x52f0b5(0x18e)]()) | (0xbb9 * -0x1 + 0x1 * 0x9dd + 0x1dc)\n                    return (\n                        'x' == _0x5790dd ? _0x2eeaf3 : ((-0xd1f * 0x1 + 0x1df6 + -0x1 * 0x10d4) & _0x2eeaf3) | (0x182d + -0x10 * 0x262 + -0xdfb * -0x1)\n                    )[_0x52f0b5(0x3ae)](0x1a65 + 0x3 * 0x17a + 0x13b * -0x19)\n                })\n            }\n\n            function _0x2e2fa0(_0x1a6938) {\n                var _0x5aaa98 = _0x5612de\n                return (\n                    -0x14 * 0x1df + 0x649 + 0x1f45 === _0x1a6938[_0x5aaa98(0x259)] &&\n                    _0x246aeb(\n                        -0x21ad + 0x819 * -0x1 + 0x29c6,\n                        _0x1a6938[_0x5aaa98(0x1b0)](-0x1a55 * 0x1 + 0x1279 + 0x7dc, 0x31b + -0xcb4 * -0x1 + -0xfaf)\n                    )\n                    [_0x5aaa98(0x3ae)]()\n                    ['substring'](0x17cc + 0x1 * -0xd19 + -0x3 * 0x391, -0x1ff * 0x1 + 0x2579 + -0x1c6 * 0x14) ===\n                    _0x1a6938[_0x5aaa98(0x1b0)](0x1746 + 0x7b8 + -0x1ede, -0x369 * -0x2 + -0x5e5 * 0x4 + 0xbc * 0x17)\n                )\n            }\n\n            function _0x178d7c() {\n                var _0x4d5814 = _0x5612de,\n                    _0x2d4341 = _0x24dc34(_0x4d5814(0x262))\n                return (\n                    (_0x2d4341 && _0x2e2fa0(_0x2d4341)) ||\n                    _0x1f42cb(\n                        _0x4d5814(0x262),\n                        (_0x2d4341 = ((_0x2d4341 = _0x2e02ca()) + _0x246aeb(0x17 * 0x12d + -0x6 * 0x3f7 + -0x341, _0x2d4341))[_0x4d5814(0x1b0)](\n                            0x2d1 * -0xd + 0x3a * -0x7c + 0x40b5,\n                            0x188e + 0x13 * -0x127 + -0x287\n                        ))\n                    ),\n                    _0x2d4341\n                )\n            }\n\n            function _0x3c0a68(_0x449fe8, _0x5ede0c) {\n                var _0x40bd5b = _0x5612de,\n                    _0x401085 = null\n                try {\n                    _0x401085 = document['getElementsByTagName'](_0x40bd5b(0x221))[-0x2581 + 0x844 + -0x1d3d * -0x1]\n                } catch (_0x599ca4) {\n                    _0x401085 = document['body']\n                }\n                if (null !== _0x401085) {\n                    var _0x3a3665 = document[_0x40bd5b(0x260)](_0x40bd5b(0x361)),\n                        _0x215422 =\n                            '_' +\n                            parseInt((0x3df0 + 0x13d + -0x181d) * Math['random'](), 0x1 * -0x2141 + -0x1 * -0xf82 + 0x11c9) +\n                            '_' +\n                            new Date()[_0x40bd5b(0x16d)]()\n                        ; (_0x449fe8 += _0x40bd5b(0x1be) + _0x215422),\n                            (_0x3a3665[_0x40bd5b(0x16b)] = _0x449fe8),\n                            (window[_0x215422] = function (_0x1efd79) {\n                                var _0x4afb72 = _0x40bd5b\n                                try {\n                                    _0x5ede0c(_0x1efd79), _0x401085[_0x4afb72(0x30d)](_0x3a3665), delete window[_0x215422]\n                                } catch (_0xf98f95) { }\n                            }),\n                            _0x401085[_0x40bd5b(0x26c)](_0x3a3665)\n                }\n            }\n\n            function _0x4072ad(_0x18cd85) {\n                return w_0x5c3140(\n                    '484e4f4a403f524300022c395eafc0a4000000004a04440d00000030110104324700040700004202110100030443011400011100010211010102110102110104110001430207000143021842000200404f4c4d4a4b484946474445424340415e5f5c5d5a5b58595657546f6c6d6a6b686966676465626360617e7f7c7d7a7b78797677743e3f3c3d3a3b383936372320',\n                    {\n                        get 0x0() {\n                            return _0x325f58\n                        },\n                        get 0x1() {\n                            return _0x328bde\n                        },\n                        get 0x2() {\n                            return _0xdda738\n                        },\n                        0x3: arguments,\n                        0x4: _0x18cd85\n                    },\n                    this\n                )\n            }\n\n            function _0x5c0cdd(_0x380d2b, _0x1c644a) {\n                var _0x349270 = _0x5612de\n                if (_0x1c644a) {\n                    for (\n                        var _0x25fd23 = -0xbdc + -0xd78 * -0x2 + -0xf14, _0x2c655d = -0x1 * -0xbdb + 0xc2 + -0xc9d;\n                        _0x2c655d < _0x380d2b[_0x349270(0x259)];\n                        _0x2c655d++\n                    )\n                        _0x380d2b[_0x2c655d]['p'] && (_0x380d2b[_0x2c655d]['r'] = _0x1c644a[_0x25fd23++])\n                }\n                var _0x20da32 = ''\n                _0x380d2b[_0x349270(0x254)](function (_0x564ece) {\n                    _0x20da32 += _0x5af46a(_0x564ece['r']) + '^^'\n                }),\n                    (_0x20da32 += _0x30c916())\n                var _0x2803a3 = _0x2e02ca(),\n                    _0x273650 =\n                        Math[_0x349270(0x1cf)](_0x2803a3[_0x349270(0x195)](0x127a + 0x22e0 + -0x3557 * 0x1) / (0x1 * 0x199f + -0xab4 + -0x1 * 0xee3)) +\n                        (_0x2803a3[_0x349270(0x195)](-0x15 * 0xca + -0x1ff6 * -0x1 + 0x1 * -0xf61) % (-0x1085 + -0x553 + 0x15e0)),\n                    _0x102025 = _0x2803a3['substring'](0x1 * -0x1ebf + 0x13a1 + 0x1e * 0x5f, 0x5c7 + -0x5a5 + -0x5 * 0x6 + _0x273650)\n                _0x20da32 = _0x328bde(_0xdda738(_0x20da32, _0x102025) + _0x2803a3)\n                var _0x197e34 = _0x45ece5['fpProfileUrl']\n                _0x3c0a68((_0x197e34 += _0x349270(0x173) + encodeURIComponent(_0x20da32) + '&'), function (_0x5b4c95) {\n                    var _0x3c0c48 = _0x349270\n                    0x1db6 + -0x21d * 0x1 + -0x1b99 == _0x5b4c95[_0x3c0c48(0x356)] &&\n                        _0x5b4c95['fp'] &&\n                        ((_0x462335[_0x3c0c48(0x35f)] = _0x5b4c95['fp']),\n                            (_0x462335[_0x3c0c48(0x363)] = _0x4072ad(_0x5b4c95['fp'])),\n                            _0x1f42cb('tt_scid', _0x5b4c95['fp']))\n                })\n            }\n\n            function _0x1c3b6d(_0x20f8c9) {\n                var _0x596053 = _0x5612de\n                return w_0x5c3140(\n                    _0x596053(0x242),\n                    {\n                        get 0x0() {\n                            return navigator\n                        },\n                        get 0x1() {\n                            return window\n                        },\n                        get 0x2() {\n                            return document\n                        },\n                        get 0x3() {\n                            return _0x30c916\n                        },\n                        get 0x4() {\n                            return _0x1afbc2\n                        },\n                        get 0x5() {\n                            return _0x18b4be\n                        },\n                        get 0x6() {\n                            return _0x130155\n                        },\n                        get 0x7() {\n                            return _0x2a76f8\n                        },\n                        get 0x8() {\n                            return _0x3da279\n                        },\n                        get 0x9() {\n                            return _0x299f3a\n                        },\n                        get 0xa() {\n                            return _0x4649a1\n                        },\n                        get 0xb() {\n                            return _0x487576\n                        },\n                        get 0xc() {\n                            return _0x4f323e\n                        },\n                        get 0xd() {\n                            return _0x1f9824\n                        },\n                        get 0xe() {\n                            return _0x24dc34\n                        },\n                        get 0xf() {\n                            return _0x5090f5\n                        },\n                        get 0x10() {\n                            return _0x468d57\n                        },\n                        get 0x11() {\n                            return _0x5bbaf0\n                        },\n                        get 0x12() {\n                            return _0x45b94b\n                        },\n                        get 0x13() {\n                            return _0x178d7c\n                        },\n                        get 0x14() {\n                            return _0x5af46a\n                        },\n                        0x15: Promise,\n                        get 0x16() {\n                            return _0x5c0cdd\n                        },\n                        0x17: arguments,\n                        0x18: _0x20f8c9\n                    },\n                    this\n                )\n            }\n\n            function _0x20cbf3(_0x38a8fe, _0x406d4b, _0x2e7a9b) {\n                var _0x1b116c = _0x5612de\n                return w_0x5c3140(\n                    _0x1b116c(0x233),\n                    {\n                        0x0: String,\n                        0x1: Date,\n                        get 0x2() {\n                            return _0x45b94b\n                        },\n                        get 0x3() {\n                            return _0x184783\n                        },\n                        get 0x4() {\n                            return location\n                        },\n                        0x5: parseInt,\n                        get 0x6() {\n                            return _0x5863d1\n                        },\n                        0x7: JSON,\n                        get 0x8() {\n                            return _0xf119da\n                        },\n                        get 0x9() {\n                            return _0x3a1cf3\n                        },\n                        get 0xa() {\n                            return _0x20b77a\n                        },\n                        get 0xb() {\n                            return _0x446110\n                        },\n                        0xc: Object,\n                        get 0xd() {\n                            return _0x483e03\n                        },\n                        get 0xe() {\n                            return _0x53f850\n                        },\n                        get 0xf() {\n                            return _0x2a900b\n                        },\n                        get 0x10() {\n                            return _0x18b4be\n                        },\n                        get 0x11() {\n                            return _0x462335\n                        },\n                        get 0x12() {\n                            return _0x4072ad\n                        },\n                        get 0x13() {\n                            return _0x24dc34\n                        },\n                        get 0x14() {\n                            return navigator\n                        },\n                        0x15: arguments,\n                        0x16: _0x38a8fe,\n                        0x17: _0x406d4b,\n                        0x18: _0x2e7a9b\n                    },\n                    this\n                )\n            }\n\n            function _0x5e5a64(_0x27ec41, _0x4e1246) {\n                var _0x15a192 = _0x5612de\n                for (var _0x3f84da = {}, _0x389521 = -0x4bd * -0x1 + -0x28a + -0x233; _0x389521 < _0x4e1246['length']; _0x389521++) {\n                    var _0x58af98 = _0x4e1246[_0x389521],\n                        _0x1b7f4e = _0x27ec41[_0x58af98]\n                    null == _0x1b7f4e && (_0x1b7f4e = !(-0x1f76 + -0x1c06 + 0x3b7d * 0x1)),\n                        null === _0x1b7f4e ||\n                        ('function' != typeof _0x1b7f4e && _0x15a192(0x17d) !== _0x1db123(_0x1b7f4e)) ||\n                        (_0x1b7f4e = !(-0x2 * -0xef9 + -0xa1 * 0x3 + -0xb * 0x28d)),\n                        (_0x3f84da[_0x58af98] = _0x1b7f4e)\n                }\n                return _0x3f84da\n            }\n\n            function _0x2a6ac2() {\n                var _0x42b9bc = _0x5612de\n                return _0x5e5a64(navigator, [\n                    _0x42b9bc(0x36b),\n                    'appName',\n                    _0x42b9bc(0x17a),\n                    _0x42b9bc(0x246),\n                    _0x42b9bc(0x3a4),\n                    _0x42b9bc(0x360),\n                    _0x42b9bc(0x1fa),\n                    _0x42b9bc(0x33b),\n                    _0x42b9bc(0x38c),\n                    _0x42b9bc(0x212),\n                    'vendorSub',\n                    'doNotTrack',\n                    _0x42b9bc(0x24a),\n                    _0x42b9bc(0x2e2),\n                    _0x42b9bc(0x292),\n                    _0x42b9bc(0x390),\n                    _0x42b9bc(0x38f)\n                ])\n            }\n\n            function _0x226933() {\n                var _0xe67fb0 = _0x5612de\n                return _0x5e5a64(window, [\n                    _0xe67fb0(0x29d),\n                    _0xe67fb0(0x222),\n                    _0xe67fb0(0x306),\n                    _0xe67fb0(0x26e),\n                    _0xe67fb0(0x366),\n                    'isSecureContext',\n                    _0xe67fb0(0x3c0),\n                    _0xe67fb0(0x399),\n                    'locationbar',\n                    _0xe67fb0(0x29f),\n                    _0xe67fb0(0x39f),\n                    _0xe67fb0(0x2e0),\n                    'postMessage',\n                    'webkitRequestAnimationFrame',\n                    _0xe67fb0(0x2de),\n                    'netscape'\n                ])\n            }\n\n            function _0x1e5a7f() {\n                var _0x577bf2 = _0x5612de\n                return _0x5e5a64(document, [_0x577bf2(0x335), _0x577bf2(0x253), _0x577bf2(0x373), 'layers', _0x577bf2(0x2c0)])\n            }\n\n            function _0x11a1d6() {\n                var _0x3927af = _0x5612de,\n                    _0x306255 = document[_0x3927af(0x260)](_0x3927af(0x24d)),\n                    _0x3b8708 = null\n                try {\n                    _0x3b8708 = _0x306255[_0x3927af(0x2f9)](_0x3927af(0x26b)) || _0x306255['getContext'](_0x3927af(0x3aa))\n                } catch (_0x30a5e5) { }\n                return _0x3b8708 || (_0x3b8708 = null), _0x3b8708\n            }\n\n            function _0x39c3d8(_0xc6dcf6) {\n                var _0x59367a = _0x5612de,\n                    _0x5a3a25 =\n                        _0xc6dcf6[_0x59367a(0x1d7)](_0x59367a(0x1f1)) ||\n                        _0xc6dcf6[_0x59367a(0x1d7)](_0x59367a(0x2e5)) ||\n                        _0xc6dcf6[_0x59367a(0x1d7)](_0x59367a(0x31a))\n                if (_0x5a3a25) {\n                    var _0x5cca98 = _0xc6dcf6[_0x59367a(0x383)](_0x5a3a25[_0x59367a(0x1bf)])\n                    return 0xb * -0x2b8 + 0xa * 0xe + 0x1d5c === _0x5cca98 && (_0x5cca98 = -0xe6 + -0x1909 + -0xe5 * -0x1d), _0x5cca98\n                }\n                return null\n            }\n\n            function _0x425568() {\n                var _0x556a1e = _0x5612de\n                if (_0x6caf[_0x556a1e(0x23d)]) return _0x6caf[_0x556a1e(0x23d)]\n                var _0x4f4b6e = _0x11a1d6()\n                if (!_0x4f4b6e) return {}\n                var _0x58c017 = {\n                    supportedExtensions: _0x4f4b6e[_0x556a1e(0x30f)]() || [],\n                    antialias: _0x4f4b6e[_0x556a1e(0x1c5)]()[_0x556a1e(0x1a5)],\n                    blueBits: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x27e)]),\n                    depthBits: _0x4f4b6e['getParameter'](_0x4f4b6e[_0x556a1e(0x252)]),\n                    greenBits: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x3c3)]),\n                    maxAnisotropy: _0x39c3d8(_0x4f4b6e),\n                    maxCombinedTextureImageUnits: _0x4f4b6e['getParameter'](_0x4f4b6e[_0x556a1e(0x1d2)]),\n                    maxCubeMapTextureSize: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x300)]),\n                    maxFragmentUniformVectors: _0x4f4b6e['getParameter'](_0x4f4b6e['MAX_FRAGMENT_UNIFORM_VECTORS']),\n                    maxRenderbufferSize: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x2da)]),\n                    maxTextureImageUnits: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x269)]),\n                    maxTextureSize: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x203)]),\n                    maxVaryingVectors: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x264)]),\n                    maxVertexAttribs: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e['MAX_VERTEX_ATTRIBS']),\n                    maxVertexTextureImageUnits: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x205)]),\n                    maxVertexUniformVectors: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e[_0x556a1e(0x19d)]),\n                    shadingLanguageVersion: _0x4f4b6e['getParameter'](_0x4f4b6e['SHADING_LANGUAGE_VERSION']),\n                    stencilBits: _0x4f4b6e['getParameter'](_0x4f4b6e['STENCIL_BITS']),\n                    version: _0x4f4b6e[_0x556a1e(0x383)](_0x4f4b6e['VERSION'])\n                }\n                return (_0x6caf[_0x556a1e(0x23d)] = _0x58c017), _0x58c017\n            }\n\n            function _0x18707d() {\n                var _0x52b59d = _0x5612de,\n                    _0x56cb86 = {}\n                return (\n                    (_0x56cb86[_0x52b59d(0x270)] = _0x2a6ac2()),\n                    (_0x56cb86[_0x52b59d(0x393)] = _0x226933()),\n                    (_0x56cb86[_0x52b59d(0x208)] = _0x1e5a7f()),\n                    (_0x56cb86[_0x52b59d(0x26b)] = _0x425568()),\n                    (_0x56cb86[_0x52b59d(0x381)] = _0x487576()),\n                    (_0x56cb86['plugins'] = _0x1f9824()),\n                    (_0x6caf['SECINFO'] = _0x56cb86),\n                    _0x56cb86\n                )\n            }\n\n            function _0x572e48() {\n                var _0x151b17 = _0x5612de\n                return w_0x5c3140(\n                    _0x151b17(0x1d1),\n                    {\n                        get 0x0() {\n                            return _0x6caf\n                        },\n                        get 0x1() {\n                            return _0x18707d\n                        },\n                        0x2: Date,\n                        get 0x3() {\n                            return _0x325f58\n                        },\n                        get 0x4() {\n                            return _0x328bde\n                        },\n                        get 0x5() {\n                            return _0xdda738\n                        },\n                        0x6: JSON,\n                        0x7: arguments\n                    },\n                    this\n                )\n            }\n\n            var _0x522d20 = {\n                kCallTypeDirect: 0x0,\n                kCallTypeInterceptor: 0x1\n            },\n                _0x2e10da = {\n                    kHttp: 0x0,\n                    kWebsocket: 0x1\n                },\n                _0x3f742e = _0x45b94b\n\n            function _0x5646fa(_0x29e841) {\n                var _0x2ecc2b = _0x5612de\n                for (\n                    var _0x5d379d, _0x5e2317, _0x34abf7 = [], _0x448a08 = -0x25ac + 0x1 * -0x1a4 + -0x128 * -0x22;\n                    _0x448a08 < _0x29e841[_0x2ecc2b(0x259)];\n                    _0x448a08++\n                ) {\n                    ; (_0x5d379d = _0x29e841[_0x2ecc2b(0x195)](_0x448a08)), (_0x5e2317 = [])\n                    do {\n                        _0x5e2317[_0x2ecc2b(0x36e)]((-0x8d * -0x3e + 0x24d * -0x1 + -0x1eda) & _0x5d379d),\n                            (_0x5d379d >>= -0x6d * 0x11 + 0x75 * 0x11 + 0x10 * -0x8)\n                    } while (_0x5d379d)\n                    _0x34abf7 = _0x34abf7[_0x2ecc2b(0x2b8)](_0x5e2317['reverse']())\n                }\n                return _0x34abf7\n            }\n\n            function _0x6bc4ae(_0x4e8b7c) { }\n\n            function _0x5b890d(_0x592717) { }\n\n            function _0x16f345(_0x1a40af) { }\n\n            function _0x361214(_0x426175) { }\n\n            function _0xc35122(_0xe69c60, _0x3e14a1, _0x2d525a) { }\n\n            var _0x5dde58 = {\n                WEB_DEVICE_INFO: 0x8\n            }\n\n            function _0x4df596(_0x14c951, _0x4c06b0) {\n                var _0x3cd5a5 = _0x5612de\n                return JSON[_0x3cd5a5(0x1e6)]({\n                    magic: 0x20200422,\n                    version: 0x1,\n                    dataType: _0x14c951,\n                    strData: _0x4c06b0,\n                    tspFromClient: new Date()[_0x3cd5a5(0x16d)]()\n                })\n            }\n\n            function _0x29a5ac(_0x1a16de, _0x1af868, _0x2e45c3, _0x2a9bcc) {\n                var _0x233cbb = _0x5612de\n                return _0x32af0e(_0x233cbb(0x3a1), _0x1a16de, _0x1af868, _0x2e45c3, _0x2a9bcc)\n            }\n\n            function _0x32af0e(_0x58e2fa, _0x35c6ef, _0x5ce009, _0xba3041, _0x20e80f) {\n                var _0x393ad1 = _0x5612de,\n                    _0x4841fc = new XMLHttpRequest()\n                if (\n                    (_0x4841fc[_0x393ad1(0x18b)](_0x58e2fa, _0x35c6ef, !(-0xb * 0x8b + -0x233 + 0x82c)),\n                        _0x20e80f && (_0x4841fc[_0x393ad1(0x1c6)] = !(0x1 * -0x260f + -0x2 * 0xcdf + 0x3fcd)),\n                        _0xba3041)\n                )\n                    for (\n                        var _0x3f91e1 = -0x2ce + -0x1 * 0xe0f + 0x10dd, _0x2f8bec = Object['keys'](_0xba3041);\n                        _0x3f91e1 < _0x2f8bec[_0x393ad1(0x259)];\n                        _0x3f91e1++\n                    ) {\n                        var _0x475f86 = _0x2f8bec[_0x3f91e1],\n                            _0x42c2b4 = _0xba3041[_0x475f86]\n                        _0x4841fc[_0x393ad1(0x3ab)](_0x475f86, _0x42c2b4)\n                    }\n                _0x4841fc[_0x393ad1(0x20a)](_0x5ce009)\n            }\n\n            function _0x2cd488(_0x751be6, _0x4c12d4) {\n                var _0x253a32 = _0x5612de\n                return (\n                    _0x4c12d4 || (_0x4c12d4 = null),\n                    !!navigator['sendBeacon'] && (navigator[_0x253a32(0x24b)](_0x751be6, _0x4c12d4), !(-0x1da1 + 0x1e93 + -0xf2))\n                )\n            }\n\n            function _0x4a2daf(_0x1ea426, _0x5a460b) {\n                var _0x22c57e = _0x5612de\n                try {\n                    window[_0x22c57e(0x1dc)] && window[_0x22c57e(0x1dc)][_0x22c57e(0x1c4)](_0x1ea426, _0x5a460b)\n                } catch (_0xe6e06d) { }\n            }\n\n            function _0x34f60a(_0x1e7505) {\n                var _0x389acb = _0x5612de\n                try {\n                    window[_0x389acb(0x1dc)] && window[_0x389acb(0x1dc)][_0x389acb(0x2c3)](_0x1e7505)\n                } catch (_0x5daf1b) { }\n            }\n\n            function _0x3d13cf(_0x3480fd) {\n                var _0x1ccc66 = _0x5612de\n                try {\n                    return window[_0x1ccc66(0x1dc)] ? window['localStorage']['getItem'](_0x3480fd) : null\n                } catch (_0x3bb8f0) {\n                    return null\n                }\n            }\n\n            function _0x21db29(_0x584f42, _0xde0f43) {\n                var _0x4464a1 = _0x5612de\n                for (\n                    var _0x2b8d40,\n                    _0x22bd9c = [],\n                    _0x13f024 = 0x1856 * 0x1 + -0x6a * 0x20 + -0x16 * 0x81,\n                    _0x5648fb = '',\n                    _0x4c41a3 = -0x2 * -0xc67 + -0xf91 + -0x5 * 0x1d9;\n                    _0x4c41a3 < -0x1 * -0x322 + -0x25ce + 0x23ac;\n                    _0x4c41a3++\n                )\n                    _0x22bd9c[_0x4c41a3] = _0x4c41a3\n                for (var _0x4d4c13 = -0x18e4 + -0x3 * -0x10f + 0x15b7; _0x4d4c13 < -0x36a * -0x8 + 0x1cf7 + 0x126d * -0x3; _0x4d4c13++)\n                    (_0x13f024 =\n                        (_0x13f024 + _0x22bd9c[_0x4d4c13] + _0x584f42[_0x4464a1(0x195)](_0x4d4c13 % _0x584f42[_0x4464a1(0x259)])) %\n                        (-0x577 * 0x3 + 0x4eb + 0xc7a)),\n                        (_0x2b8d40 = _0x22bd9c[_0x4d4c13]),\n                        (_0x22bd9c[_0x4d4c13] = _0x22bd9c[_0x13f024]),\n                        (_0x22bd9c[_0x13f024] = _0x2b8d40)\n                var _0x11b95d = -0x7d8 + -0x256 + -0x517 * -0x2\n                _0x13f024 = -0x1bef + -0xbc5 * -0x3 + -0x760 * 0x1\n                for (var _0x15a79f = 0xd * 0x12e + 0x80 * -0x3d + 0xf2a; _0x15a79f < _0xde0f43[_0x4464a1(0x259)]; _0x15a79f++)\n                    (_0x13f024 =\n                        (_0x13f024 +\n                            _0x22bd9c[(_0x11b95d = (_0x11b95d + (0x8ed + -0x1 * -0x836 + -0x22 * 0x81)) % (0x32b * 0x7 + 0x2311 + -0x2 * 0x1c1f))]) %\n                        (-0x1 * -0x106d + 0x35e * 0x5 + -0x2043)),\n                        (_0x2b8d40 = _0x22bd9c[_0x11b95d]),\n                        (_0x22bd9c[_0x11b95d] = _0x22bd9c[_0x13f024]),\n                        (_0x22bd9c[_0x13f024] = _0x2b8d40),\n                        (_0x5648fb += String[_0x4464a1(0x1e2)](\n                            _0xde0f43[_0x4464a1(0x195)](_0x15a79f) ^\n                            _0x22bd9c[(_0x22bd9c[_0x11b95d] + _0x22bd9c[_0x13f024]) % (0x179 * -0x7 + 0x2385 + -0x2 * 0xc1b)]\n                        ))\n                return _0x5648fb\n            }\n\n            var _0x45bf15 = _0x21db29,\n                _0x48a082 = {}\n\n            function _0x641e3d(_0x21dbac, _0x4a67ec) {\n                var _0x51016d = _0x5612de\n                return w_0x5c3140(\n                    _0x51016d(0x3c4),\n                    {\n                        0x0: String,\n                        0x1: Math,\n                        get 0x2() {\n                            return _0x45bf15\n                        },\n                        get 0x3() {\n                            return _0x389396\n                        },\n                        0x4: arguments,\n                        0x5: _0x21dbac,\n                        0x6: _0x4a67ec\n                    },\n                    this\n                )\n            }\n\n            ; (_0x48a082['pb'] = -0xd0f * -0x1 + 0xade * 0x2 + -0x22c9), (_0x48a082['json'] = 0x405 + -0x1 * -0xe59 + -0x125d)\n            var _0x216650 = {\n                kNoMove: 0x2,\n                kNoClickTouch: 0x4,\n                kNoKeyboardEvent: 0x8,\n                kMoveFast: 0x10,\n                kKeyboardFast: 0x20,\n                kFakeOperations: 0x40\n            },\n                _0x5dc9cc = {\n                    sTm: 0x0,\n                    acc: 0x0\n                }\n\n            function _0x18a9f7() {\n                var _0x4e02b7 = _0x5612de\n                try {\n                    var _0x41737c = _0x3d13cf(_0x4e02b7(0x343))\n                    _0x41737c\n                        ? Object[_0x4e02b7(0x2a0)](_0x5dc9cc, JSON[_0x4e02b7(0x3b1)](_0x41737c))\n                        : ((_0x5dc9cc[_0x4e02b7(0x293)] = new Date()[_0x4e02b7(0x16d)]()), (_0x5dc9cc[_0x4e02b7(0x27d)] = -0x175c + -0x1066 + 0x27c2))\n                } catch (_0x3da833) {\n                    ; (_0x5dc9cc[_0x4e02b7(0x293)] = new Date()[_0x4e02b7(0x16d)]()),\n                        (_0x5dc9cc[_0x4e02b7(0x27d)] = -0x1 * -0x1129 + -0x1f1f + -0x1 * -0xdf6),\n                        _0x26e186()\n                }\n            }\n\n            function _0x26e186() {\n                var _0x48e1a8 = _0x5612de\n                _0x4a2daf(_0x48e1a8(0x343), JSON['stringify'](_0x5dc9cc))\n            }\n\n            var _0xf63a81 = {\n                T_MOVE: 0x1,\n                T_CLICK: 0x2,\n                T_KEYBOARD: 0x3\n            },\n                _0x2786f5 = !(0x1f31 * -0x1 + 0x1 * 0x22c7 + 0x83 * -0x7),\n                _0x9fb121 = [],\n                _0x207cc5 = [],\n                _0x191fa5 = [],\n                _0xe06992 = {\n                    ubcode: 0x0\n                },\n                _0x388856 = function (_0x4e0342, _0x5ca571) {\n                    return _0x4e0342 + _0x5ca571\n                },\n                _0x20a3d9 = function (_0x2309ca) {\n                    return _0x2309ca * _0x2309ca\n                }\n\n            function _0x9c0be2(_0x232ed8, _0x432cf8) {\n                var _0x59688f = _0x5612de\n                if (\n                    (_0x232ed8[_0x59688f(0x259)] > 0x1 * 0xa93 + 0x1d7a + -0xd17 * 0x3 &&\n                        _0x232ed8['splice'](0x1ab7 + 0x1 * -0x2147 + -0x1a4 * -0x4, 0x617 + 0x280 + 0x1 * -0x833),\n                        _0x232ed8[_0x59688f(0x259)] > -0x1c57 + 0x1059 + 0xbfe)\n                ) {\n                    var _0x97b7e7 = _0x232ed8[_0x232ed8['length'] - (-0xc0e + 0xb26 * 0x2 + 0xa3d * -0x1)]\n                    if (\n                        _0x432cf8['d'] - _0x97b7e7['d'] <= 0x5 * -0x1a3 + -0x91 * -0x32 + 0x5 * -0x407 ||\n                        ('y' in _0x432cf8 && _0x432cf8['x'] === _0x97b7e7['x'] && _0x432cf8['y'] === _0x97b7e7['y'])\n                    )\n                        return\n                }\n                _0x232ed8[_0x59688f(0x36e)](_0x432cf8)\n            }\n\n            function _0x1d26db(_0x261f4b, _0x3c3c83, _0x131716) {\n                var _0x10f2ca = _0x5612de\n                if (_0x462335['enableTrack']) {\n                    if (_0x131716 !== _0xf63a81['T_MOVE'])\n                        return _0x131716 === _0xf63a81[_0x10f2ca(0x1f0)]\n                            ? (_0x261f4b[_0x10f2ca(0x259)] >= 0x1167 + -0x856 * -0x4 + 0x1 * -0x30cb && _0x450b73(),\n                                void _0x261f4b[_0x10f2ca(0x36e)](_0x3c3c83))\n                            : _0x131716 === _0xf63a81[_0x10f2ca(0x355)]\n                                ? (_0x261f4b[_0x10f2ca(0x259)] > -0x1b6 * 0x16 + -0x115 * 0x17 + 0x11 * 0x3cb && _0x450b73(),\n                                    void _0x261f4b['push'](_0x3c3c83))\n                                : void (-0x15a4 + -0xc9f + 0x2243)\n                    if (\n                        (_0x261f4b['length'] >= -0x5b9 + -0x1b5 + -0x2 * -0x4b1 && _0x450b73(),\n                            _0x261f4b[_0x10f2ca(0x259)] > 0x13e * 0x6 + 0x4a5 * -0x2 + 0x1d6)\n                    ) {\n                        var _0x40dc65 = _0x261f4b[_0x261f4b[_0x10f2ca(0x259)] - (-0x233e + 0x6bf + 0x1c80)],\n                            _0x243563 = _0x40dc65['x'],\n                            _0x7ef629 = _0x40dc65['y'],\n                            _0x293666 = _0x40dc65['ts']\n                        if (_0x243563 === _0x3c3c83['x'] && _0x7ef629 === _0x3c3c83['y']) return\n                        if (_0x3c3c83['ts'] - _0x293666 < -0x1 * -0x9dc + -0x7 * -0x32d + -0x1e23) return\n                    }\n                    _0x261f4b['push'](_0x3c3c83)\n                }\n            }\n\n            var _0x19ffaf = {\n                init: 0x0,\n                running: 0x1,\n                exit: 0x2,\n                flush: 0x3\n            }\n\n            function _0x450b73(_0xd6648d) {\n                var _0x5b1d4d = _0x5612de\n                return w_0x5c3140(\n                    _0x5b1d4d(0x3a2),\n                    {\n                        get 0x0() {\n                            return _0x6caf\n                        },\n                        get 0x1() {\n                            return _0x19ffaf\n                        },\n                        0x2: Date,\n                        get 0x3() {\n                            return _0x5dc9cc\n                        },\n                        get 0x4() {\n                            return _0x462335\n                        },\n                        get 0x5() {\n                            return _0x26e186\n                        },\n                        0x6: Object,\n                        get 0x7() {\n                            return _0x4df596\n                        },\n                        get 0x8() {\n                            return _0x5dde58\n                        },\n                        get 0x9() {\n                            return _0x641e3d\n                        },\n                        0xa: JSON,\n                        get 0xb() {\n                            return _0x48a082\n                        },\n                        get 0xc() {\n                            return _0x2cd488\n                        },\n                        get 0xd() {\n                            return _0x29a5ac\n                        },\n                        0xe: arguments,\n                        0xf: _0xd6648d\n                    },\n                    this\n                )\n            }\n\n            function _0x58c311() {\n                var _0x30dab3 = _0x5612de\n                _0x462335[_0x30dab3(0x37f)] && _0x450b73(_0x19ffaf['exit'])\n            }\n\n            var _0x1a755e = {}\n                ; (_0x1a755e[_0x5612de(0x2d4)] = _0x3dcfd5),\n                    (_0x1a755e['touchmove'] = _0x3dcfd5),\n                    (_0x1a755e[_0x5612de(0x364)] = _0x56114b),\n                    (_0x1a755e[_0x5612de(0x1d6)] = _0x19d89b),\n                    (_0x1a755e[_0x5612de(0x2d3)] = _0x19d89b)\n            var _0x18582a = !(0x1796 + -0xf7d + -0x818)\n\n            function _0x1dbe74() {\n                var _0x101f5b = _0x5612de\n                if (document && document[_0x101f5b(0x2f6)] && !_0x18582a) {\n                    for (\n                        var _0x1dfebe = 0x1 * -0xe36 + 0x6e8 + -0xa * -0xbb, _0x5af0b0 = Object[_0x101f5b(0x17f)](_0x1a755e);\n                        _0x1dfebe < _0x5af0b0[_0x101f5b(0x259)];\n                        _0x1dfebe++\n                    ) {\n                        var _0x2ecc3c = _0x5af0b0[_0x1dfebe]\n                        document[_0x101f5b(0x2f6)](_0x2ecc3c, _0x1a755e[_0x2ecc3c])\n                    }\n                    _0x18582a = !(-0x1 * -0xfcb + 0x21 * 0x65 + -0x1cd0)\n                }\n            }\n\n            function _0x3dcfd5(_0x1f9f7e) {\n                var _0x4f99fd = _0x5612de,\n                    _0x395631 = _0x1f9f7e,\n                    _0x1f0c31 = _0x1f9f7e['type']\n                _0x1f9f7e[_0x4f99fd(0x379)] &&\n                    _0x4f99fd(0x299) === _0x1f0c31 &&\n                    ((_0x395631 = _0x1f9f7e['touches'][-0x9 * -0x3f4 + 0x1 * 0xc73 + -0x3007]), (_0x2786f5 = !(-0x129a + 0x1bca + -0x930)))\n                var _0x5d0e65 = {\n                    x: Math[_0x4f99fd(0x1cf)](_0x395631['clientX']),\n                    y: Math[_0x4f99fd(0x1cf)](_0x395631['clientY']),\n                    d: Date[_0x4f99fd(0x34d)]()\n                }\n                _0x9c0be2(_0x9fb121, _0x5d0e65),\n                    _0x1d26db(\n                        _0x6caf[_0x4f99fd(0x21d)],\n                        {\n                            ts: _0x5d0e65['d'],\n                            x: _0x5d0e65['x'],\n                            y: _0x5d0e65['y']\n                        },\n                        _0xf63a81[_0x4f99fd(0x2be)]\n                    )\n            }\n\n            function _0x56114b(_0x35e1c1) {\n                var _0x3de3de = _0x5612de,\n                    _0x411a0a = 0x22e7 + -0x5 * -0x133 + -0x28e6\n                    ; (_0x35e1c1[_0x3de3de(0x28c)] || _0x35e1c1['ctrlKey'] || _0x35e1c1['metaKey'] || _0x35e1c1[_0x3de3de(0x22e)]) &&\n                        (_0x411a0a = 0xe7c + -0x3 * 0x143 + -0xab2)\n                var _0x5239f5 = {\n                    x: _0x411a0a,\n                    d: Date['now']()\n                }\n                _0x9c0be2(_0x191fa5, _0x5239f5),\n                    _0x1d26db(\n                        _0x6caf[_0x3de3de(0x391)],\n                        {\n                            ts: _0x5239f5['d']\n                        },\n                        _0xf63a81[_0x3de3de(0x355)]\n                    )\n            }\n\n            function _0x19d89b(_0x39a86c) {\n                var _0x3bb659 = _0x5612de,\n                    _0x4a9de2 = _0x39a86c,\n                    _0x33eb04 = _0x39a86c['type']\n                _0x39a86c[_0x3bb659(0x379)] &&\n                    'touchstart' === _0x33eb04 &&\n                    ((_0x4a9de2 = _0x39a86c['touches'][0x1491 + 0x1 * -0x1216 + -0x1 * 0x27b]), (_0x2786f5 = !(-0x1 * -0x853 + 0x12df * 0x2 + -0x2e11)))\n                var _0xf57aea = {\n                    x: Math['floor'](_0x4a9de2[_0x3bb659(0x2bf)]),\n                    y: Math[_0x3bb659(0x1cf)](_0x4a9de2['clientY']),\n                    d: Date['now']()\n                }\n                _0x9c0be2(_0x207cc5, _0xf57aea),\n                    _0x1d26db(\n                        _0x6caf[_0x3bb659(0x3b6)],\n                        {\n                            ts: _0xf57aea['d'],\n                            x: _0xf57aea['x'],\n                            y: _0xf57aea['y']\n                        },\n                        _0xf63a81[_0x3bb659(0x1f0)]\n                    )\n            }\n\n            function _0x42fe9b(_0x320405) {\n                var _0x2bf333 = _0x5612de\n                return _0x320405['reduce'](_0x388856) / _0x320405[_0x2bf333(0x259)]\n            }\n\n            function _0x3ea7d6(_0xbdd4a6) {\n                var _0x1e5c1e = _0x5612de\n                if (_0xbdd4a6[_0x1e5c1e(0x259)] <= -0x1 * -0x2420 + 0xc87 * -0x1 + 0x5e6 * -0x4) return -0x1 * -0x309 + 0x15 * 0x9d + -0xfea * 0x1\n                var _0x3deca4 = _0x42fe9b(_0xbdd4a6),\n                    _0x58472b = _0xbdd4a6['map'](function (_0x508d28) {\n                        return _0x508d28 - _0x3deca4\n                    })\n                return Math[_0x1e5c1e(0x317)](\n                    _0x58472b['map'](_0x20a3d9)[_0x1e5c1e(0x376)](_0x388856) / (_0xbdd4a6[_0x1e5c1e(0x259)] - (0xa * 0x127 + -0x2103 + -0xe * -0x189))\n                )\n            }\n\n            function _0x52f064(_0x2031c9, _0x5a5379, _0xb6ab78) {\n                var _0x1d0db5 = _0x5612de,\n                    _0xcfe257 = 0xae8 + -0xb * -0x6f + -0xfad,\n                    _0x4f9c60 = -0x894 + -0x12a7 + 0x1 * 0x1b3b\n                if (_0x2031c9[_0x1d0db5(0x259)] > _0x5a5379) {\n                    for (\n                        var _0x147b41 = [], _0x5ca0e0 = -0x10a8 + -0x212f + 0x3 * 0x109d;\n                        _0x5ca0e0 < _0x2031c9[_0x1d0db5(0x259)] - (0x557 * -0x7 + -0x5 * -0xc6 + 0x14a * 0x1a);\n                        _0x5ca0e0++\n                    ) {\n                        var _0x2a170e = _0x2031c9[_0x5ca0e0 + (-0x20c6 * -0x1 + 0x1f31 + -0x3ff6)],\n                            _0x1f8ecf = _0x2031c9[_0x5ca0e0],\n                            _0x1b82ec = _0x2a170e['d'] - _0x1f8ecf['d']\n                        _0x1b82ec &&\n                            (_0xb6ab78\n                                ? _0x147b41[_0x1d0db5(0x36e)]((0xf98 + 0x90f + 0x2 * -0xc53) / _0x1b82ec)\n                                : _0x147b41[_0x1d0db5(0x36e)](\n                                    Math[_0x1d0db5(0x317)](_0x20a3d9(_0x2a170e['x'] - _0x1f8ecf['x']) + _0x20a3d9(_0x2a170e['y'] - _0x1f8ecf['y'])) /\n                                    _0x1b82ec\n                                ))\n                    }\n                    ; (_0xcfe257 = _0x42fe9b(_0x147b41)),\n                        0x5 * -0x79d + 0xf2d * -0x1 + -0xeb * -0x3a === (_0x4f9c60 = _0x3ea7d6(_0x147b41)) &&\n                        (_0x4f9c60 = 0xcc5 + -0x1 * -0x9e1 + -0x16a6 + 0.01)\n                }\n                return [_0xcfe257, _0x4f9c60]\n            }\n\n            function _0x26d461() {\n                var _0x3f77b6 = _0x5612de,\n                    _0x5e9ee6 = !(0x9d * -0x6 + 0x16b0 + -0x1301),\n                    _0x499168 = -0x21e + -0x1b6a + 0x28 * 0xbd\n                try {\n                    document &&\n                        document['createEvent'] &&\n                        (document[_0x3f77b6(0x188)](_0x3f77b6(0x240)), (_0x5e9ee6 = !(0x195e + -0x5 * -0x371 + -0x3f * 0xad)))\n                } catch (_0x4b2baa) { }\n                var _0x462d0a = _0x52f064(_0x9fb121, 0x6a * 0x2 + -0x1b * 0x16b + 0x2576),\n                    _0x136148 = _0x52f064(_0x191fa5, -0x94c + -0xd * 0x51 + 0xd6e, !(0x1 * 0x7ed + -0xab4 + 0x2c7)),\n                    _0x17d8e6 = -0x2 * 0xb95 + -0xda0 + 0x24cb\n                !_0x5e9ee6 && _0x2786f5 && ((_0x17d8e6 |= 0x2468 + -0x1 * 0x2c2 + -0x2166), (_0x499168 |= _0x216650[_0x3f77b6(0x2f2)])),\n                    -0x293 * -0x3 + 0x1 * 0xdad + -0x1566 === _0x9fb121['length']\n                        ? ((_0x17d8e6 |= -0x1cf3 * 0x1 + 0x12e1 + 0xa14), (_0x499168 |= _0x216650[_0x3f77b6(0x2fe)]))\n                        : _0x462d0a[-0x17f8 + -0x1eae + 0x36a6] > 0xbab + -0x1fb9 + 0x3 * 0x6c0 &&\n                        ((_0x17d8e6 |= 0x20 * -0x5c + 0xb22 + 0x6e), (_0x499168 |= _0x216650['kMoveFast'])),\n                    0x2297 * -0x1 + 0x57b * 0x3 + 0x65 * 0x2e === _0x207cc5['length'] &&\n                    ((_0x17d8e6 |= 0x15a5 + 0x557 + -0x1af8), (_0x499168 |= _0x216650['kNoClickTouch'])),\n                    0x20bb + 0x1e5f + 0x1f8d * -0x2 === _0x191fa5[_0x3f77b6(0x259)]\n                        ? ((_0x17d8e6 |= -0x1 * 0x1b73 + -0x43e + 0x1fb9), (_0x499168 |= _0x216650['kNoKeyboardEvent']))\n                        : _0x136148[0x16ee + -0x1 * 0x1e99 + 0x7ab] > 0x1 * 0xb77 + -0x82 + -0xaf5 + 0.5 &&\n                        ((_0x17d8e6 |= 0x176a + 0x183 + 0x7 * -0x38b), (_0x499168 |= _0x216650[_0x3f77b6(0x3bf)])),\n                    (_0xe06992['ubcode'] = _0x499168)\n                var _0x9340b9 = _0x17d8e6[_0x3f77b6(0x3ae)](-0x2018 + -0x543 * 0x7 + 0x450d)\n                return (\n                    0xc8e * 0x1 + -0x3 * 0x3ca + -0x12f === _0x9340b9['length']\n                        ? (_0x9340b9 = '00' + _0x9340b9)\n                        : -0x117a + 0x19 * -0x57 + 0x8a9 * 0x3 === _0x9340b9[_0x3f77b6(0x259)] && (_0x9340b9 = '0' + _0x9340b9),\n                    _0x9340b9\n                )\n            }\n\n            function _0x5047d8() {\n                _0x450b73(-0x1b05 + 0x103 * 0x1c + -0x4 * 0x53)\n            }\n\n            function _0x4145f8(_0x30c511, _0x35c283) {\n                var _0x46d631 = _0x5612de\n                for (\n                    var _0x3d95be = _0x35c283[_0x46d631(0x259)],\n                    _0x3c9714 = new ArrayBuffer(_0x3d95be + (-0x2ef * -0x2 + 0x1bbd + 0x2e * -0xbb)),\n                    _0x1054b9 = new Uint8Array(_0x3c9714),\n                    _0x5633c2 = -0x114 + -0x2096 + 0x21aa,\n                    _0x28d040 = 0x10a * -0x1a + 0x5 * 0x5cf + -0x207 * 0x1;\n                    _0x28d040 < _0x3d95be;\n                    _0x28d040++\n                )\n                    (_0x1054b9[_0x28d040] = _0x35c283[_0x28d040]), (_0x5633c2 ^= _0x35c283[_0x28d040])\n                _0x1054b9[_0x3d95be] = _0x5633c2\n                var _0x280d0b =\n                    (-0xe * -0x98 + 0x1f * 0x9e + 0x6f * -0x3d) &\n                    Math[_0x46d631(0x1cf)]((-0x1 * 0x13ed + -0x2 * 0x581 + 0x1fee) * Math[_0x46d631(0x18e)]()),\n                    _0x418204 = String[_0x46d631(0x1e2)][_0x46d631(0x207)](null, _0x1054b9),\n                    _0x250194 = _0x21db29(String[_0x46d631(0x1e2)](_0x280d0b), _0x418204),\n                    _0x37237c = ''\n                return (\n                    (_0x37237c += String[_0x46d631(0x1e2)](_0x30c511)),\n                    (_0x37237c += String[_0x46d631(0x1e2)](_0x280d0b)),\n                    _0x389396((_0x37237c += _0x250194), 's1')\n                )\n            }\n\n            function _0x1633f2(_0x48f290, _0x504655, _0x4fa808, _0x1a5c57, _0x3a4737) {\n                var _0x5a9e67 = _0x5612de\n                _0x5863d1(), _0x26d461(), void (0x247a + -0x3f2 + -0x2088) !== _0x1a5c57 && '' !== _0x1a5c57 && (_0x1a5c57 = '')\n                var _0x21ca02 = _0x5dd467(_0x1a5c57)\n                _0x3a4737 || (_0x3a4737 = '00000000000000000000000000000000')\n                var _0x1fb174 = new ArrayBuffer(0x1cc4 + -0x1109 + -0x3e6 * 0x3),\n                    _0x1ffaa7 = new Uint8Array(_0x1fb174),\n                    _0xeefda2 =\n                        (0x22cb + 0x1 * -0x32c + 0x1f9f * -0x1) |\n                        (_0x48f290 << (-0x228e + 0x22f4 * 0x1 + -0x60)) |\n                        (_0x504655 << (0x1075 + -0x2c * -0x26 + -0x16f8)) |\n                        (((-0x261a + 0x1e95 + 0x786) & Math[_0x5a9e67(0x1cf)]((0x705 + 0x1069 + -0x3 * 0x7ae) * Math[_0x5a9e67(0x18e)]())) <<\n                            (0x3f4 * 0x5 + 0x59a + -0x195a)) |\n                        (-0x1 * -0x2033 + 0x284 * 0x5 + 0xeed * -0x3)\n                _0x6caf[_0x5a9e67(0x326)]++\n                _0x6caf['envcode'] = 1\n                var _0x5eb39b = (-0x55 + 0x8a3 + -0x80f) & _0x6caf[_0x5a9e67(0x326)]\n                    ; (_0x1ffaa7[0x18e0 * 0x1 + 0xd8d + -0x266d] = (_0x4fa808 << (-0x1 * 0x1117 + -0x144f + 0x256c)) | _0x5eb39b),\n                        (_0x1ffaa7[-0x177d + 0x3 * 0xb39 + -0xa2d] = (_0x6caf['envcode'] >> (-0x163b + 0x2c3 + 0x1380)) & (0x15b3 + -0x1efd + 0xa49 * 0x1)),\n                        (_0x1ffaa7[-0x5e3 + -0x1 * 0x1535 + 0x1b1a * 0x1] = (0x64a + -0xc * 0xa3 + 0x259) & _0x6caf[_0x5a9e67(0x380)]),\n                        (_0x1ffaa7[0x81 * 0x11 + 0xa49 * 0x1 + -0x12d7] = _0xe06992[_0x5a9e67(0x382)])\n                var _0x13f487 = _0x42e709[_0x5a9e67(0x2b7)](_0x5dd467(_0x42e709[_0x5a9e67(0x2b7)](_0x21ca02)))\n                    ; (_0x1ffaa7[-0xf6b * 0x2 + 0x1c4 + 0x1d16] = _0x13f487[-0x81a + -0x24ee + -0x18e * -0x1d]),\n                        (_0x1ffaa7[0x73d * -0x3 + 0x2335 + -0x1 * 0xd79] = _0x13f487[-0x16 * -0x4 + -0xfdd + 0x3e5 * 0x4])\n                var _0x136ce1 = _0x42e709['decode'](_0x5dd467(_0x42e709['decode'](_0x3a4737)))\n                return (\n                    (_0x1ffaa7[0x17 * -0x35 + 0x220e + -0x1d45] = _0x136ce1[0xe7 * -0x11 + 0x1 * -0x17a1 + 0x2706]),\n                    (_0x1ffaa7[0x1b8 + -0x2 * -0x665 + 0x151 * -0xb] = _0x136ce1[-0x276 * 0x9 + -0x1335 + -0x39 * -0xba]),\n                    (_0x1ffaa7[0x1fa8 + 0x776 + 0x1 * -0x2716] =\n                        (-0x23cd + -0x69d + 0x2b69) & Math[_0x5a9e67(0x1cf)]((0x9c + 0x77b * 0x4 + -0x1 * 0x1d89) * Math[_0x5a9e67(0x18e)]())),\n                    _0x4145f8(_0xeefda2, _0x1ffaa7)\n                )\n            }\n\n            function _0x34c70a(_0xf6b3d0, _0x289075, _0x2c48ed) {\n                var _0x1fe583 = _0x5612de\n                return {\n                    'X-Bogus': _0x1633f2(_0x2e10da[_0x1fe583(0x289)], _0x462335['initialized'], _0xf6b3d0, null, _0x2c48ed)\n                }\n            }\n\n            function _0x11233a(_0x34d47b, _0x1b3ba5, _0x55dcd4) {\n                var _0x3e598d = _0x5612de\n                return {\n                    'X-Bogus': _0x1633f2(_0x2e10da[_0x3e598d(0x1df)], _0x462335[_0x3e598d(0x1fc)], _0x34d47b, _0x1b3ba5, _0x55dcd4)\n                }\n            }\n\n            function _0x5c2014(_0x1fa689) {\n                return w_0x5c3140(\n                    '484e4f4a403f524300362d0a5f00233c0000000029b6a730000000630214000103001400020700001400030700011400041101031100031347000d11010311000313140001450023110103110004134700130211010011010311000413430114000145000607000214000102110101110002021100014303140005110005420003096b1e7e601e606766710c6b1e7e601e63726a7f7c7277200303030303030303030303030303030303030303030303030303030303030303',\n                    {\n                        get 0x0() {\n                            return _0x5dd467\n                        },\n                        get 0x1() {\n                            return _0x34c70a\n                        },\n                        0x2: arguments,\n                        0x3: _0x1fa689\n                    },\n                    this\n                )\n            }\n\n            function _0x3c875d(_0x17e2b2, _0x1e7967) {\n                var _0x36f0c4 = _0x5612de,\n                    _0x292251 = new Uint8Array(-0x1d76 + 0xa81 * -0x3 + 0x3cfc)\n                return (\n                    (_0x292251[0xff * 0x25 + 0x1ee0 * -0x1 + -0x5fb] = _0x17e2b2 / (0x1126 * -0x2 + -0x1 * 0x20f6 + -0x2 * -0x2221)),\n                    (_0x292251[0x29 * -0xde + 0x25a6 + 0x6b * -0x5] = _0x17e2b2 % (-0x5 * 0x705 + 0x10bd + -0xb1 * -0x1c)),\n                    (_0x292251[-0x1 * -0x1fb5 + -0x1921 + -0x692] = _0x1e7967 % (0x1615 + -0xda0 + 0x1 * -0x775)),\n                    String[_0x36f0c4(0x1e2)][_0x36f0c4(0x207)](null, _0x292251)\n                )\n            }\n\n            function _0x4b49f3(_0xe64465) {\n                var _0x2fa114 = _0x5612de\n                return String[_0x2fa114(0x1e2)](_0xe64465)\n            }\n\n            function _0x26151b(_0x51896f, _0x3a647f, _0x2db6f6) {\n                return _0x4b49f3(_0x51896f) + _0x4b49f3(_0x3a647f) + _0x2db6f6\n            }\n\n            function _0xc38697(_0x5bf566, _0x20667e) {\n                return _0x389396(_0x5bf566, _0x20667e)\n            }\n\n            function _0x538c80(\n                _0x213380,\n                _0x5bb06d,\n                _0x2807a8,\n                _0x2bbe8d,\n                _0x43c759,\n                _0x510d57,\n                _0x5b433d,\n                _0x30b81d,\n                _0x392407,\n                _0x124f15,\n                _0x22fc4c,\n                _0x56f654,\n                _0x8ab411,\n                _0x1c9de4,\n                _0x24f978,\n                _0x27f46c,\n                _0x1bd4f9,\n                _0x572854,\n                _0x34f6a0\n            ) {\n                var _0x2e1799 = _0x5612de,\n                    _0x432584 = new Uint8Array(0x22bb + 0xd * -0x2bd + 0x1 * 0xf1)\n                return (\n                    (_0x432584[-0xc70 + 0x5e9 + 0x22d * 0x3] = _0x213380),\n                    (_0x432584[-0x2 * -0x127c + -0x1 * 0x1f61 + -0x596] = _0x22fc4c),\n                    (_0x432584[-0x1af * 0xb + 0x97b + 0xc1 * 0xc] = _0x5bb06d),\n                    (_0x432584[-0xfc5 * -0x2 + -0x5e5 + -0x19a2] = _0x56f654),\n                    (_0x432584[-0x35 * 0xa3 + -0x10c9 * -0x2 + 0x1 * 0x31] = _0x2807a8),\n                    (_0x432584[0x1d1d + 0x124a + -0x1 * 0x2f62] = _0x8ab411),\n                    (_0x432584[-0x1 * -0xb49 + -0x5d1 + -0x572] = _0x2bbe8d),\n                    (_0x432584[-0x18e * -0xe + 0xff * 0x22 + -0x379b] = _0x1c9de4),\n                    (_0x432584[-0x697 * 0x2 + 0xcc8 + 0x5 * 0x16] = _0x43c759),\n                    (_0x432584[0x2 * 0x8bf + 0xcc4 + -0x1e39] = _0x24f978),\n                    (_0x432584[0x63 * -0x43 + -0x242 + 0x3 * 0x967] = _0x510d57),\n                    (_0x432584[0x1aa9 + 0xe38 + 0x1 * -0x28d6] = _0x27f46c),\n                    (_0x432584[-0xdee + -0x1 * 0x105b + 0x1e55 * 0x1] = _0x5b433d),\n                    (_0x432584[0x1 * -0x1543 + -0x1 * 0x1b5b + 0x1 * 0x30ab] = _0x1bd4f9),\n                    (_0x432584[0xc86 * -0x1 + 0x1c9 + 0xacb] = _0x30b81d),\n                    (_0x432584[0x1581 + -0x70c + -0xe66] = _0x572854),\n                    (_0x432584[0x1dc1 + 0xd * 0xb5 + -0x26e2] = _0x392407),\n                    (_0x432584[-0x36 * 0x4a + 0x268a + -0x16dd] = _0x34f6a0),\n                    (_0x432584[0xf * -0x1ca + -0x16c2 + 0x31aa] = _0x124f15),\n                    String['fromCharCode'][_0x2e1799(0x207)](null, _0x432584)\n                )\n            }\n\n            var _0x3c4305 = !(-0xc6b + 0x270e * 0x1 + -0x1aa2)\n\n            function _0x8edc3d(_0x22218f, _0x1e70b9) {\n                var _0x364732 = _0x5612de\n                return w_0x5c3140(\n                    _0x364732(0x2b2),\n                    {\n                        get 0x0() {\n                            return _0x5dd467\n                        },\n                        get 0x1() {\n                            return _0x3c4305\n                        },\n                        set 0x1(_0x539e8c) {\n                            _0x3c4305 = _0x539e8c\n                        },\n                        get 0x2() {\n                            return _0x462335\n                        },\n                        get 0x3() {\n                            return _0x5863d1\n                        },\n                        get 0x4() {\n                            return _0x26d461\n                        },\n                        get 0x5() {\n                            return _0xe06992\n                        },\n                        get 0x6() {\n                            return _0x6caf\n                        },\n                        get 0x7() {\n                            return _0x42e709\n                        },\n                        0x8: String,\n                        get 0x9() {\n                            return navigator\n                        },\n                        get 0xa() {\n                            return _0x3c875d\n                        },\n                        get 0xb() {\n                            return _0x21db29\n                        },\n                        get 0xc() {\n                            return _0xc38697\n                        },\n                        0xd: Date,\n                        get 0xe() {\n                            return _0x18b4be\n                        },\n                        get 0xf() {\n                            return _0x538c80\n                        },\n                        get 0x10() {\n                            return _0x4b49f3\n                        },\n                        get 0x11() {\n                            return _0x26151b\n                        },\n                        get 0x12() {\n                            return _0x389396\n                        },\n                        0x13: arguments,\n                        0x14: _0x22218f,\n                        0x15: _0x1e70b9,\n                        0x16: RegExp\n                    },\n                    this\n                )\n            }\n\n            function _0x556182(_0x5e8c32) {\n                var _0x4a1328 = _0x5612de\n                _0x4a2daf(_0x4a1328(0x28a), _0x5e8c32)\n            }\n\n            function _0x5141ac() {\n                var _0x2770a6 = _0x3d13cf('xmst')\n                return _0x2770a6 || ''\n            }\n\n            function _0x50686a(_0x193aca) {\n                var _0x460363 = _0x5612de\n                return _0x460363(0x331) === Object[_0x460363(0x344)][_0x460363(0x3ae)][_0x460363(0x334)](_0x193aca)\n            }\n\n            function _0x2195cd(_0x383b5f, _0x4a7858) {\n                var _0x20b490 = _0x5612de\n                if (_0x383b5f) {\n                    var _0x11f5aa = _0x383b5f[_0x4a7858]\n                    if (_0x11f5aa) {\n                        var _0x4fcde1 = _0x1db123(_0x11f5aa)\n                        return _0x20b490(0x17d) === _0x4fcde1 || _0x20b490(0x1ee) === _0x4fcde1\n                            ? -0x1 * -0x4e8 + 0x18eb + -0x1dd2\n                            : 'string' === _0x4fcde1\n                                ? _0x4fcde1[_0x20b490(0x259)] > -0x124c + 0x20c3 + -0xe77\n                                    ? 0x35 * 0x34 + 0x1ec8 + -0x298b\n                                    : -0x8a * 0x31 + -0x18c7 + -0x1111 * -0x3\n                                : _0x50686a(_0x11f5aa)\n                                    ? -0x1 * -0xc83 + -0x3 * 0x466 + 0x4 * 0x2c\n                                    : 0x1018 + -0x371 * -0x9 + 0x1 * -0x2f0f\n                    }\n                }\n                return -0x155a + 0x4c * -0x6c + 0x4 * 0xd5b\n            }\n\n            function _0xdc4d4c(_0x3c0aaa) {\n                var _0x11952c = _0x5612de\n                try {\n                    var _0x57243b = Object[_0x11952c(0x344)][_0x11952c(0x3ae)][_0x11952c(0x334)](_0x3c0aaa)\n                    return _0x11952c(0x30e) === _0x57243b\n                        ? !(-0x1 * 0x7c5 + 0x1 * -0x853 + 0x338 * 0x5) === _0x3c0aaa\n                            ? -0xa1 * -0x23 + 0x2 * 0xaa9 + -0x2b54\n                            : -0x1e71 * 0x1 + 0x1 * 0x1885 + 0x5ee\n                        : _0x11952c(0x1af) === _0x57243b\n                            ? -0xce * 0x25 + 0x1e1a + 0x3 * -0x1b\n                            : '[object\\x20Undefined]' === _0x57243b\n                                ? -0x1 * 0x159a + -0x684 + 0x1c22\n                                : _0x11952c(0x1ce) === _0x57243b\n                                    ? -0x3a * -0x70 + 0x4b1 + 0xa04 * -0x3\n                                    : '[object\\x20String]' === _0x57243b\n                                        ? '' === _0x3c0aaa\n                                            ? 0x12 * 0xad + 0x3b * 0x71 + -0x262e\n                                            : 0x3 * 0xf8 + 0x22ec + -0x25cc\n                                        : _0x11952c(0x331) === _0x57243b\n                                            ? -0x1 * -0x874 + -0x1 * 0x2197 + 0x1923 === _0x3c0aaa['length']\n                                                ? -0xf6f + -0x1ee3 + 0x2e5b\n                                                : -0x10c3 + -0x466 * -0x4 + 0x7 * -0x1d\n                                            : _0x11952c(0x37b) === _0x57243b\n                                                ? 0x1 * 0x22e6 + 0x1 * 0x2669 + 0x824 * -0x9\n                                                : _0x11952c(0x1fe) === _0x57243b\n                                                    ? 0x2392 + -0x15db + -0xdab\n                                                    : _0x11952c(0x17d) === _0x1db123(_0x3c0aaa)\n                                                        ? -0x3 * 0xd7 + -0x17b0 + 0x1a98\n                                                        : -(-0x8e4 + 0x2 * 0xd1b + -0x1151)\n                } catch (_0x320465) {\n                    return -(-0x62e * 0x1 + 0x3 * -0x3ec + 0x11f4)\n                }\n            }\n\n            var _0x2d8bb4 = {}\n\n            function _0x241339() {\n                var _0x5d55e6 = _0x5612de\n                return document[_0x5d55e6(0x373)] ? 'IE' : -0xc04 + -0xbe8 + 0x17ec\n            }\n\n            function _0x5011f8() {\n                var _0x52b3d6 = _0x5612de\n                return eval['toString']()[_0x52b3d6(0x259)]\n            }\n\n            function _0x58210c(_0x4d43be, _0x3faa08, _0x3d51f5) {\n                var _0x16b761 = _0x5612de\n                for (var _0x4738ee = {}, _0x793fa7 = 0x111 + -0x209 * 0x1 + 0x1f * 0x8; _0x793fa7 < _0x3faa08[_0x16b761(0x259)]; _0x793fa7++) {\n                    var _0x15231e = void (-0xf02 * -0x1 + 0xe35 + -0x1d37),\n                        _0x2d01fa = void (-0x782 + 0x5 * -0x143 + 0xdd1),\n                        _0x17bcc5 = _0x3faa08[_0x793fa7]\n                    try {\n                        _0x4d43be && (_0x15231e = _0x4d43be[_0x17bcc5])\n                    } catch (_0x1de94f) { }\n                    if ('string' === _0x3d51f5) _0x2d01fa = '' + _0x15231e\n                    else {\n                        if (_0x16b761(0x28b) === _0x3d51f5) _0x2d01fa = _0x15231e ? Math[_0x16b761(0x1cf)](_0x15231e) : -(-0x19f0 + 0x1ada + 0xe9 * -0x1)\n                        else {\n                            if (_0x16b761(0x1ab) !== _0x3d51f5) throw Error(_0x16b761(0x256))\n                            _0x2d01fa = _0xdc4d4c(_0x15231e)\n                        }\n                    }\n                    _0x4738ee[_0x17bcc5] = _0x2d01fa\n                }\n                return _0x4738ee\n            }\n\n            function _0x3a2b92() {\n                var _0x53dacb = _0x5612de,\n                    _0x1c216f\n                Object[_0x53dacb(0x2a0)](\n                    _0x2d8bb4[_0x53dacb(0x270)],\n                    _0x58210c(\n                        navigator,\n                        [\n                            _0x53dacb(0x36b),\n                            _0x53dacb(0x350),\n                            _0x53dacb(0x184),\n                            'appVersion',\n                            _0x53dacb(0x32d),\n                            'doNotTrack',\n                            _0x53dacb(0x39a),\n                            _0x53dacb(0x38c),\n                            _0x53dacb(0x17a),\n                            _0x53dacb(0x246),\n                            'productSub',\n                            'cpuClass',\n                            _0x53dacb(0x212),\n                            _0x53dacb(0x1d5),\n                            _0x53dacb(0x1de),\n                            _0x53dacb(0x210),\n                            _0x53dacb(0x314),\n                            _0x53dacb(0x1c9),\n                            'webdriver'\n                        ],\n                        'string'\n                    )\n                ),\n                    Object['assign'](\n                        _0x2d8bb4[_0x53dacb(0x270)],\n                        _0x58210c(\n                            navigator,\n                            [_0x53dacb(0x1e1), 'vibrate', _0x53dacb(0x2e2), _0x53dacb(0x292), _0x53dacb(0x390), _0x53dacb(0x38f)],\n                            _0x53dacb(0x1ab)\n                        )\n                    ),\n                    Object[_0x53dacb(0x2a0)](_0x2d8bb4[_0x53dacb(0x270)], _0x58210c(navigator, [_0x53dacb(0x360), _0x53dacb(0x33b)], _0x53dacb(0x28b))),\n                    (_0x2d8bb4['navigator'][_0x53dacb(0x398)] = '' + navigator[_0x53dacb(0x398)])\n                try {\n                    document[_0x53dacb(0x188)](_0x53dacb(0x240)), (_0x1c216f = -0xa2 * -0x5 + 0x26 * -0xe8 + -0x11 * -0x1d7)\n                } catch (_0x264380) {\n                    _0x1c216f = 0xbc0 + -0x26b + -0xd9 * 0xb\n                }\n                _0x2d8bb4['navigator'][_0x53dacb(0x34b)] = _0x1c216f\n                var _0x5ac61e = _0x53dacb(0x1ea) in window ? 0x2424 + 0x1 * 0xa5c + -0x2e7f : -0x86b * 0x1 + -0x195 + 0xa02\n                _0x2d8bb4[_0x53dacb(0x270)][_0x53dacb(0x1d6)] = _0x5ac61e\n            }\n\n            function _0x5abc93() {\n                var _0x279235 = _0x5612de\n                Object['assign'](\n                    _0x2d8bb4['window'],\n                    _0x58210c(\n                        window,\n                        [\n                            'Image',\n                            _0x279235(0x309),\n                            _0x279235(0x29f),\n                            _0x279235(0x399),\n                            _0x279235(0x33a),\n                            'external',\n                            'mozRTCPeerConnection',\n                            'postMessage',\n                            _0x279235(0x284),\n                            _0x279235(0x2de),\n                            _0x279235(0x2ff),\n                            _0x279235(0x1dc),\n                            _0x279235(0x3be),\n                            _0x279235(0x2e9)\n                        ],\n                        _0x279235(0x1ab)\n                    )\n                ),\n                    Object[_0x279235(0x2a0)](_0x2d8bb4[_0x279235(0x393)], _0x58210c(window, [_0x279235(0x3c0)], _0x279235(0x28b))),\n                    (_0x2d8bb4[_0x279235(0x393)][_0x279235(0x3c2)] = window[_0x279235(0x3c2)][_0x279235(0x290)])\n            }\n\n            function _0x5d3845() {\n                var _0x4ceb6d = _0x5612de\n                try {\n                    var _0x55434c = document,\n                        _0x2f0012 = window[_0x4ceb6d(0x328)],\n                        _0x5ac16c = window[_0x4ceb6d(0x306)] >>> (0x1d2c + -0x21 * 0xa7 + -0x1 * 0x7a5),\n                        _0x44cace = window[_0x4ceb6d(0x222)] >>> (-0xcd0 + -0x1f70 + 0x162 * 0x20),\n                        _0x5953b9 = window[_0x4ceb6d(0x1aa)] >>> (0x5 * 0x2e3 + -0x1 * -0x1f7 + -0x1 * 0x1066),\n                        _0x1dfce9 = window[_0x4ceb6d(0x26d)] >>> (0x1545 + -0x8d7 + -0xc6e),\n                        _0x29911c = Math[_0x4ceb6d(0x1cf)](window['screenX']),\n                        _0x340972 = Math['floor'](window[_0x4ceb6d(0x366)]),\n                        _0x4bc0b8 = window[_0x4ceb6d(0x258)] >>> (-0x1 * -0x1548 + -0x21 * -0x7 + -0x162f),\n                        _0x39df7d = window[_0x4ceb6d(0x282)] >>> (0x1dc7 * 0x1 + -0x2113 + 0x34c),\n                        _0x13b30d = _0x2f0012['availWidth'] >>> (0xc84 + 0x1 * -0x644 + -0x640),\n                        _0x3f047e = _0x2f0012[_0x4ceb6d(0x276)] >>> (-0x23c + 0xc * 0x1c4 + -0x12f4 * 0x1),\n                        _0x3e7595 = _0x2f0012['width'] >>> (0x61 * 0x4 + -0x2469 + 0x22e5 * 0x1),\n                        _0xa6e264 = _0x2f0012[_0x4ceb6d(0x245)] >>> (0x882 + 0x2646 + -0x5d9 * 0x8)\n                    return {\n                        innerWidth: void (-0xa40 + 0x192e + -0x31 * 0x4e) !== _0x5ac16c ? _0x5ac16c : -(0x135c + -0xd * -0x115 + -0x45 * 0x7c),\n                        innerHeight: void (-0x2176 + -0x281 * -0xc + 0x17 * 0x26) !== _0x44cace ? _0x44cace : -(-0x17a1 + 0xe8 * 0x8 + 0x576 * 0x3),\n                        outerWidth: void (-0x167c + -0x6f * 0x49 + 0x3623) !== _0x5953b9 ? _0x5953b9 : -(0x3 * -0x795 + 0x4 * -0x53b + 0x2bac),\n                        outerHeight: void (-0x26 * -0x5f + -0xf71 + -0x1 * -0x157) !== _0x1dfce9 ? _0x1dfce9 : -(0xebd + -0x18cd + 0x3 * 0x35b),\n                        screenX: void (-0xf9 * -0x22 + 0xd3 * -0x2c + 0x332) !== _0x29911c ? _0x29911c : -(-0x188 + -0x24e3 + 0x266c),\n                        screenY: void (-0x5 * -0x105 + 0x2 * 0x11fe + -0x2915) !== _0x340972 ? _0x340972 : -(-0x3cc * -0x6 + 0x1561 * 0x1 + -0x2c28),\n                        pageXOffset: void (0xb15 + -0x64d * 0x5 + -0x2 * -0xa36) !== _0x4bc0b8 ? _0x4bc0b8 : -(0x647 + -0x1 * -0x1ced + -0x2333),\n                        pageYOffset: void (-0x1337 * 0x1 + -0x10c1 + -0x1 * -0x23f8) !== _0x39df7d ? _0x39df7d : -(0x3b * 0x5b + -0x7 * 0x3a6 + 0x492),\n                        availWidth: void (-0xd * 0x267 + 0x1a67 + -0x2 * -0x26a) !== _0x13b30d ? _0x13b30d : -(0xe48 + -0x7d * -0x23 + -0x1f5e),\n                        availHeight: void (-0x192a + 0x5 * -0x5b3 + 0xf1 * 0x39) !== _0x3f047e ? _0x3f047e : -(0x4 * 0x5b + -0x3 * -0x13 + -0x1a4),\n                        sizeWidth: void (-0x1a38 * 0x1 + -0x20cb + 0x1 * 0x3b03) !== _0x3e7595 ? _0x3e7595 : -(-0x663 + -0x2659 + 0x2cbd * 0x1),\n                        sizeHeight: void (0x857 * 0x3 + -0x65 * -0xa + -0x1cf7) !== _0xa6e264 ? _0xa6e264 : -(0xafa + 0x305 * 0x5 + -0x1a12),\n                        clientWidth: _0x55434c['body']\n                            ? _0x55434c[_0x4ceb6d(0x189)][_0x4ceb6d(0x1a2)] >>> (-0xe38 + 0x1839 + -0xa01)\n                            : -(0x1338 + 0x21c1 + 0x69f * -0x8),\n                        clientHeight: _0x55434c[_0x4ceb6d(0x189)]\n                            ? _0x55434c[_0x4ceb6d(0x189)][_0x4ceb6d(0x3bb)] >>> (-0x1 * 0x156 + 0x31 * 0x43 + -0xb7d)\n                            : -(0x1202 + -0x32b + -0xed6),\n                        colorDepth: _0x2f0012[_0x4ceb6d(0x17e)] >>> (-0x1d * -0xcb + 0x197 * 0x11 + 0x26 * -0x151),\n                        pixelDepth: _0x2f0012[_0x4ceb6d(0x30a)] >>> (-0x254c + 0x469 + 0x20e3 * 0x1)\n                    }\n                } catch (_0x35aa5a) {\n                    return {}\n                }\n            }\n\n            function _0x573065() {\n                var _0x109cfa = _0x5612de\n                Object[_0x109cfa(0x2a0)](\n                    _0x2d8bb4[_0x109cfa(0x208)],\n                    _0x58210c(document, [_0x109cfa(0x335), _0x109cfa(0x253), 'documentMode'], _0x109cfa(0x33c))\n                ),\n                    Object['assign'](_0x2d8bb4[_0x109cfa(0x208)], _0x58210c(document, [_0x109cfa(0x325), _0x109cfa(0x183), 'images'], _0x109cfa(0x1ab)))\n            }\n\n            function _0x47f354() {\n                var _0xad51a5 = _0x5612de,\n                    _0x5ad193 = {}\n                try {\n                    var _0x344158 = document[_0xad51a5(0x260)](_0xad51a5(0x24d))[_0xad51a5(0x2f9)](_0xad51a5(0x26b)),\n                        _0x45ab53 = _0x344158[_0xad51a5(0x1d7)](_0xad51a5(0x375)),\n                        _0x3724de = _0x344158['getParameter'](_0x45ab53['UNMASKED_VENDOR_WEBGL']),\n                        _0x41fa79 = _0x344158[_0xad51a5(0x383)](_0x45ab53[_0xad51a5(0x39e)])\n                        ; (_0x5ad193['vendor'] = _0x3724de), (_0x5ad193[_0xad51a5(0x2c2)] = _0x41fa79)\n                } catch (_0x22684e) { }\n                return _0x5ad193\n            }\n\n            function _0x58bcf8() {\n                var _0x3fa932 = _0x5612de,\n                    _0xf9ae75 = _0x11a1d6()\n                if (_0xf9ae75) {\n                    var _0x3c4406 = {\n                        antialias: _0xf9ae75[_0x3fa932(0x1c5)]()[_0x3fa932(0x1a5)]\n                            ? -0x1d2e + -0x4b1 + 0x21e0\n                            : -0x1 * -0x87c + 0x4b * 0x49 + -0x5 * 0x5f9,\n                        blueBits: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x27e)]),\n                        depthBits: _0xf9ae75['getParameter'](_0xf9ae75[_0x3fa932(0x252)]),\n                        greenBits: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75['GREEN_BITS']),\n                        maxAnisotropy: _0x39c3d8(_0xf9ae75),\n                        maxCombinedTextureImageUnits: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75['MAX_COMBINED_TEXTURE_IMAGE_UNITS']),\n                        maxCubeMapTextureSize: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x300)]),\n                        maxFragmentUniformVectors: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x286)]),\n                        maxRenderbufferSize: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x2da)]),\n                        maxTextureImageUnits: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75['MAX_TEXTURE_IMAGE_UNITS']),\n                        maxTextureSize: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x203)]),\n                        maxVaryingVectors: _0xf9ae75['getParameter'](_0xf9ae75[_0x3fa932(0x264)]),\n                        maxVertexAttribs: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75['MAX_VERTEX_ATTRIBS']),\n                        maxVertexTextureImageUnits: _0xf9ae75['getParameter'](_0xf9ae75[_0x3fa932(0x205)]),\n                        maxVertexUniformVectors: _0xf9ae75['getParameter'](_0xf9ae75[_0x3fa932(0x19d)]),\n                        shadingLanguageVersion: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x179)]),\n                        stencilBits: _0xf9ae75['getParameter'](_0xf9ae75[_0x3fa932(0x2bb)]),\n                        version: _0xf9ae75[_0x3fa932(0x383)](_0xf9ae75[_0x3fa932(0x201)])\n                    }\n                    Object['assign'](_0x2d8bb4['webgl'], _0x3c4406)\n                }\n                Object[_0x3fa932(0x2a0)](_0x2d8bb4[_0x3fa932(0x26b)], _0x47f354())\n            }\n\n            function _0x75957() {\n                var _0x122393 = _0x5612de\n                if (window[_0x122393(0x29f)]) {\n                    for (var _0x2963d5 = -0x81a + -0xad * -0x1 + 0x76f; _0x2963d5 < -0x1629 + 0x1 * 0x31c + 0x1317; _0x2963d5++)\n                        try {\n                            return !!new window[_0x122393(0x29f)](_0x122393(0x3b4) + _0x2963d5) && _0x2963d5[_0x122393(0x3ae)]()\n                        } catch (_0x2c5722) { }\n                    try {\n                        return !!new window[_0x122393(0x29f)]('PDF.PdfCtrl.1') && '4'\n                    } catch (_0x1be01e) { }\n                    try {\n                        return !!new window[_0x122393(0x29f)](_0x122393(0x345)) && '7'\n                    } catch (_0x19cffa) { }\n                }\n                return '0'\n            }\n\n            function _0x1555d9() {\n                return {\n                    plugin: _0x30412e(),\n                    pv: _0x75957()\n                }\n            }\n\n            function _0x1f01ce(_0x371dd1) {\n                var _0x5c76bb = _0x5612de\n                try {\n                    var _0xf71d16 = window[_0x371dd1],\n                        _0x28a4d1 = _0x5c76bb(0x1f9)\n                    return _0xf71d16[_0x5c76bb(0x1c4)](_0x28a4d1, _0x28a4d1), _0xf71d16[_0x5c76bb(0x2c3)](_0x28a4d1), !(0x1e7a + -0x1824 + 0x2 * -0x32b)\n                } catch (_0x1dd803) {\n                    return !(0x6e5 + 0x599 * -0x2 + -0x1 * -0x44e)\n                }\n            }\n\n            function _0x3ffe15() {\n                return w_0x5c3140(\n                    '484e4f4a403f5243003c20117d3adeac000000004e770f390000003a030014000102110100070000430147000b11000103012f170001354902110100070001430147000e110001030103012b2f17000135491100014200020c45464a48457a5d465b484e4c0e5a4c5a5a4046477a5d465b484e4c',\n                    {\n                        get 0x0() {\n                            return _0x1f01ce\n                        },\n                        0x1: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x252788(_0x468bb4, _0x392758, _0x269720) {\n                var _0x16947c = _0x5612de\n                for (\n                    var _0x4dea11 = 0x1 * 0x1705 + 0x29 * -0xbf + 0x72 * 0x11, _0x1f88e5 = 0x65 * -0x7 + 0xb50 + -0x88d;\n                    _0x1f88e5 < _0x392758['length'];\n                    _0x1f88e5++\n                ) {\n                    var _0x1dd5f9 = _0x2195cd(_0x468bb4, _0x392758[_0x1f88e5])\n                    if (_0x1dd5f9 && ((_0x4dea11 |= _0x1dd5f9 << (_0x269720 + _0x1f88e5)), _0x269720 + _0x1f88e5 >= 0xd5a + 0x7c + -0x1 * 0xdb6)) {\n                        console[_0x16947c(0x310)]('abort\\x2032')\n                        break\n                    }\n                }\n                return _0x4dea11\n            }\n\n            function _0x484054() {\n                return w_0x5c3140(\n                    '484e4f4a403f5243002c3b0a6f4f88290000000044c410000000011f1101001400010700000700010700020700030700040700050700060700070700080700090c000a14000207000a14000307000b14000407000a110101110004163e000414000a413d00d11100014a07000c1307000d43010300131400050c0000140006030014000711000711000207000e13274700691100014a07000f130700104301140008110002110007131400091100084a0700111307001207001311000918430249110004070014181100091807001518110008070016161100054a070017131100084301491100064a07001813110008430149170007214945ff891101011100041317000335490300170007354911000711000207000e132747001a1100054a0700191311000611000713430149170007214945ffd84111000342001a037e617e037e617d037e617c037e617b037e617a037e6179037e6178037e6177037e6176037d617f0014262b20213b242120382138272e3b263c3b27263c14282a3b0a232a222a213b3c0d361b2e28012e222a04272a2e2b06232a21283b270d2c3d2a2e3b2a0a232a222a213b063c2c3d263f3b0c3c2a3b0e3b3b3d262d3a3b2a08232e21283a2e282a0a052e392e1c2c3d263f3b02726d016d043b2a373b0b2e3f3f2a212b0c2726232b043f3a3c270b3d2a2220392a0c2726232b',\n                    {\n                        get 0x0() {\n                            return document\n                        },\n                        get 0x1() {\n                            return window\n                        },\n                        0x2: arguments\n                    },\n                    this\n                )\n            }\n\n            ; (_0x2d8bb4[_0x5612de(0x270)] = {}),\n                (_0x2d8bb4[_0x5612de(0x23e)] = {}),\n                (_0x2d8bb4[_0x5612de(0x393)] = {}),\n                (_0x2d8bb4[_0x5612de(0x26b)] = {}),\n                (_0x2d8bb4['document'] = {}),\n                (_0x2d8bb4[_0x5612de(0x328)] = {}),\n                (_0x2d8bb4[_0x5612de(0x1ba)] = {}),\n                (_0x2d8bb4['custom'] = {})\n            var _0x548676 = null\n\n            function _0x491716() {\n                var _0x4f58c9 = _0x5612de\n                return w_0x5c3140(\n                    _0x4f58c9(0x174),\n                    {\n                        get 0x0() {\n                            return self\n                        },\n                        get 0x1() {\n                            return window\n                        },\n                        get 0x2() {\n                            return parent\n                        },\n                        0x3: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x2d2578() {\n                !(function () {\n                    var _0x236733 = w_0x25f3,\n                        _0x460c07 = {},\n                        _0x3606e1 = navigator[_0x236733(0x359)] || navigator[_0x236733(0x2f0)]\n                    if (_0x3606e1) {\n                        try {\n                            ; (_0x460c07[_0x236733(0x3ac)] = _0x3606e1[_0x236733(0x3ac)] ? 0x147a + -0x5 * 0x60f + 0x9d2 : -0x169c + 0x26d6 + -0x1038),\n                                (_0x460c07[_0x236733(0x213)] = Math[_0x236733(0x369)]((0x31 * 0x75 + 0x14c7 + -0x2ac8) * _0x3606e1[_0x236733(0x213)])),\n                                (_0x460c07[_0x236733(0x2b0)] = '' + _0x3606e1[_0x236733(0x2b0)]),\n                                (_0x460c07[_0x236733(0x191)] = '' + _0x3606e1['dischargingTime'])\n                        } catch (_0x2c301c) { }\n                        ; (_0x2d8bb4[_0x236733(0x359)] = {}), Object[_0x236733(0x2a0)](_0x2d8bb4[_0x236733(0x359)], _0x460c07)\n                    } else {\n                        if (_0x236733(0x384) != typeof navigator && navigator[_0x236733(0x1b2)])\n                            try {\n                                navigator[_0x236733(0x1b2)]()[_0x236733(0x1ed)](function (_0x369fc5) {\n                                    var _0x34e3e9 = _0x236733\n                                    try {\n                                        ; (_0x460c07[_0x34e3e9(0x3ac)] = _0x369fc5[_0x34e3e9(0x3ac)]\n                                            ? 0x20aa + -0x11 * -0x86 + 0x1 * -0x298f\n                                            : 0xd51 + 0x152c + 0xd * -0x2a7),\n                                            (_0x460c07[_0x34e3e9(0x213)] = Math[_0x34e3e9(0x369)](\n                                                (0x1205 + -0x41 * 0x32 + -0x3 * 0x1a5) * _0x369fc5[_0x34e3e9(0x213)]\n                                            )),\n                                            (_0x460c07[_0x34e3e9(0x2b0)] = '' + _0x369fc5[_0x34e3e9(0x2b0)]),\n                                            (_0x460c07[_0x34e3e9(0x191)] = '' + _0x369fc5['dischargingTime'])\n                                    } catch (_0x2f63d1) { }\n                                    ; (_0x2d8bb4['battery'] = {}), Object[_0x34e3e9(0x2a0)](_0x2d8bb4[_0x34e3e9(0x359)], _0x460c07)\n                                })\n                            } catch (_0xfc012d) { }\n                    }\n                })(),\n                    'undefined' != typeof Promise &&\n                    (_0x548676 = new Promise(function (_0x1df02e) {\n                        try {\n                            _0x5bbaf0()['then'](function (_0x27ab47) {\n                                var _0xbee19f = w_0x25f3\n                                Object[_0xbee19f(0x2a0)](_0x2d8bb4['wID'], {\n                                    rtcIP: _0x27ab47\n                                })\n                            })\n                        } catch (_0x7bc12a) { }\n                        _0x1df02e('')\n                    }))\n            }\n\n            function _0x5c328e() {\n                var _0x378ae2 = _0x5612de\n                return w_0x5c3140(\n                    _0x378ae2(0x1ad),\n                    {\n                        get 0x0() {\n                            return window\n                        },\n                        get 0x1() {\n                            return navigator\n                        },\n                        get 0x2() {\n                            var _0xa78dc5 = _0x378ae2\n                            return _0xa78dc5(0x384) != typeof InstallTrigger ? InstallTrigger : void (0x26ae * 0x1 + -0xad * 0x2e + -0x6c * 0x12)\n                        },\n                        0x3: Object,\n                        get 0x4() {\n                            return _0x241339\n                        },\n                        get 0x5() {\n                            return _0x2d8bb4\n                        },\n                        get 0x6() {\n                            return document\n                        },\n                        0x7: Promise,\n                        0x8: Date,\n                        get 0x9() {\n                            return _0x252788\n                        },\n                        get 0xa() {\n                            return _0x5011f8\n                        },\n                        get 0xb() {\n                            return _0x4f323e\n                        },\n                        get 0xc() {\n                            return _0x5090f5\n                        },\n                        0xd: Math,\n                        get 0xe() {\n                            return _0x3ffe15\n                        },\n                        get 0xf() {\n                            return _0x18b4be\n                        },\n                        get 0x10() {\n                            return _0x484054\n                        },\n                        get 0x11() {\n                            return _0x491716\n                        },\n                        get 0x12() {\n                            return _0x462335\n                        },\n                        get 0x13() {\n                            return _0x24dc34\n                        },\n                        get 0x14() {\n                            return _0x6caf\n                        },\n                        get 0x15() {\n                            return _0x2d2578\n                        },\n                        get 0x16() {\n                            return _0x3a2b92\n                        },\n                        get 0x17() {\n                            return _0x5abc93\n                        },\n                        get 0x18() {\n                            return _0x573065\n                        },\n                        get 0x19() {\n                            return _0x58bcf8\n                        },\n                        get 0x1a() {\n                            return _0x1555d9\n                        },\n                        get 0x1b() {\n                            return _0x5d3845\n                        },\n                        0x1c: parseInt,\n                        get 0x1d() {\n                            return _0x3d13cf\n                        },\n                        get 0x1e() {\n                            return _0x4a2daf\n                        },\n                        get 0x1f() {\n                            return _0x641e3d\n                        },\n                        0x20: JSON,\n                        get 0x21() {\n                            return _0x48a082\n                        },\n                        get 0x22() {\n                            return _0x4df596\n                        },\n                        get 0x23() {\n                            return _0x5dde58\n                        },\n                        get 0x24() {\n                            return _0x548676\n                        },\n                        get 0x25() {\n                            return _0x29a5ac\n                        },\n                        0x26: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x25a792(_0x2f25f2) {\n                var _0x329005 = _0x5612de\n                return _0x462335[_0x329005(0x185)] &&\n                    _0x462335[_0x329005(0x185)][_0x329005(0x2dc)] &&\n                    -(-0x4f2 * 0x5 + 0x254f + -0xc94) !== _0x2f25f2[_0x329005(0x2c5)](_0x462335[_0x329005(0x185)][_0x329005(0x2dc)])\n                    ? _0x39693d['sec']\n                    : _0x39693d[_0x329005(0x1b4)]\n            }\n\n            function _0xd287a1(_0x35260d) {\n                var _0x241816 = _0x5612de,\n                    _0x40ac17 = _0x462335[_0x241816(0x185)][_0x241816(0x2dc)]\n                return !(!_0x40ac17 || !_0x35260d || -(0x116 * -0x2 + -0x1af8 * -0x1 + -0x18cb) === _0x35260d[_0x241816(0x2c5)](_0x40ac17))\n            }\n\n            function _0x2b13af(_0x52c947) {\n                var _0x221375 = _0x5612de,\n                    _0x7eff84 = _0x52c947\n                decodeURIComponent(_0x52c947) === _0x52c947 && (_0x7eff84 = encodeURI(_0x52c947))\n                var _0x5e1d88 = _0x7eff84[_0x221375(0x2c5)]('?')\n                if (_0x5e1d88 > 0x1673 * 0x1 + 0x2150 + -0x37c3) {\n                    var _0xc7170 = _0x7eff84[_0x221375(0x3a7)](-0x80c + 0x71e * 0x2 + -0x630, _0x5e1d88 + (0x2 * 0x919 + 0x4 * -0x931 + 0x1293)),\n                        _0x8fbad9 = _0x7eff84[_0x221375(0x3a7)](_0x5e1d88 + (-0x1de4 + -0x2 * -0x1163 + 0x4e1 * -0x1))\n                    _0x7eff84 = _0xc7170 + _0x8fbad9[_0x221375(0x342)]('\\x27')['join'](_0x221375(0x37e))\n                }\n                return _0x7eff84\n            }\n\n            function _0x1958a5(_0x42413b, _0x5e3de6) {\n                var _0x406220 = _0x5612de\n                for (var _0x32045a = '', _0xbe63df = '', _0x5623ae = 0x5f6 + -0x220e + 0x1c18; _0x5623ae < _0x5e3de6[_0x406220(0x259)]; _0x5623ae++)\n                    _0x5623ae % (0x951 + 0xb15 + 0x105 * -0x14) == -0x10de + 0x15 * 0x185 + 0x1 * -0xf0b\n                        ? (_0xbe63df = _0x5e3de6[_0x5623ae])\n                        : (_0x32045a += '&' + _0xbe63df + '=' + _0x5e3de6[_0x5623ae])\n                var _0x4ddc33 = _0x42413b\n                if (_0x32045a[_0x406220(0x259)] > -0x135d + 0x8e1 + -0x2c * -0x3d) {\n                    var _0x50fb42 = -(0x2 * -0x1252 + 0x13 * 0x85 + 0x95 * 0x2e) === _0x42413b['indexOf']('?') ? '?' : '&'\n                    _0x4ddc33 = _0x42413b + _0x50fb42 + _0x32045a[_0x406220(0x3a7)](0x324 + -0xf1 * -0x17 + 0x1 * -0x18ca)\n                }\n                return _0x4ddc33\n            }\n\n            function _0x288415(_0x5a419e) {\n                var _0x259f53 = _0x5612de,\n                    _0x4465ef = _0x5a419e['indexOf']('?')\n                return -(-0x78c + -0x1a4c + -0x6c5 * -0x5) !== _0x4465ef ? _0x5a419e[_0x259f53(0x3a7)](_0x4465ef + (0x907 + 0x137b * 0x1 + -0x1c81)) : ''\n            }\n\n            function _0x6a7375(_0x2a9a57) {\n                var _0x447596 = _0x5612de\n                for (var _0x1ca622 = -0x16a3 * -0x1 + 0x87b + -0x1f1e; _0x1ca622 < _0x462335['_enablePathListRegex']['length']; _0x1ca622++)\n                    if (_0x462335[_0x447596(0x1a9)][_0x1ca622]['test'](_0x2a9a57)) return !(-0x5ed + -0x3d * -0x41 + -0x990)\n                return !(-0x1 * -0x26ff + -0x11c1 * 0x1 + -0x153d)\n            }\n\n            function _0x7d8404(_0x34967f) {\n                var _0x5e578e = _0x5612de\n                return _0x5e578e(0x186) === _0x34967f || 'application/json' === _0x34967f\n            }\n\n            function _0x3af1be() {\n                var _0x1347f7 = _0x5612de\n                return w_0x5c3140(\n                    _0x1347f7(0x368),\n                    {\n                        get 0x0() {\n                            return window\n                        },\n                        get 0x1() {\n                            return _0x6a7375\n                        },\n                        get 0x2() {\n                            return _0x6caf\n                        },\n                        get 0x3() {\n                            return _0x1958a5\n                        },\n                        get 0x4() {\n                            return _0x2b13af\n                        },\n                        get 0x5() {\n                            return _0x288415\n                        },\n                        get 0x6() {\n                            return _0x8edc3d\n                        },\n                        get 0x7() {\n                            return _0x462335\n                        },\n                        get 0x8() {\n                            return _0x45e0e9\n                        },\n                        get 0x9() {\n                            return _0x7d8404\n                        },\n                        get 0xa() {\n                            return _0x1294ff\n                        },\n                        get 0xb() {\n                            return _0x20cbf3\n                        },\n                        get 0xc() {\n                            return _0x45b94b\n                        },\n                        get 0xd() {\n                            return _0x572e48\n                        },\n                        get 0xe() {\n                            return _0xd287a1\n                        },\n                        get 0xf() {\n                            return _0x25a792\n                        },\n                        get 0x10() {\n                            return _0x39693d\n                        },\n                        get 0x11() {\n                            return _0x1f42cb\n                        },\n                        get 0x12() {\n                            return _0x556182\n                        },\n                        get 0x13() {\n                            return setTimeout\n                        },\n                        get 0x14() {\n                            return _0x5c328e\n                        },\n                        0x15: arguments,\n                        0x16: RegExp\n                    },\n                    this\n                )\n            }\n\n            var _0x3c4266 = _0x5612de(0x384) != typeof URL && URL instanceof Object,\n                _0x3311d7 = 'undefined' != typeof Request && Request instanceof Object,\n                _0x4f1fa4 = 'undefined' != typeof Headers && Headers instanceof Object\n\n            function _0x415adb() {\n                var _0x51ab32 = _0x5612de\n                return window[_0x51ab32(0x197)]\n            }\n\n            function _0x1d82ac() {\n                var _0x2340b7 = _0x5612de\n                return w_0x5c3140(\n                    _0x2340b7(0x234),\n                    {\n                        get 0x0() {\n                            return _0x415adb\n                        },\n                        get 0x1() {\n                            return window\n                        },\n                        get 0x2() {\n                            return _0xd287a1\n                        },\n                        get 0x3() {\n                            return _0x25a792\n                        },\n                        get 0x4() {\n                            return _0x39693d\n                        },\n                        get 0x5() {\n                            return _0x6caf\n                        },\n                        get 0x6() {\n                            return _0x1f42cb\n                        },\n                        get 0x7() {\n                            return _0x556182\n                        },\n                        get 0x8() {\n                            return setTimeout\n                        },\n                        get 0x9() {\n                            return _0x5c328e\n                        },\n                        get 0xa() {\n                            return _0x3311d7\n                        },\n                        get 0xb() {\n                            return Request\n                        },\n                        get 0xc() {\n                            return _0x3c4266\n                        },\n                        get 0xd() {\n                            return URL\n                        },\n                        get 0xe() {\n                            return _0x6a7375\n                        },\n                        get 0xf() {\n                            return _0x1958a5\n                        },\n                        get 0x10() {\n                            return _0x2b13af\n                        },\n                        get 0x11() {\n                            return _0x288415\n                        },\n                        get 0x12() {\n                            return _0x8edc3d\n                        },\n                        get 0x13() {\n                            return _0x462335\n                        },\n                        get 0x14() {\n                            return _0x45e0e9\n                        },\n                        get 0x15() {\n                            return _0xb48e77\n                        },\n                        get 0x16() {\n                            return _0x7d8404\n                        },\n                        get 0x17() {\n                            return _0x1294ff\n                        },\n                        get 0x18() {\n                            return _0x20cbf3\n                        },\n                        get 0x19() {\n                            return _0x45b94b\n                        },\n                        get 0x1a() {\n                            return _0x572e48\n                        },\n                        0x1b: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0xb48e77(_0x29caaf, _0xa4ab82) {\n                var _0x1cf8d6 = _0x5612de,\n                    _0x314297 = ''\n                if (_0x3311d7 && _0x29caaf instanceof Request) {\n                    var _0x1f374d = _0x29caaf[_0x1cf8d6(0x35b)][_0x1cf8d6(0x32b)](_0x1cf8d6(0x228))\n                    return _0x1f374d && (_0x314297 = _0x1f374d), _0x314297\n                }\n                if (_0xa4ab82 && _0xa4ab82[_0x1cf8d6(0x35b)]) {\n                    if (_0x4f1fa4 && _0xa4ab82[_0x1cf8d6(0x35b)] instanceof Headers) {\n                        var _0x4dff82 = _0xa4ab82[_0x1cf8d6(0x35b)][_0x1cf8d6(0x32b)](_0x1cf8d6(0x228))\n                        return _0x4dff82 && (_0x314297 = _0x4dff82), _0x314297\n                    }\n                    if (_0xa4ab82['headers'] instanceof Array) {\n                        for (var _0x6ae47c = 0xd20 + 0x699 * -0x5 + -0x13dd * -0x1; _0x6ae47c < _0xa4ab82['headers'][_0x1cf8d6(0x259)]; _0x6ae47c++)\n                            if (_0x1cf8d6(0x228) == _0xa4ab82[_0x1cf8d6(0x35b)][_0x6ae47c][-0x12f6 + -0x207f + 0x1127 * 0x3]['toLowerCase']())\n                                return _0xa4ab82[_0x1cf8d6(0x35b)][_0x6ae47c][-0xaa2 + -0xe0e + 0x18b1]\n                    }\n                    if (_0xa4ab82[_0x1cf8d6(0x35b)] instanceof Object) {\n                        for (\n                            var _0x1506c8 = -0x1ce4 + 0x8dc + 0xa04 * 0x2, _0x32fecb = Object['keys'](_0xa4ab82['headers']);\n                            _0x1506c8 < _0x32fecb[_0x1cf8d6(0x259)];\n                            _0x1506c8++\n                        ) {\n                            var _0x228b3d = _0x32fecb[_0x1506c8]\n                            if ('content-type' === _0x228b3d['toLowerCase']()) return _0xa4ab82[_0x1cf8d6(0x35b)][_0x228b3d]\n                        }\n                        return _0x314297\n                    }\n                }\n            }\n\n            function _0x1294ff(_0x1475ff, _0x5700d1, _0x563b6f) {\n                var _0x383b2a = _0x5612de\n                if (null == _0x563b6f || '' === _0x563b6f) return _0x1475ff\n                if (((_0x563b6f = _0x563b6f[_0x383b2a(0x3ae)]()), _0x383b2a(0x186) === _0x5700d1)) {\n                    _0x1475ff[_0x383b2a(0x336)] = !(0xfc + -0x22d4 + 0x21d8)\n                    var _0x38ceac = _0x563b6f[_0x383b2a(0x342)]('&'),\n                        _0x1b01b6 = {}\n                    if (_0x38ceac) {\n                        for (var _0x4c4745 = -0x29 * -0xd3 + 0x1 * 0xa01 + -0x2bcc; _0x4c4745 < _0x38ceac['length']; _0x4c4745++)\n                            _0x1b01b6[_0x38ceac[_0x4c4745][_0x383b2a(0x342)]('=')[0x2 * -0x391 + -0x1 * -0x99f + -0x27d]] = decodeURIComponent(\n                                _0x38ceac[_0x4c4745][_0x383b2a(0x342)]('=')[0x1e44 + -0x14e3 * -0x1 + -0x3326]\n                            )\n                    }\n                    _0x1475ff[_0x383b2a(0x189)] = _0x1b01b6\n                } else _0x1475ff[_0x383b2a(0x189)] = JSON['parse'](_0x563b6f)\n                return _0x1475ff\n            }\n\n            function _0x45e0e9(_0x2d3284, _0xb8d78) {\n                var _0x521f3f = _0x5612de,\n                    _0x3496a3 = _0xb8d78\n                if (_0x462335[_0x521f3f(0x18d)][_0x521f3f(0x259)] > 0x1f8f * 0x1 + -0x1 * 0x21dd + 0xa * 0x3b)\n                    for (\n                        var _0x335ec5 = 0xb * -0xd3 + -0x1977 * 0x1 + -0x41 * -0x88;\n                        _0x335ec5 < _0x462335[_0x521f3f(0x18d)][_0x521f3f(0x259)];\n                        _0x335ec5++\n                    ) {\n                        var _0x3f8686 = _0x462335[_0x521f3f(0x18d)][_0x335ec5][-0x2023 + 0xcb * -0x10 + -0x1cb * -0x19]\n                        if (_0x3f8686[_0x521f3f(0x22b)](_0xb8d78)) {\n                            ; (_0x3496a3 = _0xb8d78[_0x521f3f(0x377)](_0x3f8686, _0x462335[_0x521f3f(0x18d)][_0x335ec5][0x1a12 * -0x1 + 0x2361 + -0x94e])),\n                                _0x2d3284 &&\n                                _0x3d40ff[_0x521f3f(0x397)]['call'](\n                                    _0x2d3284,\n                                    _0x521f3f(0x243),\n                                    _0x521f3f(0x223) + _0xb8d78 + '\\x0aREWRITED:\\x20' + _0x3496a3\n                                )\n                            break\n                        }\n                    }\n                return (_0x3496a3 = _0x2b13af(_0x3496a3))\n            }\n\n            function _0x344a4d() {\n                var _0x1b8e41 = _0x5612de\n                return w_0x5c3140(\n                    _0x1b8e41(0x20d),\n                    {\n                        get 0x0() {\n                            return window\n                        },\n                        get 0x1() {\n                            return _0x6a7375\n                        },\n                        get 0x2() {\n                            return _0x6caf\n                        },\n                        get 0x3() {\n                            return _0x1958a5\n                        },\n                        get 0x4() {\n                            return _0x2b13af\n                        },\n                        get 0x5() {\n                            return _0x288415\n                        },\n                        get 0x6() {\n                            return _0x8edc3d\n                        },\n                        0x7: arguments\n                    },\n                    this\n                )\n            }\n\n            function _0x3f720d() {\n                _0x3af1be(), _0x1d82ac(), _0x344a4d()\n            }\n\n            function _0x3bfecb(_0x4b21ed) {\n                var _0x3a0ee2 = _0x5612de\n                    ; (this[_0x3a0ee2(0x341)] = 'ConfigException'), (this[_0x3a0ee2(0x312)] = _0x4b21ed)\n            }\n\n            var _0x589057 = {\n                cn: {\n                    host: _0x5612de(0x2c9)\n                }\n            },\n                _0x2bbf08 = [_0x5612de(0x30c)],\n                _0x3d70a4\n\n            function _0x43f5a3(_0x5a985f) {\n                var _0x20ecf9 = _0x5612de,\n                    _0x3c43cc = ''\n                return {\n                    host: (_0x3c43cc =\n                        _0x5a985f[_0x20ecf9(0x1b6)] || _0x5a985f[_0x20ecf9(0x1ae)]\n                            ? _0x5a985f[_0x20ecf9(0x1b3)]\n                            : _0x589057[_0x5a985f[_0x20ecf9(0x224)]][_0x20ecf9(0x2dc)]),\n                    pathList: _0x2bbf08,\n                    reportUrl: _0x3c43cc + _0x2bbf08[0x1d7 * 0x7 + 0x1073 + -0x1d54]\n                }\n            }\n\n            var _0x383bd7 = !(0x244 * 0xb + -0x16a * -0x4 + -0x1e93),\n                _0xd39ee2,\n                _0x9e520d\n\n            function _0x53ee31(_0x817028) {\n                var _0x5d5e8d = _0x5612de\n                return w_0x5c3140(\n                    _0x5d5e8d(0x34f),\n                    {\n                        0x0: Object,\n                        0x1: Math,\n                        get 0x2() {\n                            return _0x3bfecb\n                        },\n                        get 0x3() {\n                            return _0x6caf\n                        },\n                        get 0x4() {\n                            return _0x462335\n                        },\n                        get 0x5() {\n                            return _0x43f5a3\n                        },\n                        get 0x6() {\n                            return setTimeout\n                        },\n                        get 0x7() {\n                            return _0x5c328e\n                        },\n                        get 0x8() {\n                            return _0x3d70a4\n                        },\n                        set 0x8(_0x5982f0) {\n                            _0x3d70a4 = _0x5982f0\n                        },\n                        get 0x9() {\n                            return clearInterval\n                        },\n                        get 0xa() {\n                            return setInterval\n                        },\n                        get 0xb() {\n                            return _0x450b73\n                        },\n                        get 0xc() {\n                            return _0x1a39c4\n                        },\n                        get 0xd() {\n                            return _0x3f720d\n                        },\n                        get 0xe() {\n                            return _0x59992f\n                        },\n                        get 0xf() {\n                            return _0x39d569\n                        },\n                        get 0x10() {\n                            return _0x1dbe74\n                        },\n                        get 0x11() {\n                            return _0x383bd7\n                        },\n                        set 0x11(_0x488bc8) {\n                            _0x383bd7 = _0x488bc8\n                        },\n                        get 0x12() {\n                            return _0x18707d\n                        },\n                        get 0x13() {\n                            return _0x1c3b6d\n                        },\n                        0x14: arguments,\n                        0x15: _0x817028\n                    },\n                    this\n                )\n            }\n\n            function _0x3498af(_0x3e9bb9) { }\n\n            function _0x59992f(_0x10dd97) {\n                var _0x1beab7 = _0x5612de\n                for (var _0x52c469 = 0xb * -0x262 + -0x606 + 0x101e * 0x2; _0x52c469 < _0x10dd97[_0x1beab7(0x259)]; _0x52c469++)\n                    _0x10dd97[_0x52c469] && _0x462335['_enablePathListRegex']['push'](new RegExp(_0x10dd97[_0x52c469]))\n            }\n\n            function _0x39d569(_0x51ab06) {\n                var _0x59d7a1 = _0x5612de\n                if (void (-0x11c8 * 0x1 + 0x1fa2 * 0x1 + -0xdda) !== _0x51ab06) {\n                    for (var _0x3e2076 = -0x3ab * -0x5 + -0x19d4 + 0x1b * 0x47; _0x3e2076 < _0x51ab06[_0x59d7a1(0x259)]; _0x3e2076++)\n                        _0x462335[_0x59d7a1(0x18d)][_0x59d7a1(0x36e)]([\n                            new RegExp(_0x51ab06[_0x3e2076][-0xfb * -0x1 + 0x9a7 * 0x4 + -0x5 * 0x7eb]),\n                            _0x51ab06[_0x3e2076][-0x57 * 0x55 + 0x1c99 * 0x1 + 0x4b]\n                        ])\n                }\n            }\n\n            function _0x32e4a6() {\n                var _0x494ee9 = _0x5612de\n                return window[_0x494ee9(0x318)] || ''\n            }\n\n            function _0x1be1e1(_0x58db04) {\n                var _0x32bdb2 = _0x5612de,\n                    _0x4558be = _0x6caf[_0x32bdb2(0x323)],\n                    _0x4ab91a = -0x5d * 0x5e + -0xb06 + -0x47 * -0xa3\n                _0x32bdb2(0x2b6) === _0x58db04 && (_0x4ab91a = 0x1754 + 0xd0 * 0x4 + -0x1a93),\n                    _0x32bdb2(0x285) === _0x58db04 && (_0x4ab91a = -0x146 * -0x13 + 0x13 * 0xef + -0x29ed)\n                var _0x1741bb = {\n                    ts: new Date()[_0x32bdb2(0x16d)](),\n                    v: _0x4ab91a\n                }\n                _0x4558be[_0x32bdb2(0x36e)](_0x1741bb)\n            }\n\n            function _0x4de7ef() {\n                var _0x45ce69 = _0x5612de,\n                    _0x5c1967,\n                    _0x586941\n                void (0xbc1 + 0x1 * 0x1309 + -0x1eca) !== document[_0x45ce69(0x285)]\n                    ? (_0x45ce69(0x285), (_0x586941 = _0x45ce69(0x1a0)), (_0x5c1967 = _0x45ce69(0x1f6)))\n                    : void (0x2056 + 0x2306 + -0x435c) !== document[_0x45ce69(0x15f)]\n                        ? (_0x45ce69(0x15f), (_0x586941 = _0x45ce69(0x1c8)), (_0x5c1967 = _0x45ce69(0x33f)))\n                        : void (0x68 * 0x53 + 0x3c7 * 0x3 + -0x2d0d) !== document[_0x45ce69(0x2c6)]\n                            ? (_0x45ce69(0x2c6), (_0x586941 = _0x45ce69(0x2cc)), (_0x5c1967 = _0x45ce69(0x1a4)))\n                            : void (-0x1bd7 + 0xc9 * -0x2b + 0x3d9a) !== document[_0x45ce69(0x22a)] &&\n                            (_0x45ce69(0x22a), (_0x586941 = _0x45ce69(0x322)), (_0x5c1967 = _0x45ce69(0x166))),\n                    document[_0x45ce69(0x2f6)](\n                        _0x586941,\n                        function () {\n                            _0x1be1e1(document[_0x5c1967])\n                        },\n                        !(0x1088 + 0x18c2 + 0xdc3 * -0x3)\n                    ),\n                    _0x1be1e1(document[_0x5c1967])\n            }\n\n            function _0x3ff3f1() {\n                _0x58c311()\n            }\n\n            function _0x4c727e() {\n                var _0x3f5094 = _0x5612de\n\n                function _0x115c6a(_0x2162b2) {\n                    var _0x4cc12e = w_0x25f3\n                    _0x462335['triggerUnload'] || ((_0x462335[_0x4cc12e(0x204)] = !(0x1 * -0x632 + 0x3 * -0xb71 + -0x1c3 * -0x17)), _0x3ff3f1())\n                }\n\n                window &&\n                    window[_0x3f5094(0x2f6)] &&\n                    (window[_0x3f5094(0x2f6)](_0x3f5094(0x37d), _0x115c6a), window[_0x3f5094(0x2f6)](_0x3f5094(0x29b), _0x115c6a))\n            }\n\n            function _0x5b850b() {\n                var _0x4d0be4 = _0x5612de\n                for (\n                    var _0x35a39e = document[_0x4d0be4(0x272)][_0x4d0be4(0x342)](';'), _0x3046a3 = [], _0x58914c = -0x923 + -0x66a * -0x5 + -0x16ef;\n                    _0x58914c < _0x35a39e[_0x4d0be4(0x259)];\n                    _0x58914c++\n                )\n                    if (_0x4d0be4(0x3b5) == (_0x3046a3 = _0x35a39e[_0x58914c][_0x4d0be4(0x342)]('='))[-0x7cd * -0x1 + -0x1678 + 0xeab]['trim']()) {\n                        _0x6caf[_0x4d0be4(0x3b5)] = _0x3046a3[0x200f * -0x1 + 0x926 + 0x16ea]\n                        break\n                    }\n            }\n\n            function _0x498349(_0x5efcd6) {\n                return new _0x53ee31(_0x5efcd6)\n            }\n\n            function _0x475194(_0x56e1e3) {\n                ; -0xa7f + -0xb * 0x18a + 0x1b6d === _0x56e1e3\n                // setTimeout(_0x5047d8, 0x1 * -0xb55 + -0x1031 + 0x1bea * 0x1) : -0xef1 + -0xfd3 * -0x1 + -0xe1 === _0x56e1e3 && setTimeout(_0x5c328e, 0x6 * 0x38d + -0x49 * -0x2b + -0x95 * 0x39);\n            }\n\n            function _0x4a4111(_0x2ba688, _0x1e135c) {\n                var _0x18e9b1 = _0x5612de\n                    ; -0xfab + 0x9 * -0x2a2 + 0x275e === _0x2ba688 &&\n                        (_0x462335[_0x18e9b1(0x34a)] = Object['assign']({}, _0x462335[_0x18e9b1(0x34a)], _0x1e135c))\n            }\n\n            function _0x271dea(_0x20563e) {\n                void (-0x1aa2 + -0x2407 + 0x3 * 0x14e3) !== _0x20563e && '' != _0x20563e && (_0x6caf['ttwid'] = _0x20563e)\n            }\n\n            function _0x3a4a1a(_0x5b82b5) {\n                var _0x30adbb = _0x5612de\n                void (0xb * -0x17d + -0x227d + 0x32dc) !== _0x5b82b5 && '' != _0x5b82b5 && (_0x6caf[_0x30adbb(0x316)] = _0x5b82b5)\n            }\n\n            function _0x3f0a66(_0x53e069) {\n                var _0x38d5b6 = _0x5612de\n                void (-0x7eb * 0x3 + 0xc4 * 0x2 + -0x1 * -0x1639) !== _0x53e069 && '' != _0x53e069 && (_0x6caf[_0x38d5b6(0x339)] = _0x53e069)\n            }\n\n            ; (_0x53ee31[_0x5612de(0x344)][_0x5612de(0x1a3)] = _0x5c2014),\n                (_0x53ee31[_0x5612de(0x344)]['getReferer'] = _0x32e4a6),\n                (_0x53ee31[_0x5612de(0x344)]['setUserMode'] = _0x3498af),\n                (_0xd39ee2 = _0x24dc34(_0x45b94b['refererKey']) || ''),\n                _0x2ecc5a(_0x45b94b['refererKey']),\n                _0x5612de(0x2d6) === _0xd39ee2 ? (_0xd39ee2 = '') : '' === _0xd39ee2 && (_0xd39ee2 = document[_0x5612de(0x2fa)]),\n                _0xd39ee2 && (window[_0x5612de(0x318)] = _0xd39ee2),\n                (_0x9e520d = _0x5141ac()),\n                _0x9e520d && ((_0x6caf[_0x5612de(0x2b4)] = _0x9e520d), (_0x6caf['msStatus'] = _0x39693d['asgw'])),\n                // setTimeout(function () {\n                //     _0x18a9f7(),\n                //         _0x1dbe74(),\n                //         _0x4de7ef(),\n                //         _0x4c727e(),\n                //         _0x21fa28();\n                // }, -0x1a83 + 0x15ee + -0xd * -0x141),\n                _0x5b850b(),\n                _0x59992f([_0x5612de(0x30c)])\n            var _0x1649bc = !(-0xc6b * -0x1 + -0x2315 + 0x16aa)\n            crawler = _0x5c2014\n                ; (_0x1d18f2['frontierSign'] = _0x5c2014),\n                    (_0x1d18f2[_0x5612de(0x2e8)] = _0x32e4a6),\n                    (_0x1d18f2[_0x5612de(0x3b9)] = _0x498349),\n                    (_0x1d18f2[_0x5612de(0x1f8)] = _0x1649bc),\n                    (_0x1d18f2['report'] = _0x475194),\n                    (_0x1d18f2[_0x5612de(0x298)] = _0x4a4111),\n                    (_0x1d18f2[_0x5612de(0x1a7)] = _0x3a4a1a),\n                    (_0x1d18f2['setTTWebidV2'] = _0x3f0a66),\n                    (_0x1d18f2[_0x5612de(0x244)] = _0x271dea),\n                    (_0x1d18f2[_0x5612de(0x378)] = _0x3498af),\n                    Object['defineProperty'](_0x1d18f2, _0x5612de(0x3bd), {\n                        value: !(0x1 * 0x2069 + -0x1403 + -0xc66)\n                    })\n        })\n    }\n\n    function get_sign(md5) {\n        let data = {\n            'X-MS-STUB': md5\n        }\n        return crawler(data)['X-Bogus']\n    }\n\n    return get_sign(msStub)\n}\n''';\n\n  static const String defaultUserAgent = DouyinSite.kDefaultUserAgent;\n  static String getAbogusUrl(String url, String userAgent) {\n    JsRuntime flutterJs = JsRuntime(\n      memoryLimit: 4 * 1024 * 1024,\n      maxStackSize: 64 * 1024,\n    );\n    final msToken = generateMsToken(107);\n    var params = ('$url&msToken=$msToken').split('?')[1];\n    var query = params.contains(\"?\") ? params.split(\"?\")[1] : params;\n    var jsCode = kABogus;\n    flutterJs.eval(jsCode);\n    // 执行getABogus函数\n    var aBogus = flutterJs.eval(\"getABogus('$query', '$userAgent')\");\n    flutterJs.dispose();\n    var newUrl =\n        '$url&msToken=${Uri.encodeComponent(msToken)}&a_bogus=${Uri.encodeComponent(aBogus)}';\n    return newUrl;\n  }\n\n  static String getSignature(String roomId, String uniqueId) {\n    JsRuntime flutterJs = JsRuntime(\n      memoryLimit: 4 * 1024 * 1024,\n      maxStackSize: 128 * 1024,\n    );\n\n    flutterJs.eval(kWebMsSDK);\n    var msStub = getMsStub(roomId, uniqueId);\n    var signature = flutterJs.eval(\n      \"getMSSDKSignature('$msStub','$defaultUserAgent')\",\n    );\n    // 如果signature中包含-或=，重新生成\n    while (signature.contains('-') || signature.contains('=')) {\n      signature = flutterJs.eval(\n        \"getMSSDKSignature('$msStub','$defaultUserAgent')\",\n      );\n    }\n    flutterJs.dispose();\n    return signature;\n  }\n\n  static String getMsStub(String roomId, String uniqueId) {\n    final params = {\n      \"live_id\": \"1\",\n      \"aid\": \"6383\",\n      \"version_code\": 180800,\n      \"webcast_sdk_version\": \"1.3.0\",\n      \"room_id\": roomId,\n      \"sub_room_id\": \"\",\n      \"sub_channel_id\": \"\",\n      \"did_rule\": \"3\",\n      \"user_unique_id\": uniqueId,\n      \"device_platform\": \"web\",\n      \"device_type\": \"\",\n      \"ac\": \"\",\n      \"identity\": \"audience\",\n    };\n    final sigParams = params.entries\n        .map((e) => \"${e.key}=${e.value}\")\n        .join(',');\n    // 需要导入crypto库: import 'package:crypto/crypto.dart';\n    final bytes = sigParams.codeUnits;\n    final digest = md5.convert(bytes);\n    return digest.toString();\n  }\n\n  static String generateMsToken(int length) {\n    const characters =\n        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    final random = Random.secure();\n    return List.generate(\n      length,\n      (_) => characters[random.nextInt(characters.length)],\n    ).join('');\n  }\n}\n"
  },
  {
    "path": "simple_live_core/lib/src/scripts/douyu_sign.dart",
    "content": "import 'package:dart_quickjs/dart_quickjs.dart';\n\nclass DouyuSign {\n  static const String kCryptoJs = r'''\n!function(t,e){\"object\"==typeof exports?module.exports=exports=e():\"function\"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var h,t,e,r,i,n,f,o,s,c,a,l,d,m,x,b,H,z,A,u,p,_,v,y,g,B,w,k,S,C,D,E,R,M,F,P,W,O,I,U,K,X,L,j,N,T,q,Z,V,G,J,$,Q,Y,tt,et,rt,it,nt,ot,st,ct,at,ht,lt,ft,dt,ut,pt,_t,vt,yt,gt,Bt,wt,kt,St,bt=bt||function(l){var t;if(\"undefined\"!=typeof window&&window.crypto&&(t=window.crypto),!t&&\"undefined\"!=typeof window&&window.msCrypto&&(t=window.msCrypto),!t&&\"undefined\"!=typeof global&&global.crypto&&(t=global.crypto),!t&&\"function\"==typeof require)try{t=require(\"crypto\")}catch(t){}function i(){if(t){if(\"function\"==typeof t.getRandomValues)try{return t.getRandomValues(new Uint32Array(1))[0]}catch(t){}if(\"function\"==typeof t.randomBytes)try{return t.randomBytes(4).readInt32LE()}catch(t){}}throw new Error(\"Native crypto module could not be used to get secure random number.\")}var r=Object.create||function(t){var e;return n.prototype=t,e=new n,n.prototype=null,e};function n(){}var e={},o=e.lib={},s=o.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty(\"init\")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty(\"toString\")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},f=o.WordArray=s.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||a).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o<n;o++){var s=r[o>>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(o=0;o<n;o+=4)e[i+o>>>2]=r[o>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=l.ceil(e/4)},clone:function(){var t=s.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r<t;r+=4)e.push(i());return new f.init(e,t)}}),c=e.enc={},a=c.Hex={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n++){var o=e[n>>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join(\"\")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i+=2)r[i>>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new f.init(r,e/2)}},h=c.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n++){var o=e[n>>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join(\"\")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new f.init(r,e)}},d=c.Utf8={stringify:function(t){try{return decodeURIComponent(escape(h.stringify(t)))}catch(t){throw new Error(\"Malformed UTF-8 data\")}},parse:function(t){return h.parse(unescape(encodeURIComponent(t)))}},u=o.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new f.init,this._nDataBytes=0},_append:function(t){\"string\"==typeof t&&(t=d.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?l.ceil(s):l.max((0|s)-this._minBufferSize,0))*o,a=l.min(4*c,n);if(c){for(var h=0;h<c;h+=o)this._doProcessBlock(i,h);e=i.splice(0,c),r.sigBytes-=a}return new f.init(e,a)},clone:function(){var t=s.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),p=(o.Hasher=u.extend({cfg:s.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){u.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(r){return function(t,e){return new r.init(e).finalize(t)}},_createHmacHelper:function(r){return function(t,e){return new p.HMAC.init(r,e).finalize(t)}}}),e.algo={});return e}(Math);function mt(t,e,r){return t^e^r}function xt(t,e,r){return t&e|~t&r}function Ht(t,e,r){return(t|~e)^r}function zt(t,e,r){return t&r|e&~r}function At(t,e,r){return t^(e|~r)}function Ct(t,e){return t<<e|t>>>32-e}function Dt(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s<r;s++)t[e+s]^=n[s]}function Et(t){if(255==(t>>24&255)){var e=t>>16&255,r=t>>8&255,i=255&t;255===e?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i}else t+=1<<24;return t}function Rt(){for(var t=this._X,e=this._C,r=0;r<8;r++)ft[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0<ft[0]>>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0<ft[1]>>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0<ft[2]>>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0<ft[3]>>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0<ft[4]>>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0<ft[5]>>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0<ft[6]>>>0?1:0)|0,this._b=e[7]>>>0<ft[7]>>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);dt[r]=s^c}t[0]=dt[0]+(dt[7]<<16|dt[7]>>>16)+(dt[6]<<16|dt[6]>>>16)|0,t[1]=dt[1]+(dt[0]<<8|dt[0]>>>24)+dt[7]|0,t[2]=dt[2]+(dt[1]<<16|dt[1]>>>16)+(dt[0]<<16|dt[0]>>>16)|0,t[3]=dt[3]+(dt[2]<<8|dt[2]>>>24)+dt[1]|0,t[4]=dt[4]+(dt[3]<<16|dt[3]>>>16)+(dt[2]<<16|dt[2]>>>16)|0,t[5]=dt[5]+(dt[4]<<8|dt[4]>>>24)+dt[3]|0,t[6]=dt[6]+(dt[5]<<16|dt[5]>>>16)+(dt[4]<<16|dt[4]>>>16)|0,t[7]=dt[7]+(dt[6]<<8|dt[6]>>>24)+dt[5]|0}function Mt(){for(var t=this._X,e=this._C,r=0;r<8;r++)wt[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0<wt[0]>>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0<wt[1]>>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0<wt[2]>>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0<wt[3]>>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0<wt[4]>>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0<wt[5]>>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0<wt[6]>>>0?1:0)|0,this._b=e[7]>>>0<wt[7]>>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16,s=((n*n>>>17)+n*o>>>15)+o*o,c=((4294901760&i)*i|0)+((65535&i)*i|0);kt[r]=s^c}t[0]=kt[0]+(kt[7]<<16|kt[7]>>>16)+(kt[6]<<16|kt[6]>>>16)|0,t[1]=kt[1]+(kt[0]<<8|kt[0]>>>24)+kt[7]|0,t[2]=kt[2]+(kt[1]<<16|kt[1]>>>16)+(kt[0]<<16|kt[0]>>>16)|0,t[3]=kt[3]+(kt[2]<<8|kt[2]>>>24)+kt[1]|0,t[4]=kt[4]+(kt[3]<<16|kt[3]>>>16)+(kt[2]<<16|kt[2]>>>16)|0,t[5]=kt[5]+(kt[4]<<8|kt[4]>>>24)+kt[3]|0,t[6]=kt[6]+(kt[5]<<16|kt[5]>>>16)+(kt[4]<<16|kt[4]>>>16)|0,t[7]=kt[7]+(kt[6]<<8|kt[6]>>>24)+kt[5]|0}return h=bt.lib.WordArray,bt.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o<r;o+=3)for(var s=(e[o>>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c<r;c++)n.push(i.charAt(s>>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join(\"\")},parse:function(t){var e=t.length,r=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var n=0;n<r.length;n++)i[r.charCodeAt(n)]=n}var o=r.charAt(64);if(o){var s=t.indexOf(o);-1!==s&&(e=s)}return function(t,e,r){for(var i=[],n=0,o=0;o<e;o++)if(o%4){var s=r[t.charCodeAt(o-1)]<<o%4*2,c=r[t.charCodeAt(o)]>>>6-o%4*2,a=s|c;i[n>>>2]|=a<<24-n%4*8,n++}return h.create(i,n)}(t,e,i)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"},function(l){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,n=t.algo,H=[];!function(){for(var t=0;t<64;t++)H[t]=4294967296*l.abs(l.sin(t+1))|0}();var o=n.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],v=t[e+10],y=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],S=o[0],m=o[1],x=o[2],b=o[3];S=z(S,m,x,b,s,7,H[0]),b=z(b,S,m,x,c,12,H[1]),x=z(x,b,S,m,a,17,H[2]),m=z(m,x,b,S,h,22,H[3]),S=z(S,m,x,b,l,7,H[4]),b=z(b,S,m,x,f,12,H[5]),x=z(x,b,S,m,d,17,H[6]),m=z(m,x,b,S,u,22,H[7]),S=z(S,m,x,b,p,7,H[8]),b=z(b,S,m,x,_,12,H[9]),x=z(x,b,S,m,v,17,H[10]),m=z(m,x,b,S,y,22,H[11]),S=z(S,m,x,b,g,7,H[12]),b=z(b,S,m,x,B,12,H[13]),x=z(x,b,S,m,w,17,H[14]),S=A(S,m=z(m,x,b,S,k,22,H[15]),x,b,c,5,H[16]),b=A(b,S,m,x,d,9,H[17]),x=A(x,b,S,m,y,14,H[18]),m=A(m,x,b,S,s,20,H[19]),S=A(S,m,x,b,f,5,H[20]),b=A(b,S,m,x,v,9,H[21]),x=A(x,b,S,m,k,14,H[22]),m=A(m,x,b,S,l,20,H[23]),S=A(S,m,x,b,_,5,H[24]),b=A(b,S,m,x,w,9,H[25]),x=A(x,b,S,m,h,14,H[26]),m=A(m,x,b,S,p,20,H[27]),S=A(S,m,x,b,B,5,H[28]),b=A(b,S,m,x,a,9,H[29]),x=A(x,b,S,m,u,14,H[30]),S=C(S,m=A(m,x,b,S,g,20,H[31]),x,b,f,4,H[32]),b=C(b,S,m,x,p,11,H[33]),x=C(x,b,S,m,y,16,H[34]),m=C(m,x,b,S,w,23,H[35]),S=C(S,m,x,b,c,4,H[36]),b=C(b,S,m,x,l,11,H[37]),x=C(x,b,S,m,u,16,H[38]),m=C(m,x,b,S,v,23,H[39]),S=C(S,m,x,b,B,4,H[40]),b=C(b,S,m,x,s,11,H[41]),x=C(x,b,S,m,h,16,H[42]),m=C(m,x,b,S,d,23,H[43]),S=C(S,m,x,b,_,4,H[44]),b=C(b,S,m,x,g,11,H[45]),x=C(x,b,S,m,k,16,H[46]),S=D(S,m=C(m,x,b,S,a,23,H[47]),x,b,s,6,H[48]),b=D(b,S,m,x,u,10,H[49]),x=D(x,b,S,m,w,15,H[50]),m=D(m,x,b,S,f,21,H[51]),S=D(S,m,x,b,g,6,H[52]),b=D(b,S,m,x,h,10,H[53]),x=D(x,b,S,m,v,15,H[54]),m=D(m,x,b,S,c,21,H[55]),S=D(S,m,x,b,p,6,H[56]),b=D(b,S,m,x,k,10,H[57]),x=D(x,b,S,m,d,15,H[58]),m=D(m,x,b,S,B,21,H[59]),S=D(S,m,x,b,l,6,H[60]),b=D(b,S,m,x,y,10,H[61]),x=D(x,b,S,m,a,15,H[62]),m=D(m,x,b,S,_,21,H[63]),o[0]=o[0]+S|0,o[1]=o[1]+m|0,o[2]=o[2]+x|0,o[3]=o[3]+b|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=l.floor(r/4294967296),o=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),t.sigBytes=4*(e.length+1),this._process();for(var s=this._hash,c=s.words,a=0;a<4;a++){var h=c[a];c[a]=16711935&(h<<8|h>>>24)|4278255360&(h<<24|h>>>8)}return s},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function z(t,e,r,i,n,o,s){var c=t+(e&r|~e&i)+n+s;return(c<<o|c>>>32-o)+e}function A(t,e,r,i,n,o,s){var c=t+(e&i|r&~i)+n+s;return(c<<o|c>>>32-o)+e}function C(t,e,r,i,n,o,s){var c=t+(e^r^i)+n+s;return(c<<o|c>>>32-o)+e}function D(t,e,r,i,n,o,s){var c=t+(r^(e|~i))+n+s;return(c<<o|c>>>32-o)+e}t.MD5=i._createHelper(o),t.HmacMD5=i._createHmacHelper(o)}(Math),e=(t=bt).lib,r=e.WordArray,i=e.Hasher,n=t.algo,f=[],o=n.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){if(a<16)f[a]=0|t[e+a];else{var h=f[a-3]^f[a-8]^f[a-14]^f[a-16];f[a]=h<<1|h>>>31}var l=(i<<5|i>>>27)+c+f[a];l+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=l}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}}),t.SHA1=i._createHelper(o),t.HmacSHA1=i._createHmacHelper(o),function(n){var t=bt,e=t.lib,r=e.WordArray,i=e.Hasher,o=t.algo,s=[],B=[];!function(){function t(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}function e(t){return 4294967296*(t-(0|t))|0}for(var r=2,i=0;i<64;)t(r)&&(i<8&&(s[i]=e(n.pow(r,.5))),B[i]=e(n.pow(r,1/3)),i++),r++}();var w=[],c=o.SHA256=i.extend({_doReset:function(){this._hash=new r.init(s.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){if(f<16)w[f]=0|t[e+f];else{var d=w[f-15],u=(d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3,p=w[f-2],_=(p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10;w[f]=u+w[f-7]+_+w[f-16]}var v=i&n^i&o^n&o,y=(i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22),g=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+B[f]+w[f];l=h,h=a,a=c,c=s+g|0,s=o,o=n,n=i,i=g+(y+v)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(c),t.HmacSHA256=i._createHmacHelper(c)}(Math),function(){var n=bt.lib.WordArray,t=bt.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n+=2){var o=e[n>>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join(\"\")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n<r;n+=2){var o=s(e[n>>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join(\"\")},parse:function(t){for(var e=t.length,r=[],i=0;i<e;i++)r[i>>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),function(){if(\"function\"==typeof ArrayBuffer){var t=bt.lib.WordArray,n=t.init;(t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||\"undefined\"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var e=t.byteLength,r=[],i=0;i<e;i++)r[i>>>2]|=t[i]<<24-i%4*8;n.call(this,r,e)}else n.apply(this,arguments)}).prototype=t}}(),Math,c=(s=bt).lib,a=c.WordArray,l=c.Hasher,d=s.algo,m=a.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=a.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=a.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),H=a.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),z=a.create([0,1518500249,1859775393,2400959708,2840853838]),A=a.create([1352829926,1548603684,1836072691,2053994217,0]),u=d.RIPEMD160=l.extend({_doReset:function(){this._hash=a.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o,s,c,a,h,l,f,d,u,p,_,v=this._hash.words,y=z.words,g=A.words,B=m.words,w=x.words,k=b.words,S=H.words;l=o=v[0],f=s=v[1],d=c=v[2],u=a=v[3],p=h=v[4];for(r=0;r<80;r+=1)_=o+t[e+B[r]]|0,_+=r<16?mt(s,c,a)+y[0]:r<32?xt(s,c,a)+y[1]:r<48?Ht(s,c,a)+y[2]:r<64?zt(s,c,a)+y[3]:At(s,c,a)+y[4],_=(_=Ct(_|=0,k[r]))+h|0,o=h,h=a,a=Ct(c,10),c=s,s=_,_=l+t[e+w[r]]|0,_+=r<16?At(f,d,u)+g[0]:r<32?zt(f,d,u)+g[1]:r<48?Ht(f,d,u)+g[2]:r<64?xt(f,d,u)+g[3]:mt(f,d,u)+g[4],_=(_=Ct(_|=0,S[r]))+p|0,l=p,p=u,u=Ct(d,10),d=f,f=_;_=v[1]+c+u|0,v[1]=v[2]+a+p|0,v[2]=v[3]+h+l|0,v[3]=v[4]+o+f|0,v[4]=v[0]+s+d|0,v[0]=_},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var n=this._hash,o=n.words,s=0;s<5;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return n},clone:function(){var t=l.clone.call(this);return t._hash=this._hash.clone(),t}}),s.RIPEMD160=l._createHelper(u),s.HmacRIPEMD160=l._createHmacHelper(u),p=bt.lib.Base,_=bt.enc.Utf8,bt.algo.HMAC=p.extend({init:function(t,e){t=this._hasher=new t.init,\"string\"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;e.sigBytes>i&&(e=t.finalize(e)),e.clamp();for(var n=this._oKey=e.clone(),o=this._iKey=e.clone(),s=n.words,c=o.words,a=0;a<r;a++)s[a]^=1549556828,c[a]^=909522486;n.sigBytes=o.sigBytes=i,this.reset()},reset:function(){var t=this._hasher;t.reset(),t.update(this._iKey)},update:function(t){return this._hasher.update(t),this},finalize:function(t){var e=this._hasher,r=e.finalize(t);return e.reset(),e.finalize(this._oKey.clone().concat(r))}}),y=(v=bt).lib,g=y.Base,B=y.WordArray,w=v.algo,k=w.SHA1,S=w.HMAC,C=w.PBKDF2=g.extend({cfg:g.extend({keySize:4,hasher:k,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r=this.cfg,i=S.create(r.hasher,t),n=B.create(),o=B.create([1]),s=n.words,c=o.words,a=r.keySize,h=r.iterations;s.length<a;){var l=i.update(e).finalize(o);i.reset();for(var f=l.words,d=f.length,u=l,p=1;p<h;p++){u=i.finalize(u),i.reset();for(var _=u.words,v=0;v<d;v++)f[v]^=_[v]}n.concat(l),c[0]++}return n.sigBytes=4*a,n}}),v.PBKDF2=function(t,e,r){return C.create(r).compute(t,e)},E=(D=bt).lib,R=E.Base,M=E.WordArray,F=D.algo,P=F.MD5,W=F.EvpKDF=R.extend({cfg:R.extend({keySize:4,hasher:P,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r,i=this.cfg,n=i.hasher.create(),o=M.create(),s=o.words,c=i.keySize,a=i.iterations;s.length<c;){r&&n.update(r),r=n.update(t).finalize(e),n.reset();for(var h=1;h<a;h++)r=n.finalize(r),n.reset();o.concat(r)}return o.sigBytes=4*c,o}}),D.EvpKDF=function(t,e,r){return W.create(r).compute(t,e)},I=(O=bt).lib.WordArray,U=O.algo,K=U.SHA256,X=U.SHA224=K.extend({_doReset:function(){this._hash=new I.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=K._doFinalize.call(this);return t.sigBytes-=4,t}}),O.SHA224=K._createHelper(X),O.HmacSHA224=K._createHmacHelper(X),L=bt.lib,j=L.Base,N=L.WordArray,(T=bt.x64={}).Word=j.extend({init:function(t,e){this.high=t,this.low=e}}),T.WordArray=j.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i<e;i++){var n=t[i];r.push(n.high),r.push(n.low)}return N.create(r,this.sigBytes)},clone:function(){for(var t=j.clone.call(this),e=t.words=this.words.slice(0),r=e.length,i=0;i<r;i++)e[i]=e[i].clone();return t}}),function(d){var t=bt,e=t.lib,u=e.WordArray,i=e.Hasher,l=t.x64.Word,r=t.algo,C=[],D=[],E=[];!function(){for(var t=1,e=0,r=0;r<24;r++){C[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)D[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s=0,c=0,a=0;a<7;a++){if(1&n){var h=(1<<a)-1;h<32?c^=1<<h:s^=1<<h-32}128&n?n=n<<1^113:n<<=1}E[o]=l.create(s,c)}}();var R=[];!function(){for(var t=0;t<25;t++)R[t]=l.create()}();var n=r.SHA3=i.extend({cfg:i.cfg.extend({outputLength:512}),_doReset:function(){for(var t=this._state=[],e=0;e<25;e++)t[e]=new l.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(t,e){for(var r=this._state,i=this.blockSize/2,n=0;n<i;n++){var o=t[e+2*n],s=t[e+2*n+1];o=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),(x=r[n]).high^=s,x.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++){h^=(x=r[a+5*f]).high,l^=x.low}var d=R[a];d.high=h,d.low=l}for(a=0;a<5;a++){var u=R[(a+4)%5],p=R[(a+1)%5],_=p.high,v=p.low;for(h=u.high^(_<<1|v>>>31),l=u.low^(v<<1|_>>>31),f=0;f<5;f++){(x=r[a+5*f]).high^=h,x.low^=l}}for(var y=1;y<25;y++){var g=(x=r[y]).high,B=x.low,w=C[y];l=w<32?(h=g<<w|B>>>32-w,B<<w|g>>>32-w):(h=B<<w-32|g>>>64-w,g<<w-32|B>>>64-w);var k=R[D[y]];k.high=h,k.low=l}var S=R[0],m=r[0];S.high=m.high,S.low=m.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var x=r[y=a+5*f],b=R[y],H=R[(a+1)%5+5*f],z=R[(a+2)%5+5*f];x.high=b.high^~H.high&z.high,x.low=b.low^~H.low&z.low}x=r[0];var A=E[c];x.high^=A.high,x.low^=A.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(d.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,o=this.cfg.outputLength/8,s=o/8,c=[],a=0;a<s;a++){var h=n[a],l=h.high,f=h.low;l=16711935&(l<<8|l>>>24)|4278255360&(l<<24|l>>>8),f=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8),c.push(f),c.push(l)}return new u.init(c,o)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(n),t.HmacSHA3=i._createHmacHelper(n)}(Math),function(){var t=bt,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,o=t.algo;function s(){return i.create.apply(i,arguments)}var mt=[s(1116352408,3609767458),s(1899447441,602891725),s(3049323471,3964484399),s(3921009573,2173295548),s(961987163,4081628472),s(1508970993,3053834265),s(2453635748,2937671579),s(2870763221,3664609560),s(3624381080,2734883394),s(310598401,1164996542),s(607225278,1323610764),s(1426881987,3590304994),s(1925078388,4068182383),s(2162078206,991336113),s(2614888103,633803317),s(3248222580,3479774868),s(3835390401,2666613458),s(4022224774,944711139),s(264347078,2341262773),s(604807628,2007800933),s(770255983,1495990901),s(1249150122,1856431235),s(1555081692,3175218132),s(1996064986,2198950837),s(2554220882,3999719339),s(2821834349,766784016),s(2952996808,2566594879),s(3210313671,3203337956),s(3336571891,1034457026),s(3584528711,2466948901),s(113926993,3758326383),s(338241895,168717936),s(666307205,1188179964),s(773529912,1546045734),s(1294757372,1522805485),s(1396182291,2643833823),s(1695183700,2343527390),s(1986661051,1014477480),s(2177026350,1206759142),s(2456956037,344077627),s(2730485921,1290863460),s(2820302411,3158454273),s(3259730800,3505952657),s(3345764771,106217008),s(3516065817,3606008344),s(3600352804,1432725776),s(4094571909,1467031594),s(275423344,851169720),s(430227734,3100823752),s(506948616,1363258195),s(659060556,3750685593),s(883997877,3785050280),s(958139571,3318307427),s(1322822218,3812723403),s(1537002063,2003034995),s(1747873779,3602036899),s(1955562222,1575990012),s(2024104815,1125592928),s(2227730452,2716904306),s(2361852424,442776044),s(2428436474,593698344),s(2756734187,3733110249),s(3204031479,2999351573),s(3329325298,3815920427),s(3391569614,3928383900),s(3515267271,566280711),s(3940187606,3454069534),s(4118630271,4000239992),s(116418474,1914138554),s(174292421,2731055270),s(289380356,3203993006),s(460393269,320620315),s(685471733,587496836),s(852142971,1086792851),s(1017036298,365543100),s(1126000580,2618297676),s(1288033470,3409855158),s(1501505948,4234509866),s(1607167915,987167468),s(1816402316,1246189591)],xt=[];!function(){for(var t=0;t<80;t++)xt[t]=s()}();var c=o.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,v=o.low,y=s.high,g=s.low,B=c.high,w=c.low,k=a.high,S=a.low,m=h.high,x=h.low,b=l.high,H=l.low,z=f,A=d,C=u,D=p,E=_,R=v,M=y,F=g,P=B,W=w,O=k,I=S,U=m,K=x,X=b,L=H,j=0;j<80;j++){var N,T,q=xt[j];if(j<16)T=q.high=0|t[e+2*j],N=q.low=0|t[e+2*j+1];else{var Z=xt[j-15],V=Z.high,G=Z.low,J=(V>>>1|G<<31)^(V>>>8|G<<24)^V>>>7,$=(G>>>1|V<<31)^(G>>>8|V<<24)^(G>>>7|V<<25),Q=xt[j-2],Y=Q.high,tt=Q.low,et=(Y>>>19|tt<<13)^(Y<<3|tt>>>29)^Y>>>6,rt=(tt>>>19|Y<<13)^(tt<<3|Y>>>29)^(tt>>>6|Y<<26),it=xt[j-7],nt=it.high,ot=it.low,st=xt[j-16],ct=st.high,at=st.low;T=(T=(T=J+nt+((N=$+ot)>>>0<$>>>0?1:0))+et+((N+=rt)>>>0<rt>>>0?1:0))+ct+((N+=at)>>>0<at>>>0?1:0),q.high=T,q.low=N}var ht,lt=P&O^~P&U,ft=W&I^~W&K,dt=z&C^z&E^C&E,ut=A&D^A&R^D&R,pt=(z>>>28|A<<4)^(z<<30|A>>>2)^(z<<25|A>>>7),_t=(A>>>28|z<<4)^(A<<30|z>>>2)^(A<<25|z>>>7),vt=(P>>>14|W<<18)^(P>>>18|W<<14)^(P<<23|W>>>9),yt=(W>>>14|P<<18)^(W>>>18|P<<14)^(W<<23|P>>>9),gt=mt[j],Bt=gt.high,wt=gt.low,kt=X+vt+((ht=L+yt)>>>0<L>>>0?1:0),St=_t+ut;X=U,L=K,U=O,K=I,O=P,I=W,P=M+(kt=(kt=(kt=kt+lt+((ht=ht+ft)>>>0<ft>>>0?1:0))+Bt+((ht=ht+wt)>>>0<wt>>>0?1:0))+T+((ht=ht+N)>>>0<N>>>0?1:0))+((W=F+ht|0)>>>0<F>>>0?1:0)|0,M=E,F=R,E=C,R=D,C=z,D=A,z=kt+(pt+dt+(St>>>0<_t>>>0?1:0))+((A=ht+St|0)>>>0<ht>>>0?1:0)|0}d=i.low=d+A,i.high=f+z+(d>>>0<A>>>0?1:0),p=n.low=p+D,n.high=u+C+(p>>>0<D>>>0?1:0),v=o.low=v+R,o.high=_+E+(v>>>0<R>>>0?1:0),g=s.low=g+F,s.high=y+M+(g>>>0<F>>>0?1:0),w=c.low=w+W,c.high=B+P+(w>>>0<W>>>0?1:0),S=a.low=S+I,a.high=k+O+(S>>>0<I>>>0?1:0),x=h.low=x+K,h.high=m+U+(x>>>0<K>>>0?1:0),H=l.low=H+L,l.high=b+X+(H>>>0<L>>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(c),t.HmacSHA512=e._createHmacHelper(c)}(),Z=(q=bt).x64,V=Z.Word,G=Z.WordArray,J=q.algo,$=J.SHA512,Q=J.SHA384=$.extend({_doReset:function(){this._hash=new G.init([new V.init(3418070365,3238371032),new V.init(1654270250,914150663),new V.init(2438529370,812702999),new V.init(355462360,4144912697),new V.init(1731405415,4290775857),new V.init(2394180231,1750603025),new V.init(3675008525,1694076839),new V.init(1203062813,3204075428)])},_doFinalize:function(){var t=$._doFinalize.call(this);return t.sigBytes-=16,t}}),q.SHA384=$._createHelper(Q),q.HmacSHA384=$._createHmacHelper(Q),bt.lib.Cipher||function(){var t=bt,e=t.lib,r=e.Base,a=e.WordArray,i=e.BufferedBlockAlgorithm,n=t.enc,o=(n.Utf8,n.Base64),s=t.algo.EvpKDF,c=e.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(i){return{encrypt:function(t,e,r){return h(e).encrypt(i,t,e,r)},decrypt:function(t,e,r){return h(e).decrypt(i,t,e,r)}}}});function h(t){return\"string\"==typeof t?w:g}e.StreamCipher=c.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var l,f=t.mode={},d=e.BlockCipherMode=r.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),u=f.CBC=((l=d.extend()).Encryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;p.call(this,t,e,i),r.encryptBlock(t,e),this._prevBlock=t.slice(e,e+i)}}),l.Decryptor=l.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);r.decryptBlock(t,e),p.call(this,t,e,i),this._prevBlock=n}}),l);function p(t,e,r){var i,n=this._iv;n?(i=n,this._iv=void 0):i=this._prevBlock;for(var o=0;o<r;o++)t[e+o]^=i[o]}var _=(t.pad={}).Pkcs7={pad:function(t,e){for(var r=4*e,i=r-t.sigBytes%r,n=i<<24|i<<16|i<<8|i,o=[],s=0;s<i;s+=4)o.push(n);var c=a.create(o,i);t.concat(c)},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},v=(e.BlockCipher=c.extend({cfg:c.cfg.extend({mode:u,padding:_}),reset:function(){var t;c.reset.call(this);var e=this.cfg,r=e.iv,i=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=i.createEncryptor:(t=i.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(i,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?a.create([1398893684,1701076831]).concat(r).concat(e):e).toString(o)},parse:function(t){var e,r=o.parse(t),i=r.words;return 1398893684==i[0]&&1701076831==i[1]&&(e=a.create(i.slice(2,4)),i.splice(0,4),r.sigBytes-=16),v.create({ciphertext:r,salt:e})}},g=e.SerializableCipher=r.extend({cfg:r.extend({format:y}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),o=n.finalize(e),s=n.cfg;return v.create({ciphertext:o,key:r,iv:s.iv,algorithm:t,mode:s.mode,padding:s.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return\"string\"==typeof t?e.parse(t,this):t}}),B=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||a.random(8);var n=s.create({keySize:e+r}).compute(t,i),o=a.create(n.words.slice(e),4*r);return n.sigBytes=4*e,v.create({key:n,iv:o,salt:i})}},w=e.PasswordBasedCipher=g.extend({cfg:g.cfg.extend({kdf:B}),encrypt:function(t,e,r,i){var n=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=n.iv;var o=g.encrypt.call(this,t,e,n.key,i);return o.mixIn(n),o},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);var n=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=n.iv,g.decrypt.call(this,t,e,n.key,i)}})}(),bt.mode.CFB=((Y=bt.lib.BlockCipherMode.extend()).Encryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;Dt.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),Y.Decryptor=Y.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);Dt.call(this,t,e,i,r),this._prevBlock=n}}),Y),bt.mode.ECB=((tt=bt.lib.BlockCipherMode.extend()).Encryptor=tt.extend({processBlock:function(t,e){this._cipher.encryptBlock(t,e)}}),tt.Decryptor=tt.extend({processBlock:function(t,e){this._cipher.decryptBlock(t,e)}}),tt),bt.pad.AnsiX923={pad:function(t,e){var r=t.sigBytes,i=4*e,n=i-r%i,o=r+n-1;t.clamp(),t.words[o>>>2]|=n<<24-o%4*8,t.sigBytes+=n},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso10126={pad:function(t,e){var r=4*e,i=r-t.sigBytes%r;t.concat(bt.lib.WordArray.random(i-1)).concat(bt.lib.WordArray.create([i<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},bt.pad.Iso97971={pad:function(t,e){t.concat(bt.lib.WordArray.create([2147483648],1)),bt.pad.ZeroPadding.pad(t,e)},unpad:function(t){bt.pad.ZeroPadding.unpad(t),t.sigBytes--}},bt.mode.OFB=(et=bt.lib.BlockCipherMode.extend(),rt=et.Encryptor=et.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._keystream;n&&(o=this._keystream=n.slice(0),this._iv=void 0),r.encryptBlock(o,0);for(var s=0;s<i;s++)t[e+s]^=o[s]}}),et.Decryptor=rt,et),bt.pad.NoPadding={pad:function(){},unpad:function(){}},it=bt.lib.CipherParams,nt=bt.enc.Hex,bt.format.Hex={stringify:function(t){return t.ciphertext.toString(nt)},parse:function(t){var e=nt.parse(t);return it.create({ciphertext:e})}},function(){var t=bt,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],v=[],y=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;var r=0,i=0;for(e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;n=n>>>8^255&n^99,h[r]=n;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a;a=16843009*c^65537*s^257*o^16843008*r;_[n]=a<<24|a>>>8,v[n]=a<<16|a>>>16,y[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],i=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o<i;o++)o<r?n[o]=e[o]:(a=n[o-1],o%r?6<r&&o%r==4&&(a=h[a>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c<i;c++){o=i-c;if(c%4)var a=n[o];else a=n[o-4];s[c]=c<4||o<=4?a:_[h[a>>>24]]^v[h[a>>>16&255]]^y[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,v,y,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p<a;p++){var _=i[h>>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],v=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],y=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++];h=_,l=v,f=y,d=g}_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],v=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],y=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=v,t[e+2]=y,t[e+3]=g},keySize:8});t.AES=e._createHelper(i)}(),function(){var t=bt,e=t.lib,n=e.WordArray,r=e.BlockCipher,i=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],o=i.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){var s=n[o]=[],c=f[o];for(r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}var a=this._invSubKeys=[];for(r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){var r=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=r,this._lBlock^=r<<t}function _(t,e){var r=(this._rBlock>>>t^this._lBlock)&e;this._lBlock^=r,this._rBlock^=r<<t}t.DES=r._createHelper(o);var s=i.TripleDES=r.extend({_doReset:function(){var t=this._key.words;if(2!==t.length&&4!==t.length&&t.length<6)throw new Error(\"Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.\");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),i=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=o.createEncryptor(n.create(e)),this._des2=o.createEncryptor(n.create(r)),this._des3=o.createEncryptor(n.create(i))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(s)}(),function(){var t=bt,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;n=0;for(var o=0;n<256;n++){var s=n%r,c=e[s>>>2]>>>24-s%4*8&255;o=(o+i[n]+c)%256;var a=i[n];i[n]=i[o],i[o]=a}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){r=(r+t[e=(e+1)%256])%256;var o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);var o=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0<t;t--)n.call(this)}});t.RC4Drop=e._createHelper(o)}(),bt.mode.CTRGladman=(ot=bt.lib.BlockCipherMode.extend(),st=ot.Encryptor=ot.extend({processBlock:function(t,e){var r,i=this._cipher,n=i.blockSize,o=this._iv,s=this._counter;o&&(s=this._counter=o.slice(0),this._iv=void 0),0===((r=s)[0]=Et(r[0]))&&(r[1]=Et(r[1]));var c=s.slice(0);i.encryptBlock(c,0);for(var a=0;a<n;a++)t[e+a]^=c[a]}}),ot.Decryptor=st,ot),at=(ct=bt).lib.StreamCipher,ht=ct.algo,lt=[],ft=[],dt=[],ut=ht.Rabbit=at.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=0;r<4;r++)t[r]=16711935&(t[r]<<8|t[r]>>>24)|4278255360&(t[r]<<24|t[r]>>>8);var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]];for(r=this._b=0;r<4;r++)Rt.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;n[0]^=a,n[1]^=l,n[2]^=h,n[3]^=f,n[4]^=a,n[5]^=l,n[6]^=h,n[7]^=f;for(r=0;r<4;r++)Rt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Rt.call(this),lt[0]=r[0]^r[5]>>>16^r[3]<<16,lt[1]=r[2]^r[7]>>>16^r[5]<<16,lt[2]=r[4]^r[1]>>>16^r[7]<<16,lt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)lt[i]=16711935&(lt[i]<<8|lt[i]>>>24)|4278255360&(lt[i]<<24|lt[i]>>>8),t[e+i]^=lt[i]},blockSize:4,ivSize:2}),ct.Rabbit=at._createHelper(ut),bt.mode.CTR=(pt=bt.lib.BlockCipherMode.extend(),_t=pt.Encryptor=pt.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c<i;c++)t[e+c]^=s[c]}}),pt.Decryptor=_t,pt),yt=(vt=bt).lib.StreamCipher,gt=vt.algo,Bt=[],wt=[],kt=[],St=gt.RabbitLegacy=yt.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)Mt.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],c=o[1],a=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),h=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),l=a>>>16|4294901760&h,f=h<<16|65535&a;i[0]^=a,i[1]^=l,i[2]^=h,i[3]^=f,i[4]^=a,i[5]^=l,i[6]^=h,i[7]^=f;for(n=0;n<4;n++)Mt.call(this)}},_doProcessBlock:function(t,e){var r=this._X;Mt.call(this),Bt[0]=r[0]^r[5]>>>16^r[3]<<16,Bt[1]=r[2]^r[7]>>>16^r[5]<<16,Bt[2]=r[4]^r[1]>>>16^r[7]<<16,Bt[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)Bt[i]=16711935&(Bt[i]<<8|Bt[i]>>>24)|4278255360&(Bt[i]<<24|Bt[i]>>>8),t[e+i]^=Bt[i]},blockSize:4,ivSize:2}),vt.RabbitLegacy=yt._createHelper(St),bt.pad.ZeroPadding={pad:function(t,e){var r=4*e;t.clamp(),t.sigBytes+=r-(t.sigBytes%r||r)},unpad:function(t){var e=t.words,r=t.sigBytes-1;for(r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},bt});\n''';\n\n  static String getSign(String html, String rid) {\n    JsRuntime flutterJs = JsRuntime(\n      memoryLimit: 4 * 1024 * 1024,\n      maxStackSize: 64 * 1024,\n    );\n\n    flutterJs.eval(kCryptoJs);\n\n    var did = \"10000000000000000000000000001501\";\n    var time = (DateTime.now().millisecondsSinceEpoch / 1000).round();\n    flutterJs.eval(html);\n    var data = flutterJs.eval(\"ub98484234('$rid','$did','$time')\");\n    flutterJs.dispose();\n    return data;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/.gitignore",
    "content": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n\n.idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n*.swp\nprofile\n\nDerivedData/\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\nbuild/\n.android/\n.ios/\n.flutter-plugins\n.flutter-plugins-dependencies\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\npubspec.lock\ntars_flutter.iml\ntars_flutter_android.iml\n.metadata\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/CHANGELOG.md",
    "content": "## 0.1.0\n\n- add doc\n\n## 0.0.8\n\n- first commit\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2021, THE TARS FOUNDATION\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "simple_live_core/packages/tars_dart/README.md",
    "content": "# Readme\n\nFork from https://github.dev/brooklet/TarsFlutter\n\n- 修改为dart包\n- 增加tup2支持"
  },
  {
    "path": "simple_live_core/packages/tars_dart/analysis_options.yaml",
    "content": "include: package:lints/recommended.yaml\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_decode_exception.dart",
    "content": "class TarsDecodeException extends Error {\n  String message;\n  TarsDecodeException(this.message);\n  @override\n  String toString() {\n    return message;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_deep_copyable.dart",
    "content": "abstract class DeepCopyable {\n  Object deepCopy();\n}\n\nList<T> listDeepCopy<T>(List list) {\n  List<T> newList = List<T>.filled(0, list[0], growable: true);\n  for (var value in list) {\n    newList.add(value is Map\n        ? mapDeepCopy(value)\n        : value is List\n            ? listDeepCopy(value)\n            : value is Set\n                ? setDeepCopy(value)\n                : value is DeepCopyable\n                    ? value.deepCopy() as T\n                    : value);\n  }\n  return newList;\n}\n\nSet<T> setDeepCopy<T>(Set s) {\n  Set<T> newSet = <T>{};\n  for (var value in s) {\n    newSet.add(value is Map\n        ? mapDeepCopy(value)\n        : value is List\n            ? listDeepCopy(value)\n            : value is Set\n                ? setDeepCopy(value)\n                : value is DeepCopyable\n                    ? value.deepCopy() as T\n                    : value);\n  }\n  return newSet;\n}\n\nMap<K, V> mapDeepCopy<K, V>(Map<K, V> map) {\n  Map<K, V> newMap = <K, V>{};\n\n  map.forEach((key, value) {\n    newMap[key] = (value is Map\n        ? mapDeepCopy(value)\n        : value is List\n            ? listDeepCopy(value)\n            : value is Set\n                ? setDeepCopy(value)\n                : value is DeepCopyable\n                    ? value.deepCopy() as V\n                    : value) as V;\n  });\n\n  return newMap;\n}\n\nMap<K, List<V>> mapListDeepCopy<K, V>(Map<K, List<V>> map) {\n  Map<K, List<V>> newMap = <K, List<V>>{};\n  map.forEach((key, value) {\n    newMap[key] = listDeepCopy<V>(value);\n  });\n  return newMap;\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_displayer.dart",
    "content": "// ignore_for_file: non_constant_identifier_names\n\nimport 'dart:typed_data';\n\nimport './tars_encode_exception.dart';\nimport './tars_struct.dart';\n\nclass TarsDisplayer {\n  late StringBuffer sb;\n  int _level = 0;\n  TarsDisplayer(this.sb, {int level = 0}) {\n    _level = level;\n  }\n\n  void ps(String? fieldName) {\n    for (var i = 0; i < _level; ++i) {\n      sb.write('\\t');\n    }\n\n    if (fieldName != null) {\n      sb.write(fieldName);\n      sb.write(': ');\n    }\n  }\n\n  TarsDisplayer? display(dynamic value, String? fieldName) {\n    if (value is bool) {\n      return DisplayBool(value, fieldName);\n    }\n    if (value is int) {\n      return DisplayInt(value, fieldName);\n    }\n    if (value is double) {\n      return DisplayDouble(value, fieldName);\n    }\n    if (value is String) {\n      return DisplayString(value, fieldName);\n    }\n    if (value is Uint8List) {\n      return DisplayUint8List(value, fieldName);\n    }\n    if (value is List) {\n      return DisplayArray(value, fieldName);\n    }\n    if (value is Map) {\n      return DisplayMap(value, fieldName);\n    }\n    if (value is TarsStruct) {\n      return DisplayTarsStruct(value, fieldName);\n    }\n    throw TarsEncodeException('write object error: unsupport type.');\n  }\n\n  TarsDisplayer DisplayBool(bool b, String? fieldName) {\n    ps(fieldName);\n    sb.write(b ? 'T' : 'F');\n    sb.write('\\n');\n    return this;\n  }\n\n  TarsDisplayer DisplayInt(int n, String? fieldName) {\n    ps(fieldName);\n    sb.write(n);\n    sb.write('\\n');\n    return this;\n  }\n\n  TarsDisplayer DisplayDouble(double n, String? fieldName) {\n    ps(fieldName);\n    sb.write(n);\n    sb.write('\\n');\n    return this;\n  }\n\n  TarsDisplayer DisplayString(String? s, String? fieldName) {\n    ps(fieldName);\n    if (null == s) {\n      sb.write('null');\n      sb.write('\\n');\n    } else {\n      sb.write(s);\n      sb.write('\\n');\n    }\n\n    return this;\n  }\n\n  TarsDisplayer DisplayUint8List(Uint8List? v, String? fieldName) {\n    ps(fieldName);\n    if (null == v) {\n      sb.write('null');\n      sb.write('\\n');\n      return this;\n    }\n    if (v.isEmpty) {\n      sb.write(v.length);\n      sb.write(', []');\n      sb.write('\\n');\n      return this;\n    }\n    sb.write(v.length);\n    sb.write(', []');\n    sb.write('\\n');\n    var jd = TarsDisplayer(sb, level: _level + 1);\n    for (var o in v) {\n      jd.display(o, null);\n    }\n\n    display(']', null);\n    return this;\n  }\n\n  TarsDisplayer DisplayMap<K, V>(Map<K, V>? m, String? fieldName) {\n    ps(fieldName);\n    if (null == m) {\n      sb.write('null');\n      sb.write('\\n');\n      return this;\n    }\n    if (m.isEmpty) {\n      sb.write(m.length);\n      sb.write(', {}');\n      sb.write('\\n');\n      return this;\n    }\n    sb.write(m.length);\n    sb.write(', {');\n    sb.write('\\n');\n    var jd1 = TarsDisplayer(sb, level: _level + 1);\n    var jd = TarsDisplayer(sb, level: _level + 2);\n    for (var key in m.keys) {\n      jd1.display('(', null);\n      jd.display(key, null);\n      jd.display(m[key], null);\n      jd1.display(')', null);\n    }\n    display('}', null);\n    return this;\n  }\n\n  TarsDisplayer DisplayArray<T>(List<T>? v, String? fieldName) {\n    ps(fieldName);\n    if (null == v) {\n      sb.write('null');\n      sb.write('\\n');\n      return this;\n    }\n    if (v.isEmpty) {\n      sb.write(v.length);\n      sb.write(', []');\n      sb.write('\\n');\n      return this;\n    }\n    sb.write(v.length);\n    sb.write(', [');\n    sb.write('\\n');\n    var jd = TarsDisplayer(sb, level: _level + 1);\n    for (var o in v) {\n      jd.display(o, null);\n    }\n    display(']', null);\n    return this;\n  }\n\n  TarsDisplayer DisplayList<T>(List<T>? v, String? fieldName) {\n    if (null == v) {\n      ps(fieldName);\n      sb.write('null');\n      sb.write('\\n');\n      return this;\n    } else {\n      for (var item in v) {\n        display(item, fieldName);\n      }\n\n      return this;\n    }\n  }\n\n  TarsDisplayer DisplayTarsStruct(TarsStruct? v, String? fieldName) {\n    display('{', fieldName);\n    if (null == v) {\n      sb.write('\\t');\n      sb.write('null');\n    } else {\n      v.displayAsString(sb, _level + 1);\n    }\n\n    display('}', null);\n    return this;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_encode_exception.dart",
    "content": "class TarsEncodeException extends Error {\n  String message;\n  TarsEncodeException(this.message);\n\n  @override\n  String toString() {\n    return message;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_input_stream.dart",
    "content": "import 'dart:convert';\nimport 'dart:core';\nimport 'dart:typed_data';\n\nimport 'tars_struct.dart';\nimport 'tars_decode_exception.dart';\n\nclass HeadData {\n  int type = 0;\n  int tag = 0;\n\n  void clear() {\n    type = 0;\n    tag = 0;\n  }\n}\n\nclass BinaryReader {\n  Uint8List buffer;\n  int position = 0;\n\n  BinaryReader(this.buffer);\n\n  int get length => buffer.length;\n\n  /// 从当前流中读取下一个字节，并使流的当前位置提升 1 个字节\n  /// 返回下一个字节(0-255)\n  int read() {\n    var byte = buffer[position];\n    position += 1;\n    return byte;\n  }\n\n  /// 从当前流中读取指定长度的字节整数，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// len=1为int8,2为int16,4为int32,8为int64。dart中统一为int类型\n  /// 返回整数\n  int readInt(int len) {\n    var result = 0;\n    // if (len == 1) {\n    //   result = buffer[position];\n    //   position += len;\n    //   return result;\n    // }\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    var byteBuffer = bytes.buffer;\n    var data = ByteData.view(byteBuffer);\n    if (len == 1) {\n      result = data.getUint8(0);\n    }\n    if (len == 2) {\n      result = data.getInt16(0, Endian.big);\n    }\n    if (len == 4) {\n      result = data.getInt32(0, Endian.big);\n    }\n    if (len == 8) {\n      result = data.getInt64(0, Endian.big);\n    }\n    position += len;\n    return result;\n  }\n\n  /// 从当前流中读取指定长度的字节数组，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// 返回字节数组\n  Uint8List readBytes(int len) {\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    position += len;\n    return bytes;\n  }\n\n  /// 从当前流中读取指定长度的字节浮点数，并使流的当前位置提升指定长度。\n  /// [len] 指定长度\n  /// len=4为float,8为double。dart中统一为double类型\n  /// 返回浮点数\n  double readFloat(int len) {\n    var result = 0.0;\n    var bytes =\n        Uint8List.fromList(buffer.getRange(position, position + len).toList());\n    var byteBuffer = bytes.buffer;\n    var data = ByteData.view(byteBuffer);\n    if (len == 4) {\n      result = data.getFloat32(0, Endian.big);\n    }\n    if (len == 8) {\n      result = data.getFloat64(0, Endian.big);\n    }\n    position += len;\n    return result;\n  }\n}\n\nclass TarsInputStream {\n  late BinaryReader br;\n\n  TarsInputStream(Uint8List? bytes, {int pos = 0}) {\n    if (bytes != null) {\n      br = BinaryReader(bytes);\n      br.position = pos;\n    }\n  }\n\n  void wrap(Uint8List bytes, {int pos = 0}) {\n    br = BinaryReader(bytes);\n    br.position = pos;\n  }\n\n  static int readBinaryReaderHead(HeadData hd, BinaryReader bb) {\n    if (bb.position >= bb.length) {\n      throw TarsDecodeException('read file to end');\n    }\n    var b = bb.read();\n    hd.type = (b & 15);\n    hd.tag = ((b & (15 << 4)) >> 4);\n    if (hd.tag == 15) {\n      hd.tag = bb.read();\n      return 2;\n    }\n    return 1;\n  }\n\n  int readHead(HeadData hd) {\n    return readBinaryReaderHead(hd, br);\n  }\n\n  int peakHead(HeadData hd) {\n    var curPos = br.position;\n    var len = readHead(hd);\n    br.position = curPos;\n    return len;\n  }\n\n  void skip(int len) {\n    br.position += len;\n  }\n\n  bool skipToTag(int tag) {\n    try {\n      var hd = HeadData();\n      while (true) {\n        var len = peakHead(hd);\n        if (tag <= hd.tag || hd.type == TarsStructType.STRUCT_END.index) {\n          return tag == hd.tag;\n        }\n\n        skip(len);\n        skipFieldWithType(hd.type);\n      }\n    } catch (e) {\n      if (e is TarsDecodeException) {\n        print(e);\n      }\n      print(e);\n    }\n    return false;\n  }\n\n  // 跳到当前结构的结束位置\n  void skipToStructEnd() {\n    var hd = HeadData();\n    do {\n      readHead(hd);\n      skipFieldWithType(hd.type);\n    } while (hd.type != TarsStructType.STRUCT_END.index);\n  }\n\n  // 跳过一个字段\n  void skipField() {\n    var hd = HeadData();\n    readHead(hd);\n    skipFieldWithType(hd.type);\n  }\n\n  void skipFieldWithType(int type) {\n    var t = TarsStructType.values[type];\n    switch (t) {\n      case TarsStructType.BYTE:\n        skip(1);\n        break;\n      case TarsStructType.SHORT:\n        skip(2);\n        break;\n      case TarsStructType.INT:\n        skip(4);\n        break;\n      case TarsStructType.LONG:\n        skip(8);\n        break;\n      case TarsStructType.FLOAT:\n        skip(4);\n        break;\n      case TarsStructType.DOUBLE:\n        skip(8);\n        break;\n      case TarsStructType.STRING1:\n        {\n          var len = br.read();\n          if (len < 0) {\n            len += 256;\n          }\n          skip(len);\n          break;\n        }\n      case TarsStructType.STRING4:\n        {\n          skip(br.readInt(4));\n          break;\n        }\n      case TarsStructType.MAP:\n        {\n          var size = readInt(0, true);\n          for (var i = 0; i < size * 2; ++i) {\n            skipField();\n          }\n          break;\n        }\n      case TarsStructType.LIST:\n        {\n          var size = readInt(0, true);\n          for (var i = 0; i < size; ++i) {\n            skipField();\n          }\n          break;\n        }\n      case TarsStructType.SIMPLE_LIST:\n        {\n          var hd = HeadData();\n          readHead(hd);\n          if (hd.type != TarsStructType.BYTE.index) {\n            throw TarsDecodeException(\n                'skipField with invalid type, type value: $type,${hd.type}');\n          }\n          var size = readInt(0, true);\n          skip(size);\n          break;\n        }\n      case TarsStructType.STRUCT_BEGIN:\n        skipToStructEnd();\n        break;\n      case TarsStructType.STRUCT_END:\n      case TarsStructType.ZERO_TAG:\n        break;\n    }\n  }\n\n  dynamic read<T>(dynamic data, int tag, bool isRequire) {\n    if (data is int || data == int) {\n      data = readInt(tag, isRequire);\n    } else if (data is double || data == double) {\n      data = readFloat(tag, isRequire);\n    } else if (data is bool || data == bool) {\n      data = readBool(tag, isRequire);\n    } else if (data is Uint8List || data == Uint8List) {\n      data = readBytes(tag, isRequire);\n    } else if (data is String || data == String) {\n      data = readString(tag, isRequire);\n    } else if (data is List || data == List) {\n      data = readList<T>(data, tag, isRequire);\n    } else if (data is Map || data == Map) {\n      data = readMap(data, tag, isRequire);\n    } else if (data is TarsStruct || data == TarsStruct) {\n      data = readTarsStruct(data, tag, isRequire);\n    } else {\n      throw TarsDecodeException('type:${data.runtimeType} not supported.');\n    }\n    return data;\n  }\n\n  /// 读取整数\n  /// 对应Tars类型：int1、int2、int4、int8\n  int readInt(int tag, bool isRequire) {\n    var n = 0;\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      switch (t) {\n        case TarsStructType.ZERO_TAG:\n          n = 0;\n          break;\n        case TarsStructType.BYTE:\n          n = br.readInt(1);\n          break;\n        case TarsStructType.SHORT:\n          n = br.readInt(2);\n          break;\n        case TarsStructType.INT:\n          n = br.readInt(4);\n          break;\n        case TarsStructType.LONG:\n          n = br.readInt(8);\n          break;\n        default:\n          throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return n;\n  }\n\n  /// 读取bool\n  /// 对应Tars类型：int1\n  bool readBool(int tag, bool isRequire) {\n    return readInt(tag, isRequire) != 0;\n  }\n\n  /// 读取单字char\n  /// 对应Tars类型：int\n  String readChar(int tag, bool isRequire) {\n    var char = readInt(tag, isRequire);\n    return String.fromCharCode(char);\n  }\n\n  /// 读取字符串\n  /// 对应Tars类型：string1、string4\n  String readString(int tag, bool isRequire) {\n    var n = '';\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      switch (t) {\n        case TarsStructType.STRING1:\n          n = _readString1();\n          break;\n        case TarsStructType.STRING4:\n          n = _readString4();\n          break;\n\n        default:\n          throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return n;\n  }\n\n  String _readString1() {\n    var len = 0;\n    len = br.readInt(1);\n    if (len < 0) {\n      len += 256;\n    }\n\n    var ss = br.readBytes(len);\n\n    return utf8.decode(ss);\n  }\n\n  String _readString4() {\n    var len = 0;\n    len = br.readInt(4);\n    if (len > TarsStruct.TARS_MAX_STRING_LENGTH || len < 0) {\n      throw TarsDecodeException('string too long: $len');\n    }\n\n    var ss = br.readBytes(len);\n\n    return utf8.decode(ss);\n  }\n\n  /// 读取浮点数\n  /// 对应Tars类型：double、float\n  double readFloat(int tag, bool isRequire) {\n    var n = 0.0;\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      switch (t) {\n        case TarsStructType.ZERO_TAG:\n          n = 0;\n          break;\n        case TarsStructType.FLOAT:\n          {\n            n = br.readFloat(4);\n          }\n          break;\n        case TarsStructType.DOUBLE:\n          {\n            n = br.readFloat(8);\n          }\n          break;\n        default:\n          throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return n;\n  }\n\n  /// 读取byte[]\n  /// 对应Tars类型：SimpleList\n  Uint8List readBytes(int tag, bool isRequire) {\n    var lr = Uint8List(0);\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      switch (t) {\n        case TarsStructType.SIMPLE_LIST:\n          {\n            var hh = HeadData();\n            readHead(hh);\n            if (hh.type != TarsStructType.BYTE.index) {\n              throw TarsDecodeException(\n                  'type mismatch, tag: $tag,type:${hd.type},${hh.type}');\n            }\n            var size = readInt(0, true);\n            if (size < 0) {\n              throw TarsDecodeException(\n                  'invalid size, tag: $tag, type: ${hd.type}, ${hh.type}  size:$size');\n            }\n\n            lr = Uint8List(size);\n            try {\n              lr = br.readBytes(size);\n            } catch (e) {\n              //QTrace.Trace(e.Message);\n              print(e);\n              return Uint8List(0);\n            }\n          }\n          break;\n        case TarsStructType.LIST:\n          {\n            var size = readInt(0, true);\n            if (size < 0) throw TarsDecodeException('size invalid: $size');\n            lr = Uint8List(size);\n            for (var i = 0; i < size; ++i) {\n              lr[i] = readInt(0, true);\n            }\n          }\n          break;\n        default:\n          throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return lr;\n  }\n\n  /// 读取Map\n  /// 需要指定键、值的类型\n  /// 对应Tars类型：Map\n  Map<K, V> readMap<K, V>(Map<K, V> data, int tag, bool isRequire) {\n    Iterable<MapEntry<K, V>> it = data.entries;\n    MapEntry<K, V> en = it.first;\n    K k = en.key;\n    V v = en.value;\n    Map<K, V> map = <K, V>{};\n\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      if (t == TarsStructType.MAP) {\n        var size = readInt(0, true);\n        if (size < 0) {\n          throw TarsDecodeException('size invalid:$size');\n        }\n        for (var i = 0; i < size; ++i) {\n          var mk = read(k, 0, true);\n          var mv = read(v, 1, true);\n          if (mk != null) {\n            if (map.containsKey(mk)) {\n              map[mk] = mv;\n            } else {\n              map.addAll({mk: mv});\n            }\n          }\n        }\n      } else {\n        throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return map;\n  }\n\n  /// 读取 k list<V> 结构 Map\n  /// 需要指定键、list值的类型\n  /// 对应Tars类型：Map\n  Map<K, List<V>> readMapList<K, V>(\n      Map<K, List<V>> source, int tag, bool isRequire) {\n    var map = <K, List<V>>{};\n    Iterable<MapEntry<K, List<V>>> it = source.entries;\n    MapEntry<K, List<V>> en = it.first;\n    K k = en.key;\n    List<V> v = en.value;\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      if (t == TarsStructType.MAP) {\n        var size = readInt(0, true);\n        if (size < 0) {\n          throw TarsDecodeException('size invalid:$size');\n        }\n        for (var i = 0; i < size; ++i) {\n          var mk = read<K>(k, 0, true);\n          var mv = read<V>(v, 1, true);\n          if (mk != null) {\n            if (map.containsKey(mk)) {\n              map[mk] = mv;\n            } else {\n              map.addAll({mk: mv});\n            }\n          }\n        }\n      } else {\n        throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return map;\n  }\n\n  /// 读取 k map<V2,V2> 结构 Map\n  /// 需要指定键、子Map键值的类型\n  /// 对应Tars类型：Map\n  Map<K, Map<K2, V2>> readMapMap<K, K2, V2>(\n      Map<K, Map<K2, V2>> source, int tag, bool isRequire) {\n    var map = <K, Map<K2, V2>>{};\n    Iterable<MapEntry<K, Map<K2, V2>>> it = source.entries;\n    MapEntry<K, Map<K2, V2>> en = it.first;\n    K k = en.key;\n    Map<K2, V2> v = en.value;\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      if (t == TarsStructType.MAP) {\n        var size = readInt(0, true);\n        if (size < 0) {\n          throw TarsDecodeException('size invalid:$size');\n        }\n        for (var i = 0; i < size; ++i) {\n          var mk = read<K>(k, 0, true);\n          var mv = readMap<K2, V2>(v, 1, true);\n          if (mk != null) {\n            if (map.containsKey(mk)) {\n              map[mk] = mv;\n            } else {\n              map.addAll({mk: mv});\n            }\n          }\n        }\n      } else {\n        throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return map;\n  }\n\n  /// 读取列表\n  /// 对应Tars类型：List\n  List<T> readList<T>(dynamic data, int tag, bool isRequire) {\n    var ls = <T>[];\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      switch (t) {\n        case TarsStructType.LIST:\n          {\n            var size = readInt(0, true);\n            if (size < 0) throw TarsDecodeException('size invalid: $size');\n            ls = <T>[];\n            for (var i = 0; i < size; ++i) {\n              ls.add(read(data[0], 0, true));\n            }\n          }\n          break;\n        default:\n          throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return ls;\n  }\n\n  /// 读取自定义结构\n  /// 对应Tars类型：TarsStruct\n  TarsStruct readTarsStruct(TarsStruct ts, int tag, bool isRequire) {\n    if (skipToTag(tag)) {\n      var hd = HeadData();\n      readHead(hd);\n      var t = TarsStructType.values[hd.type];\n      if (t == TarsStructType.STRUCT_BEGIN) {\n        var copyTs = ts.deepCopy() as TarsStruct;\n        copyTs.readFrom(this);\n        skipToStructEnd();\n        return copyTs;\n      } else {\n        throw TarsDecodeException('type mismatch.');\n      }\n    } else if (isRequire) {\n      throw TarsDecodeException('require field not exist.');\n    }\n    return ts;\n  }\n\n  String sServerEncoding = \"UTF-8\";\n\n  int setServerEncoding(String se) {\n    sServerEncoding = se;\n    return 0;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_output_stream.dart",
    "content": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport './tars_encode_exception.dart';\nimport './tars_struct.dart';\n\nclass BinaryWriter {\n  List<int> buffer;\n  int position = 0;\n\n  BinaryWriter(this.buffer);\n\n  int get length => buffer.length;\n\n  void writeBytes(Uint8List list) {\n    buffer.addAll(list);\n    position += list.length;\n  }\n\n  void writeInt(int value, int len) {\n    var b = Uint8List(len).buffer;\n    var bytes = ByteData.view(b);\n    if (len == 1) {\n      //写入byte\n      bytes.setUint8(0, value.toUnsigned(8));\n    }\n    if (len == 2) {\n      bytes.setInt16(0, value, Endian.big);\n    }\n    if (len == 4) {\n      bytes.setInt32(0, value, Endian.big);\n    }\n    if (len == 8) {\n      bytes.setInt64(0, value, Endian.big);\n    }\n\n    buffer.addAll(bytes.buffer.asUint8List());\n    position += len;\n  }\n\n  void writeDouble(double value, int len) {\n    var b = Uint8List(len).buffer;\n    var bytes = ByteData.view(b);\n\n    if (len == 4) {\n      bytes.setFloat32(0, value, Endian.big);\n    }\n    if (len == 8) {\n      bytes.setFloat64(0, value, Endian.big);\n    }\n\n    buffer.addAll(bytes.buffer.asUint8List());\n    position += len;\n  }\n}\n\nclass TarsOutputStream {\n  late BinaryWriter bw;\n\n  TarsOutputStream({Uint8List? ls}) {\n    if (ls != null) {\n      bw = BinaryWriter(ls);\n    } else {\n      bw = BinaryWriter([]);\n    }\n  }\n\n  void writeHead(int type, int tag) {\n    if (tag < 15) {\n      var b = ((tag << 4) | type);\n      try {\n        bw.writeInt(b, 1);\n      } catch (e) {\n        print(e.toString());\n      }\n    } else if (tag < 256) {\n      try {\n        var b = ((15 << 4) | type);\n        {\n          bw.writeInt(b, 1);\n          bw.writeInt(tag, 1);\n        }\n      } catch (e) {\n        print('${toString()} writeHead: $e');\n      }\n    } else {\n      throw TarsEncodeException('tag is too large: $tag');\n    }\n  }\n\n  void write(dynamic data, int tag) {\n    if (data is int || data == int) {\n      writeInt(data, tag);\n    } else if (data is double || data == double) {\n      writeDouble(data, tag);\n    } else if (data is bool || data == bool) {\n      writeBool(data, tag);\n    } else if (data is Uint8List || data == Uint8List) {\n      writeUint8List(data, tag);\n    } else if (data is String || data == String) {\n      writeString(data, tag);\n    } else if (data is List || data == List) {\n      writeList(data, tag);\n    } else if (data is Map || data == Map) {\n      writeMap(data, tag);\n    } else if (data is TarsStruct || data == TarsStruct) {\n      writeTarsStruct(data, tag);\n    } else {\n      throw TarsEncodeException('type:${data.runtimeType} not supported.');\n    }\n  }\n\n  /// 写入bool\n  /// 对应Tars类型：int1\n  void writeBool(bool b, int tag) {\n    writeByte(b ? 1 : 0, tag);\n  }\n\n  /// 写入字节\n  /// 对应Tars类型：int1\n  void writeByte(int b, int tag) {\n    //紧跟1个字节整型数据\n    if (b == 0) {\n      writeHead(TarsStructType.ZERO_TAG.index, tag);\n    } else {\n      writeHead(TarsStructType.BYTE.index, tag);\n      try {\n        bw.writeInt(b, 1);\n      } catch (e) {\n        print(e);\n      }\n    }\n  }\n\n  /// 写入整数型\n  /// 对应Tars类型：int1、int2、int4、int8\n  void writeInt(int n, int tag) {\n    //写入byte\n    //紧跟1个字节整型数据\n    if (n >= -128 && n <= 127) {\n      writeByte(n, tag);\n      return;\n    }\n    //int16\n    //紧跟2个字节整型数据\n    if (n >= -32768 && n <= 32767) {\n      writeHead(TarsStructType.SHORT.index, tag);\n      bw.writeInt(n, 2);\n      return;\n    }\n    //int32\n    //紧跟4个字节整型数据\n    if (n >= -2147483648 && n <= 2147483647) {\n      writeHead(TarsStructType.INT.index, tag);\n      bw.writeInt(n, 4);\n      return;\n    }\n    //int64\n    //紧跟8个字节整型数据\n    if (n >= -9223372036854775808 && n <= 9223372036854775807) {\n      writeHead(TarsStructType.LONG.index, tag);\n      bw.writeInt(n, 8);\n      return;\n    }\n  }\n\n  /// 写入浮点数\n  /// 对应Tars类型：float\n  void writeFloat(double n, int tag) {\n    //紧跟4个字节浮点型数据\n    writeHead(TarsStructType.FLOAT.index, tag);\n    bw.writeDouble(n, 4);\n  }\n\n  /// 写入双精度浮点数(Double)\n  /// 对应Tars类型：double\n  void writeDouble(double n, int tag) {\n    //紧跟8个字节浮点型数据\n    writeHead(TarsStructType.DOUBLE.index, tag);\n    bw.writeDouble(n, 8);\n  }\n\n  /// 写入字符串\n  /// 对应Tars类型：string1、string4\n  void writeString(String s, int tag) {\n    //string1:紧跟1个字节长度，再跟内容\n    //string4:紧跟4个字节长度，再跟内容\n    var bytes = utf8.encode(s);\n    if (bytes.isEmpty) {\n      writeHead(TarsStructType.STRING1.index, tag);\n      bw.writeInt(0, 1);\n      return;\n    }\n    if (bytes.length > 255) {\n      writeHead(TarsStructType.STRING4.index, tag);\n      bw.writeInt(bytes.length, 4);\n      bw.writeBytes(Uint8List.fromList(bytes));\n    } else {\n      writeHead(TarsStructType.STRING1.index, tag);\n      bw.writeInt(bytes.length, 1);\n      bw.writeBytes(Uint8List.fromList(bytes));\n    }\n  }\n\n  /// 写入byte[]\n  /// 对应Tars类型：SimpleList\n  void writeUint8List(Uint8List ls, int tag) {\n    //简单列表（目前用在byte数组），紧跟一个类型字段（目前只支持byte），紧跟一个整型数据表示长度，再跟byte数据\n    writeHead(TarsStructType.SIMPLE_LIST.index, tag);\n    writeHead(TarsStructType.BYTE.index, 0);\n    writeInt(ls.length, 0);\n    bw.writeBytes(ls);\n  }\n\n  /// 写入Map\n  /// 对应Tars类型：Map\n  void writeMap<K, V>(Map<K, V> map, int tag) {\n    //紧跟一个整型数据表示Map的大小，再跟[key, value]对列表\n    writeHead(TarsStructType.MAP.index, tag);\n    writeInt(map.length, 0);\n    for (var item in map.keys) {\n      write(item, 0);\n      write(map[item], 1);\n    }\n  }\n\n  /// 写入列表\n  /// 对应Tars类型：List\n  void writeList(List ls, int tag) {\n    //紧跟一个整型数据表示List的大小，再跟元素列表\n    writeHead(TarsStructType.LIST.index, tag);\n    write(ls.length, 0);\n    for (var item in ls) {\n      write(item, 0);\n    }\n  }\n\n  /// 写入自定义结构\n  /// 对应Tars类型：TarsStruct\n  void writeTarsStruct(TarsStruct o, int tag) {\n    writeHead(TarsStructType.STRUCT_BEGIN.index, tag);\n    o.writeTo(this);\n    writeHead(TarsStructType.STRUCT_END.index, 0);\n  }\n\n  Uint8List toUint8List() {\n    return Uint8List.fromList(bw.buffer);\n  }\n\n  String sServerEncoding = \"UTF-8\";\n\n  int setServerEncoding(String se) {\n    sServerEncoding = se;\n    return 0;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/codec/tars_struct.dart",
    "content": "// ignore_for_file: non_constant_identifier_names, constant_identifier_names, no_leading_underscores_for_local_identifiers\n\nimport 'dart:typed_data';\n\nimport './tars_input_stream.dart';\nimport './tars_output_stream.dart';\nimport './tars_deep_copyable.dart';\n\nenum TarsStructType {\n  BYTE,\n  SHORT,\n  INT,\n  LONG,\n  FLOAT,\n  DOUBLE,\n  STRING1,\n  STRING4,\n  MAP,\n  LIST,\n  STRUCT_BEGIN,\n  STRUCT_END,\n  ZERO_TAG,\n  SIMPLE_LIST,\n}\n\nabstract class TarsStruct extends DeepCopyable {\n  static int TARS_MAX_STRING_LENGTH = 100 * 1024 * 1024;\n  void writeTo(TarsOutputStream _os);\n  void readFrom(TarsInputStream _is);\n  void displayAsString(StringBuffer sb, int level);\n\n  Uint8List toByteArray() {\n    TarsOutputStream os = TarsOutputStream();\n    writeTo(os);\n    return os.toUint8List();\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/net/base_tars_http.dart",
    "content": "import 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:dio/dio.dart';\nimport 'package:logger/logger.dart';\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/tup/const.dart';\nimport 'package:tars_dart/tars/tup/tars_uni_packet.dart';\nimport 'package:tars_dart/tars/tup/tup_response.dart';\nimport 'package:tars_dart/tars/tup/tup_result_exception.dart';\n\n//tup网络请求封装\n//注意:只支持 PACKET_TYPE_TUP3 = 3 类型的封包\nclass BaseTarsHttp {\n  final String baseUrl;\n  final String path;\n  final String servantName;\n  final Map<String, String> headers;\n\n  var timeOut = 60000;\n  var debugLog = false;\n  late final Dio dio;\n  final logger = Logger();\n\n  BaseTarsHttp(\n    this.baseUrl,\n    this.servantName, {\n    this.path = \"\",\n    this.timeOut = 60000,\n    this.debugLog = false,\n    this.headers = const {},\n  }) {\n    dio = Dio(BaseOptions(\n        connectTimeout: Duration(seconds: timeOut),\n        baseUrl: baseUrl,\n        responseType: ResponseType.bytes,\n        headers: {\n          HttpHeaders.contentTypeHeader: \"application/x-wup\",\n          ...headers\n        }));\n    if (debugLog) {\n      dio.interceptors.add(LogInterceptor(responseBody: false)); //开启请求日志\n    }\n  }\n\n  //发送http请求,不返回状态码,异常状态码直接抛出异常TupResultException\n  Future<RSP> tupRequest<REQ, RSP>(\n      String methodName, REQ tReq, RSP tRsp) async {\n    TupResponse<RSP> response =\n        await tupRequestWithRspCode(methodName, tReq, tRsp);\n    if (response.code == 0) {\n      return response.response!;\n    } else {\n      logger.e(\"tupDecode decode error:${response.code}\");\n      throw TupResultException(response.code);\n    }\n  }\n\n  //发送http请求,返回状态码及response\n  Future<TupResponse<RSP>> tupRequestWithRspCode<REQ, RSP>(\n      String methodName, REQ tReq, RSP tRsp) async {\n    final data = buildRequest(methodName, tReq);\n    dio.options.headers[HttpHeaders.contentLengthHeader] = data.lengthInBytes;\n    logger.d(\"send tupRequest, methodName:$methodName\");\n    final result = await dio.post<List<int>>(\n      path,\n      data: Stream.fromIterable(data.map((e) => [e])),\n    );\n    final value = result.data;\n    return tupResponseDecode(methodName, value!, tRsp);\n  }\n\n  //发送无response http请求,返回状态码\n  Future<TupResponse<void>> tupRequestWithRspCodeNoRsp<REQ>(\n      String methodName, REQ tReq) async {\n    final data = buildRequest(methodName, tReq);\n    dio.options.headers[HttpHeaders.contentLengthHeader] = data.lengthInBytes;\n    logger.d(\"send tupRequestNoRsp, methodName:$methodName\");\n    final result = await dio.post<List<int>>(\n      path,\n      data: Stream.fromIterable(data.map((e) => [e])),\n    );\n    final value = result.data;\n    return tupEmptyResponseDecode(methodName, value!);\n  }\n\n  //发送无response http请求,不返回状态码,异常状态码直接抛出异常TupResultException\n  Future<void> tupRequestNoRsp<REQ>(String methodName, REQ tReq) async {\n    TupResponse<void> response =\n        await tupRequestWithRspCodeNoRsp(methodName, tReq);\n    if (response.code == 0) {\n      return;\n    } else {\n      logger.e(\"tupDecode decode error:${response.code}\");\n      throw TupResultException(response.code);\n    }\n  }\n\n  //封包\n  Uint8List buildRequest<REQ>(String methodName, REQ tReq) {\n    TarsUniPacket encodePack = TarsUniPacket();\n    encodePack.requestId = 0;\n    encodePack.setTarsVersion(Const.PACKET_TYPE_TUP3);\n    encodePack.setTarsPacketType(Const.PACKET_TYPE_TARSNORMAL);\n    encodePack.servantName = servantName;\n    encodePack.funcName = methodName;\n    encodePack.put(\"tReq\", tReq);\n    Uint8List bytes = encodePack.encode();\n    return bytes;\n  }\n\n  //有response解包\n  TupResponse<RSP> tupResponseDecode<RSP>(\n      String methodName, List<int> list, RSP tRsp) {\n    var bytes = Uint8List.fromList(list);\n    BinaryReader br = BinaryReader(bytes);\n    int size = br.readInt(4);\n    logger.d(\"size:$size\");\n    TarsUniPacket respPack = TarsUniPacket();\n    respPack.decode(bytes);\n    var code = respPack.get(\"\", 0);\n    logger.d(\"get tupRequest response, methodName:$methodName, code:$code\");\n    RSP rsp = respPack.get<RSP>(\"tRsp\", tRsp);\n    return TupResponse<RSP>(code: code, response: rsp);\n  }\n\n  //无response解包\n  TupResponse<void> tupEmptyResponseDecode(String methodName, List<int> list) {\n    var bytes = Uint8List.fromList(list);\n    BinaryReader br = BinaryReader(bytes);\n    int size = br.readInt(4);\n    logger.d(\"size:$size\");\n    TarsUniPacket respPack = TarsUniPacket();\n    respPack.decode(bytes);\n    var code = respPack.get(\"\", 0);\n    logger.d(\"get tupRequest response, methodName:$methodName, code:$code\");\n    return TupResponse<void>(code: code);\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/basic_class_type_util.dart",
    "content": "class BasicClassTypeUtil {\n  static String dart2UniType(String type, dynamic obj) {\n    if (type == 'String') {\n      return 'string';\n    }\n    if (type.contains('List')) {\n      return 'list';\n    }\n    if (type.contains('Map')) {\n      return 'map';\n    }\n    if (type == 'bool') {\n      return 'bool';\n    }\n    // 如果是int,需要检查short/ushort/int32/uint32\n    if (type == 'int') {\n      if (obj is int) {\n        if (obj >= -32768 && obj <= 32767) {\n          return 'short';\n        }\n        if (obj >= 0 && obj <= 65535) {\n          return 'ushort';\n        }\n        if (obj >= -2147483648 && obj <= 2147483647) {\n          return 'int32';\n        }\n        if (obj >= 0 && obj <= 4294967295) {\n          return 'uint32';\n        }\n      } else {\n        return 'int32';\n      }\n    }\n    // 检查int64/uint64\n    if (type == BigInt.one.runtimeType.toString()) {\n      if (obj is BigInt) {\n        if (obj >= BigInt.from(-9223372036854775808) &&\n            obj <= BigInt.from(9223372036854775807)) {\n          return 'int64';\n        }\n        if (obj >= BigInt.zero && obj <= BigInt.parse('18446744073709551615')) {\n          return 'uint64';\n        }\n      }\n      return 'int64';\n    }\n\n    if (type == 'double') {\n      return 'double';\n    }\n\n    return type;\n  }\n\n  /// 将嵌套的类型转成字符串\n  static String transTypeList(List<String> listType) {\n    var sb = StringBuffer();\n\n    for (var i = 0; i < listType.length; i++) {\n      listType[i] = dart2UniType(listType[i], null);\n    }\n\n    listType = listType.reversed.toList();\n\n    for (var i = 0; i < listType.length; i++) {\n      var type = listType[i];\n\n      if (type == 'Null') {\n        continue;\n      }\n\n      if (type == 'list') {\n        listType[i - 1] = '<${listType[i - 1]}';\n        listType[0] = '${listType[0]}>';\n      } else if (type == 'map') {\n        listType[i - 1] = '<${listType[i - 1]},';\n        listType[0] = '${listType[0]}>';\n      } else if (type == 'Array') {\n        listType[i - 1] = '<${listType[i - 1]}';\n        listType[0] = '${listType[0]}>';\n      }\n    }\n    listType = listType.reversed.toList();\n\n    for (var s in listType) {\n      sb.write(s);\n    }\n    return sb.toString();\n  }\n\n  static Object? createObject(Type type) {\n    if (type == String) {\n      return '';\n    }\n    if (type == int) {\n      return 0;\n    }\n    if (type == double) {\n      return 0.0;\n    }\n    if (type == bool) {\n      return false;\n    }\n    if (type == BigInt) {\n      return BigInt.zero;\n    }\n    if (type == List) {\n      return <dynamic>[];\n    }\n    if (type == Map) {\n      return <dynamic, dynamic>{};\n    }\n    return null;\n  }\n\n  static T createObjectT<T>() {\n    if (T == String) {\n      return '' as T;\n    }\n    if (T == int) {\n      return 0 as T;\n    }\n    if (T == double) {\n      return 0.0 as T;\n    }\n    if (T == bool) {\n      return false as T;\n    }\n    if (T == BigInt) {\n      return BigInt.zero as T;\n    }\n    if (T == List) {\n      return <dynamic>[] as T;\n    }\n    if (T == Map) {\n      return <dynamic, dynamic>{} as T;\n    }\n    return null as T;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/const.dart",
    "content": "// ignore_for_file: non_constant_identifier_names\n\nclass Const {\n  static String STATUS_GRID_KEY = \"STATUS_GRID_KEY\";\n  static String STATUS_DYED_KEY = \"STATUS_DYED_KEY\";\n  static String STATUS_GRID_CODE = \"STATUS_GRID_CODE\";\n  static String STATUS_SAMPLE_KEY = \"STATUS_SAMPLE_KEY\";\n  static String STATUS_RESULT_CODE = \"STATUS_RESULT_CODE\";\n  static String STATUS_RESULT_DESC = \"STATUS_RESULT_DESC\";\n\n  static int INVALID_HASH_CODE = -1;\n  static int INVALID_GRID_CODE = -1;\n\n  static int PACKET_TYPE_TARSNORMAL = 0;\n  static int PACKET_TYPE_TARSONEWAY = 1;\n  static int PACKET_TYPE_TUP = 2;\n  static int PACKET_TYPE_TUP3 = 3;\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/object_create_exception.dart",
    "content": "class ObjectCreateException implements Exception {\n  // ignore: unused_field\n  late String _message;\n\n  ObjectCreateException(String message) {\n    _message = message;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/request_packet.dart",
    "content": "// ignore_for_file: non_constant_identifier_names, avoid_renaming_method_parameters, no_leading_underscores_for_local_identifiers\n\nimport 'dart:core';\nimport 'dart:typed_data';\nimport '/tars/codec/tars_input_stream.dart';\nimport '/tars/codec/tars_output_stream.dart';\nimport '/tars/codec/tars_struct.dart';\nimport '/tars/codec/tars_displayer.dart';\nimport '/tars/codec/tars_deep_copyable.dart';\n\nclass RequestPacket extends TarsStruct {\n  String className() {\n    return \"RequestPacket\";\n  }\n\n  int iVersion = 0;\n\n  int cPacketType = 0;\n\n  int iMessageType = 0;\n\n  int iRequestId = 0;\n\n  String sServantName = \"\";\n\n  String sFuncName = \"\";\n\n  Uint8List? sBuffer;\n\n  int iTimeout = 0;\n\n  Map<String, String>? context;\n\n  Map<String, String>? status;\n\n  RequestPacket(\n      {this.iVersion = 0,\n      this.cPacketType = 0,\n      this.iMessageType = 0,\n      this.iRequestId = 0,\n      this.sServantName = \"\",\n      this.sFuncName = \"\",\n      this.sBuffer,\n      this.iTimeout = 0,\n      this.context,\n      this.status});\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    _os.write(iVersion, 1);\n    _os.write(cPacketType, 2);\n    _os.write(iMessageType, 3);\n    _os.write(iRequestId, 4);\n    _os.write(sServantName, 5);\n    _os.write(sFuncName, 6);\n    _os.write(sBuffer, 7);\n    _os.write(iTimeout, 8);\n    _os.write(context, 9);\n    _os.write(status, 10);\n  }\n\n  static Uint8List cache_sBuffer = Uint8List.fromList([0x0]);\n  static Map<String, String> cache_context = {\"\": \"\"};\n  static Map<String, String> cache_status = {\"\": \"\"};\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    iVersion = _is.read<int>(iVersion, 1, false);\n    cPacketType = _is.read<int>(cPacketType, 2, false);\n    iMessageType = _is.read<int>(iMessageType, 3, false);\n    iRequestId = _is.read<int>(iRequestId, 4, false);\n    sServantName = _is.read<String>(sServantName, 5, false);\n    sFuncName = _is.read<String>(sFuncName, 6, false);\n    sBuffer = _is.read<int>(cache_sBuffer, 7, false);\n    iTimeout = _is.read<int>(iTimeout, 8, false);\n    context = _is.readMap<String, String>(cache_context, 9, false);\n    status = _is.readMap<String, String>(cache_status, 10, false);\n  }\n\n  @override\n  void displayAsString(StringBuffer _os, int _level) {\n    TarsDisplayer _ds = TarsDisplayer(_os, level: _level);\n    _ds.display(iVersion, \"iVersion\");\n    _ds.display(cPacketType, \"cPacketType\");\n    _ds.display(iMessageType, \"iMessageType\");\n    _ds.display(iRequestId, \"iRequestId\");\n    _ds.display(sServantName, \"sServantName\");\n    _ds.display(sFuncName, \"sFuncName\");\n    _ds.display(sBuffer, \"sBuffer\");\n    _ds.display(iTimeout, \"iTimeout\");\n    _ds.display(context, \"context\");\n    _ds.display(status, \"status\");\n  }\n\n  @override\n  Object deepCopy() {\n    var o = RequestPacket();\n    o.iVersion = iVersion;\n    o.cPacketType = cPacketType;\n    o.iMessageType = iMessageType;\n    o.iRequestId = iRequestId;\n    o.sServantName = sServantName;\n    o.sFuncName = sFuncName;\n    o.sBuffer = sBuffer;\n    o.iTimeout = iTimeout;\n    if (null != context) {\n      o.context = mapDeepCopy<String, String>(context!);\n    }\n    if (null != status) {\n      o.status = mapDeepCopy<String, String>(status!);\n    }\n    return o;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/tars_uni_packet.dart",
    "content": "import 'dart:typed_data';\nimport 'uni_packet.dart';\nimport 'const.dart';\n\nclass TarsUniPacket extends UniPacket {\n  TarsUniPacket() {\n    package.iVersion = Const.PACKET_TYPE_TUP3;\n    package.cPacketType = Const.PACKET_TYPE_TARSNORMAL;\n    package.iMessageType = 0;\n    package.iTimeout = 0;\n    package.sBuffer = Uint8List.fromList([0x0]);\n    package.context = <String, String>{};\n    package.status = <String, String>{};\n  }\n\n  /// 设置协议版本\n  void setTarsVersion(int version) {\n    setVersion(version);\n  }\n\n  /// 设置调用类型\n  void setTarsPacketType(int packetType) {\n    package.cPacketType = packetType;\n  }\n\n  /// 设置消息类型\n  void setTarsMessageType(int messageType) {\n    package.iMessageType = messageType;\n  }\n\n  /// 设置超时时间\n  void setTarsTimeout(int timeout) {\n    package.iTimeout = timeout;\n  }\n\n  /// 设置参数编码内容\n  void setTarsBuffer(Uint8List buffer) {\n    package.sBuffer = buffer;\n  }\n\n  /// 设置上下文\n  void setTarsContext(Map<String, String> context) {\n    package.context = context;\n  }\n\n  /// 设置特殊消息的状态值\n  void setTarsStatus(Map<String, String> status) {\n    package.status = status;\n  }\n\n  /// 获取协议版本\n  int getTarsVersion() {\n    return package.iVersion;\n  }\n\n  /// 获取调用类型\n  int getTarsPacketType() {\n    return package.cPacketType;\n  }\n\n  /// 获取消息类型\n  int getTarsMessageType() {\n    return package.iMessageType;\n  }\n\n  /// 获取超时时间\n  int getTarsTimeout() {\n    return package.iTimeout;\n  }\n\n  /// 获取参数编码后内容\n  Uint8List? getTarsBuffer() {\n    return package.sBuffer;\n  }\n\n  /// 获取上下文信息\n  Map<String, String>? getTarsContext() {\n    return package.context;\n  }\n\n  /// 获取特殊消息的状态值\n  Map<String, String>? getTarsStatus() {\n    return package.status;\n  }\n\n  /// 获取调用tars的返回值\n  int getTarsResultCode() {\n    int result = 0;\n    try {\n      String? rcode = package.status?[Const.STATUS_RESULT_CODE];\n      result = (rcode != null ? int.tryParse(rcode) : 0)!;\n    } catch (e) {\n      print('getTarsResultCode exception: $e');\n      return 0;\n    }\n    return result;\n  }\n\n  /// 获取调用tars的返回描述\n  String getTarsResultDesc() {\n    String? rdesc = package.status?[Const.STATUS_RESULT_DESC];\n    String result = rdesc ?? \"\";\n    return result;\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/tup_response.dart",
    "content": "class TupResponse<T> {\n  int code = 0;\n  T? response;\n\n  TupResponse({this.code = 0, this.response});\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/tup_result_exception.dart",
    "content": "class TupResultException implements Exception {\n  late int code;\n  late String? message;\n\n  TupResultException(this.code, {this.message});\n\n  @override\n  String toString() {\n    return '{code: $code, message: $message}';\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/uni_attribute.dart",
    "content": "// ignore_for_file: no_leading_underscores_for_local_identifiers\n\nimport 'dart:core';\nimport 'dart:typed_data';\n\nimport 'package:tars_dart/tars/tup/basic_class_type_util.dart';\n\nimport '/tars/codec/tars_input_stream.dart';\nimport '/tars/codec/tars_output_stream.dart';\nimport '/tars/codec/tars_struct.dart';\nimport 'const.dart';\nimport 'object_create_exception.dart';\n\nclass UniAttribute extends TarsStruct {\n  /// 精简版tup，PACKET_TYPE_TUP3类型\n  Map<String, Uint8List> newData = {};\n\n  //PACKET_TYPE_TUP类型\n  Map<String, Map<String, Uint8List>> oldData = {};\n\n  /// 存储get后的数据 避免多次解析\n  Map<String, Object> cachedData = <String, Object>{};\n\n  int version = Const.PACKET_TYPE_TUP;\n  String encodeName = 'UTF-8';\n\n  final TarsInputStream _is = TarsInputStream(null);\n\n  /// 清除缓存的解析过的数据\n  void clearCacheData() {\n    cachedData.clear();\n  }\n\n  bool isEmpty() {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      return newData.isEmpty;\n    } else {\n      return oldData.isEmpty;\n    }\n  }\n\n  int get length {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      return newData.length;\n    } else {\n      return oldData.length;\n    }\n  }\n\n  bool containsKey(String key) {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      return newData.containsKey(key);\n    } else {\n      return oldData.containsKey(key);\n    }\n  }\n\n  /// 放入一个元素\n  /// @param <T>\n  /// @param name\n  /// @param t\n  void put<T>(String name, T t) {\n    if (name.isEmpty) {\n      throw ArgumentError(\"put key can not is null\");\n    }\n    if (t == null) {\n      throw ArgumentError(\"put value can not is null\");\n    }\n\n    TarsOutputStream _out = TarsOutputStream();\n    _out.setServerEncoding(encodeName);\n    _out.write(t, 0);\n    Uint8List sBuffer = _out.toUint8List();\n\n    if (version == Const.PACKET_TYPE_TUP3) {\n      cachedData.remove(name);\n\n      if (newData.containsKey(name)) {\n        newData[name] = sBuffer;\n      } else {\n        newData[name] = sBuffer;\n      }\n    } else {\n      var listType = <String>[];\n      checkObjectType(listType, t);\n      var className = BasicClassTypeUtil.transTypeList(listType);\n\n      var pair = <String, Uint8List>{};\n      pair[className] = sBuffer;\n      cachedData.remove(name);\n      oldData[name] = pair;\n    }\n  }\n\n  void checkObjectType(List<String> listType, dynamic o) {\n    if (o == null) {\n      throw Exception('object is null');\n    }\n\n    if (o is List) {\n      listType.add('list');\n      if (o.isNotEmpty) {\n        checkObjectType(listType, o[0]);\n      } else {\n        listType.add('?');\n      }\n    } else if (o is Map) {\n      listType.add('map');\n      if (o.isNotEmpty) {\n        var key = o.keys.first;\n        listType.add(\n            BasicClassTypeUtil.dart2UniType(key.runtimeType.toString(), key));\n        checkObjectType(listType, o[key]);\n      } else {\n        listType.add('?');\n        listType.add('?');\n        // throw ArgumentError(\"map cannot be empty\");\n      }\n    } else if (o is Iterable) {\n      listType.add('list');\n      // 如果是Iterable但不是List，可以处理其他类型的集合\n      var iterator = o.iterator;\n      if (iterator.moveNext()) {\n        checkObjectType(listType, iterator.current);\n      } else {\n        listType.add('?');\n      }\n    } else {\n      listType\n          .add(BasicClassTypeUtil.dart2UniType(o.runtimeType.toString(), o));\n    }\n  }\n\n  Object decodeData(Uint8List data, Object? proxy) {\n    _is.wrap(data);\n    _is.setServerEncoding(encodeName);\n    Object o = _is.read(proxy, 0, true);\n    return o;\n  }\n\n  /// 获取tup精简版本编码的数据,兼容旧版本tup\n  /// @param <T>\n  /// @param name\n  /// @param proxy\n  /// @return\n  /// @throws ObjectCreateException\n  T getByClass<T>(String name, T proxy) {\n    Object? obj;\n    if (version == Const.PACKET_TYPE_TUP3) {\n      if (!newData.containsKey(name)) {\n        return obj as T;\n      } else if (cachedData.containsKey(name)) {\n        obj = cachedData[name];\n        return obj as T;\n      } else {\n        try {\n          Uint8List data = newData[name] as Uint8List;\n          Object o = decodeData(data, proxy!);\n          saveDataCache(name, o);\n          return o as T;\n        } catch (ex) {\n          throw ObjectCreateException(ex.toString());\n        }\n      }\n    } else {\n      //兼容tup2\n      return get2<T>(name);\n    }\n  }\n\n  // 获取一个元素,只能用于tup版本2，如果待获取的数据为tup3，则抛异常\n  T get2<T>(String name, {T? proxy}) {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      throw Exception('data is not in tup2 format');\n    }\n\n    if (cachedData.containsKey(name)) {\n      return cachedData[name] as T;\n    }\n\n    if (!oldData.containsKey(name)) {\n      return null as T;\n    }\n\n    var data = oldData[name]!;\n    var className = data.keys.first;\n    var sBuffer = data[className]!;\n    var o = decodeData(sBuffer, proxy);\n    saveDataCache(name, o);\n    return o as T;\n  }\n\n  /// 获取一个元素,tup新旧版本都兼容\n  /// @param Name\n  /// @param DefaultObj\n  /// @return\n  /// @throws ObjectCreateException\n  T get<T>(String name, T defaultObj) {\n    try {\n      Object? result;\n      if (version == Const.PACKET_TYPE_TUP3) {\n        result = getByClass<T>(name, defaultObj);\n      } else {\n        //tup2\n        return get2(name, proxy: defaultObj);\n      }\n      if (result == null) {\n        return defaultObj;\n      }\n      return result as T;\n    } catch (ex) {\n      return defaultObj;\n    }\n  }\n\n  void saveDataCache(String name, Object o) {\n    cachedData[name] = o;\n  }\n\n  Uint8List encode() {\n    TarsOutputStream _os = TarsOutputStream();\n    _os.setServerEncoding(encodeName);\n    if (version == Const.PACKET_TYPE_TUP3) {\n      _os.write(newData, 0);\n    } else {\n      _os.write(oldData, 0);\n    }\n    return _os.toUint8List();\n  }\n\n  void decode(Uint8List buffer, {int index = 0}) {\n    //try tup3\n    try {\n      _is.wrap(buffer, pos: index);\n      _is.setServerEncoding(encodeName);\n      version = Const.PACKET_TYPE_TUP;\n      oldData = _is.readMapMap<String, String, Uint8List>(oldData, 0, false);\n    } catch (ex) {\n      version = Const.PACKET_TYPE_TUP3;\n      _is.wrap(buffer, pos: index);\n      _is.setServerEncoding(encodeName);\n\n      newData = _is.readMap<String, Uint8List>({\n        \"\": Uint8List.fromList([0x0])\n      }, 0, false);\n    }\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      _os.write(newData, 0);\n    } else {\n      _os.write(oldData, 0);\n    }\n  }\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    if (version == Const.PACKET_TYPE_TUP3) {\n      newData = {\n        \"\": Uint8List.fromList([0x0])\n      };\n      _is.readMap<String, Uint8List>(newData, 0, false);\n    } else {\n      oldData = _is.readMapMap<String, String, Uint8List>(oldData, 0, false);\n    }\n  }\n\n  @override\n  Object deepCopy() {\n    throw UnimplementedError();\n  }\n\n  @override\n  void displayAsString(StringBuffer sb, int level) {\n    throw UnimplementedError();\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/uni_packet.dart",
    "content": "// ignore_for_file: no_leading_underscores_for_local_identifiers\n\nimport 'package:tars_dart/tars/codec/tars_input_stream.dart';\nimport 'package:tars_dart/tars/codec/tars_output_stream.dart';\nimport 'package:tars_dart/tars/tup/write_buffer.dart';\n\nimport 'const.dart';\nimport 'request_packet.dart';\nimport 'uni_attribute.dart';\n\nclass UniPacket extends UniAttribute {\n  static const int kUniPacketHeadSize = 4;\n\n  RequestPacket package = RequestPacket();\n\n  /// 获取请求的service名字\n  ///\n  /// @return\n  String get servantName {\n    return package.sServantName;\n  }\n\n  set servantName(String value) {\n    package.sServantName = value;\n  }\n\n  /// 获取请求的函数名字\n  ///\n  /// @return\n  String get funcName {\n    return package.sFuncName;\n  }\n\n  set funcName(String value) {\n    package.sFuncName = value;\n  }\n\n  /// 获取消息序列号\n  ///\n  /// @return\n  int get requestId {\n    return package.iRequestId;\n  }\n\n  set requestId(int value) {\n    package.iRequestId = value;\n  }\n\n  UniPacket() {\n    package.iVersion = Const.PACKET_TYPE_TUP3;\n  }\n\n  void setVersion(int iVer) {\n    version = iVer;\n    package.iVersion = iVer;\n  }\n\n  int getVersion() {\n    return package.iVersion;\n  }\n\n  /// 将put的对象进行编码\n  @override\n  Uint8List encode() {\n    if (package.sServantName.compareTo(\"\") == 0) {\n      throw ArgumentError(\"servantName can not is null\");\n    }\n    if (package.sFuncName.compareTo(\"\") == 0) {\n      throw ArgumentError(\"funcName can not is null\");\n    }\n\n    TarsOutputStream _os = TarsOutputStream();\n    _os.setServerEncoding(encodeName);\n    if (package.iVersion == Const.PACKET_TYPE_TUP) {\n      throw UnimplementedError();\n    } else {\n      _os.write(newData, 0);\n    }\n\n    package.sBuffer = _os.toUint8List();\n\n    _os = TarsOutputStream();\n    _os.setServerEncoding(encodeName);\n    writeTo(_os);\n    Uint8List body = _os.toUint8List();\n    int size = body.lengthInBytes;\n\n    final WriteBuffer buffer = WriteBuffer();\n    buffer.putInt32(size + kUniPacketHeadSize, endian: Endian.big);\n    buffer.putUint8List(body);\n    return buffer.done().buffer.asUint8List();\n  }\n\n  /// 对传入的数据进行解码 填充可get的对象\n  @override\n  void decode(Uint8List buffer, {int index = 0}) {\n    if (buffer.lengthInBytes < kUniPacketHeadSize) {\n      throw ArgumentError(\"Decode namespace must include size head\");\n    }\n    try {\n      TarsInputStream _is =\n          TarsInputStream(buffer, pos: kUniPacketHeadSize + index);\n      _is.setServerEncoding(encodeName);\n      //解码出RequestPacket包\n      readFrom(_is);\n\n      //设置tup版本\n      version = package.iVersion;\n\n      _is = TarsInputStream(package.sBuffer);\n      _is.setServerEncoding(encodeName);\n\n      if (package.iVersion == Const.PACKET_TYPE_TUP) {\n        oldData = _is.readMapMap<String, String, Uint8List>(\n            <String, Map<String, Uint8List>>{\n              \"\": {\n                \"\": Uint8List.fromList([0x0])\n              }\n            },\n            0,\n            false);\n      } else {\n        newData = _is.readMap<String, Uint8List>({\n          \"\": Uint8List.fromList([0x0])\n        }, 0, false);\n      }\n    } catch (e) {\n      print('decode exception: $e');\n      rethrow;\n    }\n  }\n\n  @override\n  void writeTo(TarsOutputStream _os) {\n    package.writeTo(_os);\n  }\n\n  @override\n  void readFrom(TarsInputStream _is) {\n    package.readFrom(_is);\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/lib/tars/tup/write_buffer.dart",
    "content": "// Copyright 2014 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.\nimport 'dart:math' as math;\nimport 'dart:typed_data';\nexport 'dart:typed_data'\n    show\n        ByteData,\n        Endian,\n        Float32List,\n        Float64List,\n        Int32List,\n        Int64List,\n        Uint8List;\n\n/// Write-only buffer for incrementally building a [ByteData] instance.\n///\n/// A WriteBuffer instance can be used only once. Attempts to reuse will result\n/// in [StateError]s being thrown.\n///\n/// The byte order used is [Endian.host] throughout.\nclass WriteBuffer {\n  /// Creates an interface for incrementally building a [ByteData] instance.\n  /// [startCapacity] determines the start size of the [WriteBuffer] in bytes.\n  /// The closer that value is to the real size used, the better the\n  /// performance.\n  factory WriteBuffer({int startCapacity = 8}) {\n    assert(startCapacity > 0);\n    final ByteData eightBytes = ByteData(8);\n    final Uint8List eightBytesAsList = eightBytes.buffer.asUint8List();\n    return WriteBuffer._(\n        Uint8List(startCapacity), eightBytes, eightBytesAsList);\n  }\n  WriteBuffer._(this._buffer, this._eightBytes, this._eightBytesAsList);\n  Uint8List _buffer;\n  int _currentSize = 0;\n  bool _isDone = false;\n  final ByteData _eightBytes;\n  final Uint8List _eightBytesAsList;\n  static final Uint8List _zeroBuffer = Uint8List(8);\n  void _add(int byte) {\n    if (_currentSize == _buffer.length) {\n      _resize();\n    }\n    _buffer[_currentSize] = byte;\n    _currentSize += 1;\n  }\n\n  void _append(Uint8List other) {\n    final int newSize = _currentSize + other.length;\n    if (newSize >= _buffer.length) {\n      _resize(newSize);\n    }\n    _buffer.setRange(_currentSize, newSize, other);\n    _currentSize += other.length;\n  }\n\n  void _addAll(Uint8List data, [int start = 0, int? end]) {\n    final int newEnd = end ?? _eightBytesAsList.length;\n    final int newSize = _currentSize + (newEnd - start);\n    if (newSize >= _buffer.length) {\n      _resize(newSize);\n    }\n    _buffer.setRange(_currentSize, newSize, data);\n    _currentSize = newSize;\n  }\n\n  void _resize([int? requiredLength]) {\n    final int doubleLength = _buffer.length * 2;\n    final int newLength = math.max(requiredLength ?? 0, doubleLength);\n    final Uint8List newBuffer = Uint8List(newLength);\n    newBuffer.setRange(0, _buffer.length, _buffer);\n    _buffer = newBuffer;\n  }\n\n  /// Write a Uint8 into the buffer.\n  void putUint8(int byte) {\n    assert(!_isDone);\n    _add(byte);\n  }\n\n  /// Write a Uint16 into the buffer.\n  void putUint16(int value, {Endian? endian}) {\n    assert(!_isDone);\n    _eightBytes.setUint16(0, value, endian ?? Endian.host);\n    _addAll(_eightBytesAsList, 0, 2);\n  }\n\n  /// Write a Uint32 into the buffer.\n  void putUint32(int value, {Endian? endian}) {\n    assert(!_isDone);\n    _eightBytes.setUint32(0, value, endian ?? Endian.host);\n    _addAll(_eightBytesAsList, 0, 4);\n  }\n\n  /// Write an Int32 into the buffer.\n  void putInt32(int value, {Endian? endian}) {\n    assert(!_isDone);\n    _eightBytes.setInt32(0, value, endian ?? Endian.host);\n    _addAll(_eightBytesAsList, 0, 4);\n  }\n\n  /// Write an Int64 into the buffer.\n  void putInt64(int value, {Endian? endian}) {\n    assert(!_isDone);\n    _eightBytes.setInt64(0, value, endian ?? Endian.host);\n    _addAll(_eightBytesAsList, 0, 8);\n  }\n\n  /// Write an Float64 into the buffer.\n  void putFloat64(double value, {Endian? endian}) {\n    assert(!_isDone);\n    _alignTo(8);\n    _eightBytes.setFloat64(0, value, endian ?? Endian.host);\n    _addAll(_eightBytesAsList);\n  }\n\n  /// Write all the values from a [Uint8List] into the buffer.\n  void putUint8List(Uint8List list) {\n    assert(!_isDone);\n    _append(list);\n  }\n\n  /// Write all the values from an [Int32List] into the buffer.\n  void putInt32List(Int32List list) {\n    assert(!_isDone);\n    _alignTo(4);\n    _append(list.buffer.asUint8List(list.offsetInBytes, 4 * list.length));\n  }\n\n  /// Write all the values from an [Int64List] into the buffer.\n  void putInt64List(Int64List list) {\n    assert(!_isDone);\n    _alignTo(8);\n    _append(list.buffer.asUint8List(list.offsetInBytes, 8 * list.length));\n  }\n\n  /// Write all the values from a [Float32List] into the buffer.\n  void putFloat32List(Float32List list) {\n    assert(!_isDone);\n    _alignTo(4);\n    _append(list.buffer.asUint8List(list.offsetInBytes, 4 * list.length));\n  }\n\n  /// Write all the values from a [Float64List] into the buffer.\n  void putFloat64List(Float64List list) {\n    assert(!_isDone);\n    _alignTo(8);\n    _append(list.buffer.asUint8List(list.offsetInBytes, 8 * list.length));\n  }\n\n  void _alignTo(int alignment) {\n    assert(!_isDone);\n    final int mod = _currentSize % alignment;\n    if (mod != 0) {\n      _addAll(_zeroBuffer, 0, alignment - mod);\n    }\n  }\n\n  /// Finalize and return the written [ByteData].\n  ByteData done() {\n    if (_isDone) {\n      throw StateError(\n          'done() must not be called more than once on the same $runtimeType.');\n    }\n    final ByteData result = _buffer.buffer.asByteData(0, _currentSize);\n    _buffer = Uint8List(0);\n    _isDone = true;\n    return result;\n  }\n}\n\n/// Read-only buffer for reading sequentially from a [ByteData] instance.\n///\n/// The byte order used is [Endian.host] throughout.\nclass ReadBuffer {\n  /// Creates a [ReadBuffer] for reading from the specified [data].\n  ReadBuffer(this.data);\n\n  /// The underlying data being read.\n  final ByteData data;\n\n  /// The position to read next.\n  int _position = 0;\n\n  /// Whether the buffer has data remaining to read.\n  bool get hasRemaining => _position < data.lengthInBytes;\n\n  /// Reads a Uint8 from the buffer.\n  int getUint8() {\n    return data.getUint8(_position++);\n  }\n\n  /// Reads a Uint16 from the buffer.\n  int getUint16({Endian? endian}) {\n    final int value = data.getUint16(_position, endian ?? Endian.host);\n    _position += 2;\n    return value;\n  }\n\n  /// Reads a Uint32 from the buffer.\n  int getUint32({Endian? endian}) {\n    final int value = data.getUint32(_position, endian ?? Endian.host);\n    _position += 4;\n    return value;\n  }\n\n  /// Reads an Int32 from the buffer.\n  int getInt32({Endian? endian}) {\n    final int value = data.getInt32(_position, endian ?? Endian.host);\n    _position += 4;\n    return value;\n  }\n\n  /// Reads an Int64 from the buffer.\n  int getInt64({Endian? endian}) {\n    final int value = data.getInt64(_position, endian ?? Endian.host);\n    _position += 8;\n    return value;\n  }\n\n  /// Reads a Float64 from the buffer.\n  double getFloat64({Endian? endian}) {\n    _alignTo(8);\n    final double value = data.getFloat64(_position, endian ?? Endian.host);\n    _position += 8;\n    return value;\n  }\n\n  /// Reads the given number of Uint8s from the buffer.\n  Uint8List getUint8List(int length) {\n    final Uint8List list =\n        data.buffer.asUint8List(data.offsetInBytes + _position, length);\n    _position += length;\n    return list;\n  }\n\n  /// Reads the given number of Int32s from the buffer.\n  Int32List getInt32List(int length) {\n    _alignTo(4);\n    final Int32List list =\n        data.buffer.asInt32List(data.offsetInBytes + _position, length);\n    _position += 4 * length;\n    return list;\n  }\n\n  /// Reads the given number of Int64s from the buffer.\n  Int64List getInt64List(int length) {\n    _alignTo(8);\n    final Int64List list =\n        data.buffer.asInt64List(data.offsetInBytes + _position, length);\n    _position += 8 * length;\n    return list;\n  }\n\n  /// Reads the given number of Float32s from the buffer\n  Float32List getFloat32List(int length) {\n    _alignTo(4);\n    final Float32List list =\n        data.buffer.asFloat32List(data.offsetInBytes + _position, length);\n    _position += 4 * length;\n    return list;\n  }\n\n  /// Reads the given number of Float64s from the buffer.\n  Float64List getFloat64List(int length) {\n    _alignTo(8);\n    final Float64List list =\n        data.buffer.asFloat64List(data.offsetInBytes + _position, length);\n    _position += 8 * length;\n    return list;\n  }\n\n  void _alignTo(int alignment) {\n    final int mod = _position % alignment;\n    if (mod != 0) {\n      _position += alignment - mod;\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_core/packages/tars_dart/pubspec.yaml",
    "content": "name: tars_dart\ndescription: Dart Support Library For Tars RPC framework\nversion: 0.1.0\nhomepage: \"https://github.com/brooklet/TarsFlutter\"\n\nenvironment: \n  sdk: '>=3.0.5 <4.0.0'\n\ndependencies:\n  dio: ^5.7.0\n  logger: ^2.5.0\n\ndev_dependencies: \n  lints: ^2.0.0\n  test: ^1.21.0"
  },
  {
    "path": "simple_live_core/pubspec.yaml",
    "content": "name: simple_live_core\nversion: 1.0.3\ndescription: \"聚合直播核心库\"\nrepository: https://github.com/xiaoyaocz/dart_simple_live\npublish_to: \"none\"\nenvironment: \n  sdk: '>=3.10.0'\n\ndependencies: \n  dio: ^5.5.0+1\n  logger: ^2.4.0\n  web_socket_channel: ^3.0.1\n  html_unescape: ^2.0.0\n  protobuf: ^3.1.0\n  crypto: ^3.0.3\n  brotli: ^0.6.0\n  tars_dart:\n    path: ./packages/tars_dart\n  fixnum: ^1.1.0\n  dart_quickjs:\n    git:\n      url: https://github.com/xiaoyaocz/dart_quickjs\n\ndev_dependencies: \n  lints: ^2.0.0\n  test: ^1.21.0\n\n"
  },
  {
    "path": "simple_live_core/test/simple_live_core_test.dart",
    "content": "import 'package:simple_live_core/simple_live_core.dart';\nimport 'package:test/test.dart';\n\nvoid testSite(LiveSite site) async {\n  var rooms = <LiveRoomItem>[];\n  test('getRecommendRooms', () async {\n    final result = await site.getRecommendRooms();\n    expect(result, isNotNull);\n    expect(result.items, isNotEmpty);\n    rooms = result.items;\n    for (var item in rooms) {\n      expect(item.roomId, isNotEmpty);\n      expect(item.title, isNotEmpty);\n      expect(item.cover, isNotEmpty);\n      expect(item.userName, isNotEmpty);\n      print(item);\n    }\n  });\n\n  var categores = <LiveCategory>[];\n  test('getCategores', () async {\n    categores = await site.getCategores();\n    expect(categores, isNotEmpty);\n    for (var item in categores) {\n      expect(item.name, isNotEmpty);\n      for (var subItem in item.children) {\n        expect(subItem.name, isNotEmpty);\n        expect(subItem.id, isNotEmpty);\n        expect(subItem.parentId, isNotEmpty);\n      }\n      print('${item.name}\\n${item.children}');\n    }\n  });\n\n  test('getCategoryRooms', () async {\n    var result = await site.getCategoryRooms(categores.first.children.first);\n    expect(result, isNotNull);\n    expect(result.items, isNotEmpty);\n    for (var item in result.items) {\n      expect(item.roomId, isNotEmpty);\n      expect(item.title, isNotEmpty);\n      expect(item.cover, isNotEmpty);\n      expect(item.userName, isNotEmpty);\n      print(item);\n    }\n  });\n\n  test('searchRooms', () async {\n    var result = await site.searchRooms('LOL');\n    expect(result, isNotNull);\n    expect(result.items, isNotEmpty);\n    for (var item in result.items) {\n      expect(item.roomId, isNotEmpty);\n      expect(item.title, isNotEmpty);\n      expect(item.cover, isNotEmpty);\n      expect(item.userName, isNotEmpty);\n      print(item);\n    }\n  });\n\n  test('searchAnchors', () async {\n    // 跳过抖音测试此项\n    if (site is DouyinSite) {\n      return;\n    }\n    var result = await site.searchAnchors('联盟');\n    expect(result, isNotNull);\n    expect(result.items, isNotEmpty);\n    for (var item in result.items) {\n      expect(item.roomId, isNotEmpty);\n      expect(item.userName, isNotEmpty);\n      print(item);\n    }\n  });\n\n  LiveRoomDetail? roomDetail;\n  test('getRoomDetail', () async {\n    roomDetail = await site.getRoomDetail(roomId: rooms.first.roomId);\n    expect(roomDetail, isNotNull);\n    expect(roomDetail?.roomId, isNotEmpty);\n    expect(roomDetail?.danmakuData, isNotNull);\n    print(roomDetail);\n  });\n\n  List<LivePlayQuality> playQualities = [];\n  test('getPlayQuality', () async {\n    playQualities = await site.getPlayQualites(detail: roomDetail!);\n    expect(playQualities, isNotEmpty);\n    for (var item in playQualities) {\n      expect(item.quality, isNotEmpty);\n      expect(item.data, isNotNull);\n      print(item);\n    }\n  });\n\n  test('getPlayUrls', () async {\n    var url = await site.getPlayUrls(\n        detail: roomDetail!, quality: playQualities.first);\n    expect(url, isNotNull);\n    expect(url.urls, isNotEmpty);\n    print(url.urls.join('\\n\\n'));\n  });\n\n  test('getDanmaku', () async {\n    var danmaku = site.getDanmaku();\n    expect(danmaku, isNotNull);\n    expect(danmaku, isA<LiveDanmaku>());\n    var closed = false;\n    var ready = false;\n    danmaku.onReady = () {\n      print('ready');\n      ready = true;\n    };\n    danmaku.onClose = (msg) {\n      print('onClose $msg');\n      closed = true;\n    };\n    var msgCount = 0;\n    danmaku.onMessage = (LiveMessage msg) {\n      print('onMessage ${msg.type} ${msg.message}');\n      msgCount++;\n    };\n    await danmaku.start(roomDetail!.danmakuData);\n    // 接收30秒的弹幕\n    await Future.delayed(const Duration(seconds: 30));\n    expect(ready, isTrue);\n    expect(closed, isFalse);\n    expect(msgCount, greaterThan(0));\n    await danmaku.stop();\n  }, timeout: const Timeout(Duration(seconds: 40)));\n}\n\nvoid main() {\n  CoreLog.requestLogType = RequestLogType.short;\n\n  group('bilibili tests', () {\n    testSite(BiliBiliSite());\n  });\n\n  group('douyu tests', () {\n    testSite(DouyuSite());\n  });\n\n  group('huya tests', () {\n    testSite(HuyaSite());\n  });\n\n  group('douyin tests', () {\n    testSite(DouyinSite());\n  });\n}\n"
  },
  {
    "path": "simple_live_tv_app/.fvmrc",
    "content": "{\n  \"flutter\": \"3.38.3\"\n}"
  },
  {
    "path": "simple_live_tv_app/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n\n# FVM Version Cache\n.fvm/"
  },
  {
    "path": "simple_live_tv_app/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: \"d693b4b9dbac2acd4477aea4555ca6dcbea44ba2\"\n  channel: \"stable\"\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2\n      base_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2\n    - platform: android\n      create_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2\n      base_revision: d693b4b9dbac2acd4477aea4555ca6dcbea44ba2\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "simple_live_tv_app/README.md",
    "content": "# simple_live_tv_app\n\nSimple Live Android TV APP\n\n"
  },
  {
    "path": "simple_live_tv_app/analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at https://dart.dev/lints.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "simple_live_tv_app/android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n.cxx/\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/to/reference-keystore\nkey.properties\n**/*.keystore\n**/*.jks\n"
  },
  {
    "path": "simple_live_tv_app/android/app/build.gradle.kts",
    "content": "import java.util.Properties\nimport java.io.FileInputStream\n\nplugins {\n    id(\"com.android.application\")\n    id(\"kotlin-android\")\n    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.\n    id(\"dev.flutter.flutter-gradle-plugin\")\n}\n\nval keystoreProperties = Properties()\nval keystorePropertiesFile = rootProject.file(\"key.properties\")\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    namespace = \"com.xycz.simple_live_tv\"\n    compileSdk = flutter.compileSdkVersion\n    ndkVersion = flutter.ndkVersion\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_11\n        targetCompatibility = JavaVersion.VERSION_11\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_11.toString()\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId = \"com.xycz.simple_live_tv\"\n        // You can update the following values to match your application needs.\n        // For more information, see: https://flutter.dev/to/review-gradle-config.\n        minSdk = flutter.minSdkVersion\n        targetSdk = flutter.targetSdkVersion\n        versionCode = flutter.versionCode\n        versionName = flutter.versionName\n    }\n\n    signingConfigs {\n        create(\"release\") {\n            keyAlias = keystoreProperties[\"keyAlias\"] as String\n            keyPassword = keystoreProperties[\"keyPassword\"] as String\n            storeFile = keystoreProperties[\"storeFile\"]?.let { file(it) }\n            storePassword = keystoreProperties[\"storePassword\"] as String\n            isV1SigningEnabled = true\n            isV2SigningEnabled = true\n        }\n    }\n\n    buildTypes {\n        release {\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig = signingConfigs.getByName(\"release\")\n            isMinifyEnabled = true\n            isShrinkResources = true\n            proguardFiles(\n                // Default file with automatically generated optimization rules.\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n}\n\nflutter {\n    source = \"../..\"\n}\n"
  },
  {
    "path": "simple_live_tv_app/android/app/proguard-rules.pro",
    "content": "#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-keep class de.prosiebensat1digital.** { *; }\n-dontwarn io.flutter.embedding.**\n-ignorewarnings"
  },
  {
    "path": "simple_live_tv_app/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool 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": "simple_live_tv_app/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"com.xycz.simple_live_tv\">\n   <uses-permission android:name=\"android.permission.INTERNET\" />\n   <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n   <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n   <uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\" />\n    <application\n        android:label=\"Simple Live TV\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:banner=\"@mipmap/ic_banner\"\n        android:networkSecurityConfig=\"@xml/network_security_config\"\n        android:usesCleartextTraffic=\"true\">\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|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\"\n            android:banner=\"@mipmap/ic_banner\"\n            android:screenOrientation=\"landscape\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n                <category android:name=\"android.intent.category.LEANBACK_LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/kotlin/com/xycz/simple_live_tv/MainActivity.kt",
    "content": "package com.xycz.simple_live_tv\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity() {\n}\n"
  },
  {
    "path": "simple_live_tv_app/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    <item>\n        <shape android:shape=\"rectangle\">\n            <gradient\n                android:type=\"linear\"\n                android:startColor=\"#141e30\"\n                android:centerColor=\"#243b55\"\n                android:endColor=\"#141e30\"\n                android:angle=\"135\" />\n        </shape>\n    </item>\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": "simple_live_tv_app/android/app/src/main/res/drawable-v21/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:colorBackground\" />\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     <item>\n        <shape android:shape=\"rectangle\">\n            <gradient\n                android:type=\"linear\"\n                android:startColor=\"#141e30\"\n                android:centerColor=\"#243b55\"\n                android:endColor=\"#141e30\"\n                android:angle=\"135\" />\n        </shape>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/res/mipmap-anydpi-v26/ic_banner.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=\"@color/ic_banner_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_banner_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/res/values/ic_banner_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_banner_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <!-- Disable the greenish yellow focus border that shows up when using physical or emulated peripherals -->\n        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <!-- Disable the greenish yellow focus border that shows up when using physical or emulated peripherals -->\n        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <!-- Disable the greenish yellow focus border that shows up when using physical or emulated peripherals -->\n        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <!-- Disable the greenish yellow focus border that shows up when using physical or emulated peripherals -->\n        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "simple_live_tv_app/android/app/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\" />\n</network-security-config>\n"
  },
  {
    "path": "simple_live_tv_app/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool 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": "simple_live_tv_app/android/build.gradle.kts",
    "content": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n        \n    }\n}\n\nval newBuildDir: Directory =\n    rootProject.layout.buildDirectory\n        .dir(\"../../build\")\n        .get()\nrootProject.layout.buildDirectory.value(newBuildDir)\n\nsubprojects {\n    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)\n    project.layout.buildDirectory.value(newSubprojectBuildDir)\n}\nsubprojects {\n    project.evaluationDependsOn(\":app\")\n}\n\ntasks.register<Delete>(\"clean\") {\n    delete(rootProject.layout.buildDirectory)\n}\n"
  },
  {
    "path": "simple_live_tv_app/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.12-all.zip\n"
  },
  {
    "path": "simple_live_tv_app/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "simple_live_tv_app/android/settings.gradle.kts",
    "content": "pluginManagement {\n    val flutterSdkPath =\n        run {\n            val properties = java.util.Properties()\n            file(\"local.properties\").inputStream().use { properties.load(it) }\n            val flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n            require(flutterSdkPath != null) { \"flutter.sdk not set in local.properties\" }\n            flutterSdkPath\n        }\n\n    includeBuild(\"$flutterSdkPath/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id(\"dev.flutter.flutter-plugin-loader\") version \"1.0.0\"\n    id(\"com.android.application\") version \"8.9.1\" apply false\n    id(\"org.jetbrains.kotlin.android\") version \"2.1.0\" apply false\n}\n\ninclude(\":app\")\n"
  },
  {
    "path": "simple_live_tv_app/assets/lotties/empty.json",
    "content": "{\"v\":\"4.7.0\",\"fr\":25,\"ip\":0,\"op\":50,\"w\":120,\"h\":120,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"ruoi\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.967]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p967_0p167_0p033\"],\"t\":35,\"s\":[100],\"e\":[0]},{\"t\":49}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0,\"y\":0},\"n\":\"0p833_0p833_0_0\",\"t\":0,\"s\":[57.361,61.016,0],\"e\":[57.699,41.796,0],\"to\":[-4.67500305175781,-4.12800598144531,0],\"ti\":[-13.9099960327148,5.27300262451172,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":10.219,\"s\":[57.699,41.796,0],\"e\":[79.084,33.982,0],\"to\":[12.8159942626953,-4.85800170898438,0],\"ti\":[-4.54498291015625,3.73400115966797,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":19.445,\"s\":[79.084,33.982,0],\"e\":[59.691,9.121,0],\"to\":[6.61601257324219,-5.43799591064453,0],\"ti\":[20.0290069580078,1.20700073242188,0]},{\"t\":35}]},\"a\":{\"a\":0,\"k\":[60.531,10.945,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-0.994,0],[0,-0.994],[0.995,0],[0,0.994]],\"o\":[[0.995,0],[0,0.994],[-0.994,0],[0,-0.994]],\"v\":[[-0.001,-1.801],[1.801,-0.001],[-0.001,1.801],[-1.801,-0.001]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[62.4,13.144],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 1\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-1.422,0],[0,-1.422],[1.421,0],[0,1.422]],\"o\":[[1.421,0],[0,1.422],[-1.422,0],[0,-1.422]],\"v\":[[0.001,-2.574],[2.574,0],[0.001,2.574],[-2.574,0]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0.7},\"lc\":1,\"lj\":1,\"ml\":10,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[64.145,9.606],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 2\",\"np\":3,\"cix\":2,\"ix\":2,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[-1.996,0],[0,-1.996],[1.996,0],[0,1.996]],\"o\":[[1.996,0],[0,1.996],[-1.996,0],[0,-1.996]],\"v\":[[0,-3.614],[3.614,0],[0,3.614],[-3.614,0]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.4235294117647059,0.4235294117647059,0.4235294117647059,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0.7},\"lc\":1,\"lj\":1,\"ml\":10,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[57.957,10.552],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 3\",\"np\":3,\"cix\":2,\"ix\":3,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60.531,10.941],\"ix\":2},\"a\":{\"a\":0,\"k\":[60.531,10.941],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"ruoi\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Shape Layer 2\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.967]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p967_0p167_0p033\"],\"t\":35,\"s\":[100],\"e\":[0]},{\"t\":49}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[-0.75,-0.75,0]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[-13.91,5.273],[-4.545,3.734],[20.029,1.207]],\"o\":[[-4.675,-4.128],[12.816,-4.858],[6.616,-5.438],[0,0]],\"v\":[[-7.383,24.76],[-7.046,5.54],[14.34,-2.273],[-3.178,-24.76]],\"c\":false}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.34901960784313724,0.3686274509803922,0.4,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":1},\"lc\":2,\"lj\":2,\"d\":[{\"n\":\"d\",\"nm\":\"dash\",\"v\":{\"a\":0,\"k\":2.028}},{\"n\":\"g\",\"nm\":\"gap\",\"v\":{\"a\":0,\"k\":2.028}},{\"n\":\"o\",\"nm\":\"offset\",\"v\":{\"a\":0,\"k\":0}}],\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[67.87,37.631],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 6\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tm\",\"s\":{\"a\":0,\"k\":0,\"ix\":1},\"e\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.953]},\"o\":{\"x\":[0.167],\"y\":[0.033]},\"n\":[\"0p833_0p953_0p167_0p033\"],\"t\":0,\"s\":[0],\"e\":[100]},{\"t\":35}],\"ix\":2},\"o\":{\"a\":0,\"k\":0,\"ix\":3},\"m\":1,\"ix\":2,\"nm\":\"Trim Paths 1\",\"mn\":\"ADBE Vector Filter - Trim\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"im_emptyBox Outlines\",\"ks\":{\"o\":{\"a\":0,\"k\":100},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[60,60,0]},\"a\":{\"a\":0,\"k\":[60,60,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-0.001,-16.607],[-32.143,-0.002],[-0.001,16.607],[32.144,-0.002]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8,0.82,0.851,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,55.75],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 7\",\"np\":2,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[12.856,-23.249],[0,-16.605],[-12.857,-23.249],[-45,-6.641],[-32.144,0.001],[-45,6.645],[-12.857,23.249],[0,16.609],[12.856,23.249],[45,6.645],[32.143,0.001],[45,-6.641]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9372549019607843,0.9372549019607843,0.9372549019607843,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,55.748],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 8\",\"np\":2,\"cix\":2,\"ix\":2,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[-16.072,24.171],[16.072,11.312],[16.072,-24.171],[-16.072,-24.171]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9529411764705882,0.9529411764705882,0.9529411764705882,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[76.072,83.33],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 9\",\"np\":2,\"cix\":2,\"ix\":3,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[-32.143,-24.171],[-32.143,11.311],[-0.001,24.171],[32.144,11.311],[32.144,-24.171]],\"c\":true}},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8,0.82,0.851,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,83.33],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"Group 10\",\"np\":2,\"cix\":2,\"ix\":4,\"mn\":\"ADBE Vector Group\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[60,60.186],\"ix\":2},\"a\":{\"a\":0,\"k\":[60,60.186],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transform\"}],\"nm\":\"box\",\"np\":4,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":50,\"st\":0,\"bm\":0,\"sr\":1}]}"
  },
  {
    "path": "simple_live_tv_app/assets/lotties/error.json",
    "content": "{\"v\":\"5.8.1\",\"fr\":29.9700012207031,\"ip\":0,\"op\":301.000012259981,\"w\":1080,\"h\":900,\"nm\":\"Composition 1\",\"ddd\":0,\"assets\":[{\"id\":\"comp_0\",\"nm\":\"Nuage\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 11\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[54,54],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-22,-239],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 12\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[544.675,315.475,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-54.5,-226.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[80,80,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[31,31],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-54.5,-226.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[31,31],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-54.5,-226.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[100,20],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":20,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-26,-216],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_1\",\"nm\":\"éolienne\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"Hélices\",\"refId\":\"comp_2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.137],\"y\":[1]},\"o\":{\"x\":[0.567],\"y\":[0]},\"t\":1,\"s\":[0]},{\"t\":300.00001221925,\"s\":[1440]}],\"ix\":10},\"p\":{\"a\":0,\"k\":[800,440,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[800,440,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Socle eolienne\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[264.75,-95],[257,-95],[242,252],[288,251]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_2\",\"nm\":\"Hélices\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 11\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-239.6,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":-122.747,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[803,442,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[263,-98,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[310,-98],[284,-92],[263,-96],[439,10],[423,-17]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[800.5,439.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[266.5,-94.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[27,27],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[266.5,-94.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_3\",\"nm\":\"plot base\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[541,387.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[1,-152.5,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[13,-223],[-13,-223],[-52,-82],[54,-82]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,502,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,-38,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[58,-56],[-59,-56],[-70,-20],[70,-20]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 5\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[539.75,606.25,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-0.25,66.25,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[256.5,28.5],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.7647058823529411,0.3215686274509804,0.23137254901960785,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-0.25,66.25],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 6\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,572,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,32,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[78,3],[-76,3],[-93,60],[93,61]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9019607843137255,0.3764705882352941,0.27058823529411763,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_4\",\"nm\":\"Tree\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 10\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-171.5,-79.5],[-152.5,-45]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980451995,0.84313731474,0.84313731474,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":7,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 9\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-154.5,-23.5],[-137.5,-48.5]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980451995,0.84313731474,0.84313731474,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":7,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[386,620,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-154,80,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0]],\"o\":[[0,0],[0,0]],\"v\":[[-154,256],[-154,-96]],\"c\":false},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.850980392157,0.844306078144,0.844306078144,1],\"ix\":3},\"o\":{\"a\":0,\"k\":100,\"ix\":4},\"w\":{\"a\":0,\"k\":10,\"ix\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"bm\":0,\"nm\":\"Contour 1\",\"mn\":\"ADBE Vector Graphic - Stroke\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 8\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[384,475,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-156,-65,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[96,222],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":62,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.949019667682,0.949019667682,0.949019667682,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-156,-65],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]},{\"id\":\"comp_5\",\"nm\":\"ground\",\"fr\":29.9700012207031,\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Calque de forme 2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[515,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[662,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[817,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[78,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Calque de forme 3\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[752,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[89,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Calque de forme 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[270,795.5,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[-273.5,78,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[102,317,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[59,2],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":2371,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.133333333333,0.145098039216,0.235294132607,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-273.5,78],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}]}],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":0,\"nm\":\"Nuage\",\"refId\":\"comp_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.833],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":51,\"s\":[100]},{\"i\":{\"x\":[0.833],\"y\":[1]},\"o\":{\"x\":[0.167],\"y\":[0]},\"t\":234,\"s\":[100]},{\"t\":299.00001217852,\"s\":[0]}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.284,\"y\":1},\"o\":{\"x\":0.387,\"y\":0},\"t\":0,\"s\":[704,380,0],\"to\":[-36.667,0,0],\"ti\":[36.667,0,0]},{\"t\":299.00001217852,\"s\":[484,380,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[514,308,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Calque de forme 7\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],\"o\":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],\"v\":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.83137254902,0.821591725069,0.821591725069,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":0,\"nm\":\"éolienne\",\"refId\":\"comp_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[804,796,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[804,796,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":4,\"ty\":0,\"nm\":\"plot base\",\"refId\":\"comp_3\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":7.368,\"s\":[6]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":14.736,\"s\":[-5]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":22.264,\"s\":[4]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":29.633,\"s\":[-2]},{\"t\":37.0000015070409,\"s\":[0]}],\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":0,\"s\":[540,792,0],\"to\":[0,-2.667,0],\"ti\":[0,2,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":7.368,\"s\":[540,776,0],\"to\":[0,-2,0],\"ti\":[0,-1.333,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":14.736,\"s\":[540,780,0],\"to\":[0,1.333,0],\"ti\":[0,-1.333,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":22.264,\"s\":[540,784,0],\"to\":[0,1.333,0],\"ti\":[0,-2,0]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":29.633,\"s\":[540,788,0],\"to\":[0,2,0],\"ti\":[0,-1.333,0]},{\"t\":37.0000015070409,\"s\":[540,796,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,616,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":5,\"ty\":0,\"nm\":\"éolienne\",\"refId\":\"comp_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[670,796,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[804,796,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[63,63,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":6,\"ty\":0,\"nm\":\"Tree\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[280,790,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[384,790,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[82,82,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":7,\"ty\":0,\"nm\":\"Tree\",\"refId\":\"comp_4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":8,\"ty\":4,\"nm\":\"Arbuste\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[68,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0.5,-0.5],[0,0.5],[0,-1],[0,-0.5],[0,0],[0.5,-0.5],[0,0],[0.5,-0.5],[-0.5,-0.5]],\"o\":[[-19,-5],[-34,-13],[-18.5,1.5],[-17,10.5],[0,0],[17,-19.5],[6.5,-4],[-3.5,-13],[11.5,-19.5]],\"v\":[[263.5,176],[242.5,196],[218,213],[209.5,232.5],[215,254.5],[297,253.5],[289.5,225],[294,210],[271.5,204]],\"c\":true},\"ix\":2},\"nm\":\"Tracé 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.901960784314,0.901960784314,0.901960784314,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Forme 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":9,\"ty\":0,\"nm\":\"ground\",\"refId\":\"comp_5\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":10,\"ty\":0,\"nm\":\"Nuage\",\"refId\":\"comp_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":0,\"s\":[0]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":51,\"s\":[100]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"t\":234,\"s\":[100]},{\"t\":299.00001217852,\"s\":[0]}],\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.333,\"y\":0},\"t\":0,\"s\":[193,606,0],\"to\":[56.5,0,0],\"ti\":[-56.5,0,0]},{\"t\":299.00001217852,\"s\":[532,606,0]}],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[514,308,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[60,60,100],\"ix\":6,\"l\":2}},\"ao\":0,\"w\":1080,\"h\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":11,\"ty\":4,\"nm\":\"Calque de forme 6\",\"td\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[572,712,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[784,628],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Tracé rectangulaire 1\",\"mn\":\"ADBE Vector Shape - Rect\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.909803921569,0.909803921569,0.909803921569,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-36,-234],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":12,\"ty\":4,\"nm\":\"Calque de forme 5\",\"tt\":1,\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,716,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[728,728],\"ix\":2},\"p\":{\"a\":0,\"k\":[0,0],\"ix\":3},\"nm\":\"Tracé d'ellipse 1\",\"mn\":\"ADBE Vector Shape - Ellipse\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.976470588235,0.976470588235,0.976470588235,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fond 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[8,-140],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"Transformer \"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}],\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":14,\"ty\":1,\"nm\":\"Blanc uni 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[540,540,0],\"ix\":2,\"l\":2},\"a\":{\"a\":0,\"k\":[540,540,0],\"ix\":1,\"l\":2},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6,\"l\":2}},\"ao\":0,\"sw\":1080,\"sh\":900,\"ip\":0,\"op\":630.000025660426,\"st\":0,\"bm\":0}],\"markers\":[]}"
  },
  {
    "path": "simple_live_tv_app/assets/lotties/loadding.json",
    "content": "{\n    \"v\": \"5.5.8\",\n    \"fr\": 50,\n    \"ip\": 0,\n    \"op\": 147,\n    \"w\": 800,\n    \"h\": 600,\n    \"nm\": \"Paperplane\",\n    \"ddd\": 0,\n    \"assets\": [\n        {\n            \"id\": \"comp_0\",\n            \"layers\": [\n                {\n                    \"ddd\": 0,\n                    \"ind\": 1,\n                    \"ty\": 4,\n                    \"nm\": \"planete Outlines - Group 4\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 38,\n                                    \"s\": [\n                                        50\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.833\n                                        ],\n                                        \"y\": [\n                                            0.833\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.167\n                                        ],\n                                        \"y\": [\n                                            0.167\n                                        ]\n                                    },\n                                    \"t\": 88,\n                                    \"s\": [\n                                        50\n                                    ]\n                                },\n                                {\n                                    \"t\": 120,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.833,\n                                        \"y\": 0.833\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.167,\n                                        \"y\": 0.167\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        468.336,\n                                        323.378,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        -29,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        29,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 102,\n                                    \"s\": [\n                                        294.336,\n                                        323.378,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                453.672,\n                                304.756,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                50,\n                                50,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ind\": 0,\n                                    \"ty\": \"sh\",\n                                    \"ix\": 1,\n                                    \"ks\": {\n                                        \"a\": 0,\n                                        \"k\": {\n                                            \"i\": [\n                                                [\n                                                    6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0.741,\n                                                    -0.14\n                                                ],\n                                                [\n                                                    0,\n                                                    0.074\n                                                ],\n                                                [\n                                                    13.484,\n                                                    0\n                                                ],\n                                                [\n                                                    1.669,\n                                                    -0.361\n                                                ],\n                                                [\n                                                    19.79,\n                                                    0\n                                                ],\n                                                [\n                                                    3.317,\n                                                    -19.082\n                                                ],\n                                                [\n                                                    2.691,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -0.048,\n                                                    -0.629\n                                                ],\n                                                [\n                                                    2.405,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.742\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.743\n                                                ]\n                                            ],\n                                            \"o\": [\n                                                [\n                                                    -0.781,\n                                                    0\n                                                ],\n                                                [\n                                                    0.001,\n                                                    -0.074\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -1.778,\n                                                    0\n                                                ],\n                                                [\n                                                    -3.594,\n                                                    -18.742\n                                                ],\n                                                [\n                                                    -20.03,\n                                                    0\n                                                ],\n                                                [\n                                                    -2.421,\n                                                    -0.804\n                                                ],\n                                                [\n                                                    -13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0.642\n                                                ],\n                                                [\n                                                    -1.89,\n                                                    -1.199\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.743\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.742\n                                                ]\n                                            ],\n                                            \"v\": [\n                                                [\n                                                    75.134,\n                                                    16.175\n                                                ],\n                                                [\n                                                    72.85,\n                                                    16.396\n                                                ],\n                                                [\n                                                    72.856,\n                                                    16.175\n                                                ],\n                                                [\n                                                    48.44,\n                                                    -8.241\n                                                ],\n                                                [\n                                                    43.262,\n                                                    -7.685\n                                                ],\n                                                [\n                                                    3.406,\n                                                    -40.591\n                                                ],\n                                                [\n                                                    -36.571,\n                                                    -6.995\n                                                ],\n                                                [\n                                                    -44.269,\n                                                    -8.241\n                                                ],\n                                                [\n                                                    -68.685,\n                                                    16.175\n                                                ],\n                                                [\n                                                    -68.604,\n                                                    18.079\n                                                ],\n                                                [\n                                                    -75.133,\n                                                    16.175\n                                                ],\n                                                [\n                                                    -87.341,\n                                                    28.383\n                                                ],\n                                                [\n                                                    -75.133,\n                                                    40.592\n                                                ],\n                                                [\n                                                    75.134,\n                                                    40.592\n                                                ],\n                                                [\n                                                    87.342,\n                                                    28.383\n                                                ]\n                                            ],\n                                            \"c\": true\n                                        },\n                                        \"ix\": 2\n                                    },\n                                    \"nm\": \"Path 1\",\n                                    \"mn\": \"ADBE Vector Shape - Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"fl\",\n                                    \"c\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0.815686334348,\n                                            0.823529471603,\n                                            0.827451040231,\n                                            1\n                                        ],\n                                        \"ix\": 4\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 5\n                                    },\n                                    \"r\": 1,\n                                    \"bm\": 0,\n                                    \"nm\": \"Fill 1\",\n                                    \"mn\": \"ADBE Vector Graphic - Fill\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            453.672,\n                                            304.756\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0,\n                                            0\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            100,\n                                            100\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"Group 4\",\n                            \"np\": 2,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                },\n                {\n                    \"ddd\": 0,\n                    \"ind\": 2,\n                    \"ty\": 4,\n                    \"nm\": \"Merged Shape Layer\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.547\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.845\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 77,\n                                    \"s\": [\n                                        35\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        390.319,\n                                        298.2,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        -2.583,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 44,\n                                    \"s\": [\n                                        390.319,\n                                        282.7,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": 0.667,\n                                        \"y\": 1\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.333,\n                                        \"y\": 0\n                                    },\n                                    \"t\": 110,\n                                    \"s\": [\n                                        390.319,\n                                        319.25,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        0,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        0,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        390.319,\n                                        298.2,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                664.319,\n                                256.2,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                100,\n                                100,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            18.967,\n                                                            -3.189\n                                                        ],\n                                                        [\n                                                            -18.967,\n                                                            19.935\n                                                        ],\n                                                        [\n                                                            -0.949,\n                                                            -19.935\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.223528981209,\n                                                    0.192156970501,\n                                                    0.674510002136,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    236.879,\n                                                    292.737\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 1\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            633.939,\n                                            275.369\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            236.879,\n                                            292.737\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 1\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        },\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            -98.335,\n                                                            64.79\n                                                        ],\n                                                        [\n                                                            -105.619,\n                                                            4.984\n                                                        ],\n                                                        [\n                                                            105.619,\n                                                            -64.79\n                                                        ],\n                                                        [\n                                                            -80.316,\n                                                            24.919\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.278430998325,\n                                                    0.294117987156,\n                                                    0.847059011459,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    316.247,\n                                                    247.882\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 2\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            673.623,\n                                            252.941\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            316.247,\n                                            247.882\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 2\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 2,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        },\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ty\": \"gr\",\n                                    \"it\": [\n                                        {\n                                            \"ind\": 0,\n                                            \"ty\": \"sh\",\n                                            \"ix\": 1,\n                                            \"ks\": {\n                                                \"a\": 0,\n                                                \"k\": {\n                                                    \"i\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"o\": [\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ],\n                                                        [\n                                                            0,\n                                                            0\n                                                        ]\n                                                    ],\n                                                    \"v\": [\n                                                        [\n                                                            -133.812,\n                                                            -42.171\n                                                        ],\n                                                        [\n                                                            133.812,\n                                                            -75.141\n                                                        ],\n                                                        [\n                                                            5.765,\n                                                            75.141\n                                                        ],\n                                                        [\n                                                            -61.708,\n                                                            18.402\n                                                        ],\n                                                        [\n                                                            124.227,\n                                                            -71.307\n                                                        ],\n                                                        [\n                                                            -87.011,\n                                                            -1.534\n                                                        ]\n                                                    ],\n                                                    \"c\": true\n                                                },\n                                                \"ix\": 2\n                                            },\n                                            \"nm\": \"Path 1\",\n                                            \"mn\": \"ADBE Vector Shape - Group\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"fl\",\n                                            \"c\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0.365000009537,\n                                                    0.407999992371,\n                                                    0.976000010967,\n                                                    1\n                                                ],\n                                                \"ix\": 4\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 5\n                                            },\n                                            \"r\": 1,\n                                            \"bm\": 0,\n                                            \"nm\": \"Fill 1\",\n                                            \"mn\": \"ADBE Vector Graphic - Fill\",\n                                            \"hd\": false\n                                        },\n                                        {\n                                            \"ty\": \"tr\",\n                                            \"p\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    297.638,\n                                                    254.4\n                                                ],\n                                                \"ix\": 2\n                                            },\n                                            \"a\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    0,\n                                                    0\n                                                ],\n                                                \"ix\": 1\n                                            },\n                                            \"s\": {\n                                                \"a\": 0,\n                                                \"k\": [\n                                                    100,\n                                                    100\n                                                ],\n                                                \"ix\": 3\n                                            },\n                                            \"r\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 6\n                                            },\n                                            \"o\": {\n                                                \"a\": 0,\n                                                \"k\": 100,\n                                                \"ix\": 7\n                                            },\n                                            \"sk\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 4\n                                            },\n                                            \"sa\": {\n                                                \"a\": 0,\n                                                \"k\": 0,\n                                                \"ix\": 5\n                                            },\n                                            \"nm\": \"Transform\"\n                                        }\n                                    ],\n                                    \"nm\": \"Group 3\",\n                                    \"np\": 2,\n                                    \"cix\": 2,\n                                    \"bm\": 0,\n                                    \"ix\": 1,\n                                    \"mn\": \"ADBE Vector Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            664.319,\n                                            256.2\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            297.638,\n                                            254.4\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            50,\n                                            50\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"planete Outlines - Group 3\",\n                            \"np\": 1,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 3,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                },\n                {\n                    \"ddd\": 0,\n                    \"ind\": 3,\n                    \"ty\": 4,\n                    \"nm\": \"planete Outlines - Group 5\",\n                    \"sr\": 1,\n                    \"ks\": {\n                        \"o\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 45,\n                                    \"s\": [\n                                        100\n                                    ]\n                                },\n                                {\n                                    \"i\": {\n                                        \"x\": [\n                                            0.667\n                                        ],\n                                        \"y\": [\n                                            1\n                                        ]\n                                    },\n                                    \"o\": {\n                                        \"x\": [\n                                            0.333\n                                        ],\n                                        \"y\": [\n                                            0\n                                        ]\n                                    },\n                                    \"t\": 102,\n                                    \"s\": [\n                                        100\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 11\n                        },\n                        \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 10\n                        },\n                        \"p\": {\n                            \"a\": 1,\n                            \"k\": [\n                                {\n                                    \"i\": {\n                                        \"x\": 0.833,\n                                        \"y\": 0.833\n                                    },\n                                    \"o\": {\n                                        \"x\": 0.167,\n                                        \"y\": 0.167\n                                    },\n                                    \"t\": 0,\n                                    \"s\": [\n                                        327.38,\n                                        267.583,\n                                        0\n                                    ],\n                                    \"to\": [\n                                        25.833,\n                                        0,\n                                        0\n                                    ],\n                                    \"ti\": [\n                                        -25.833,\n                                        0,\n                                        0\n                                    ]\n                                },\n                                {\n                                    \"t\": 150,\n                                    \"s\": [\n                                        482.38,\n                                        267.583,\n                                        0\n                                    ]\n                                }\n                            ],\n                            \"ix\": 2\n                        },\n                        \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                                171.76,\n                                193.166,\n                                0\n                            ],\n                            \"ix\": 1\n                        },\n                        \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                                50,\n                                50,\n                                100\n                            ],\n                            \"ix\": 6\n                        }\n                    },\n                    \"ao\": 0,\n                    \"shapes\": [\n                        {\n                            \"ty\": \"gr\",\n                            \"it\": [\n                                {\n                                    \"ind\": 0,\n                                    \"ty\": \"sh\",\n                                    \"ix\": 1,\n                                    \"ks\": {\n                                        \"a\": 0,\n                                        \"k\": {\n                                            \"i\": [\n                                                [\n                                                    13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    4.38,\n                                                    -4.171\n                                                ],\n                                                [\n                                                    21.913,\n                                                    0\n                                                ],\n                                                [\n                                                    3.575,\n                                                    -18.765\n                                                ],\n                                                [\n                                                    1.851,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ],\n                                                [\n                                                    -0.011,\n                                                    -0.291\n                                                ],\n                                                [\n                                                    1.599,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -6.743\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    13.485\n                                                ]\n                                            ],\n                                            \"o\": [\n                                                [\n                                                    -6.526,\n                                                    0\n                                                ],\n                                                [\n                                                    -0.793,\n                                                    -21.719\n                                                ],\n                                                [\n                                                    -19.806,\n                                                    0\n                                                ],\n                                                [\n                                                    -1.734,\n                                                    -0.391\n                                                ],\n                                                [\n                                                    -13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    0.293\n                                                ],\n                                                [\n                                                    -1.4,\n                                                    -0.559\n                                                ],\n                                                [\n                                                    -6.742,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    6.742\n                                                ],\n                                                [\n                                                    0,\n                                                    0\n                                                ],\n                                                [\n                                                    13.485,\n                                                    0\n                                                ],\n                                                [\n                                                    0,\n                                                    -13.484\n                                                ]\n                                            ],\n                                            \"v\": [\n                                                [\n                                                    59.669,\n                                                    -8.242\n                                                ],\n                                                [\n                                                    42.84,\n                                                    -1.506\n                                                ],\n                                                [\n                                                    2.287,\n                                                    -40.592\n                                                ],\n                                                [\n                                                    -37.576,\n                                                    -7.638\n                                                ],\n                                                [\n                                                    -42.962,\n                                                    -8.242\n                                                ],\n                                                [\n                                                    -67.378,\n                                                    16.174\n                                                ],\n                                                [\n                                                    -67.356,\n                                                    17.049\n                                                ],\n                                                [\n                                                    -71.878,\n                                                    16.174\n                                                ],\n                                                [\n                                                    -84.086,\n                                                    28.383\n                                                ],\n                                                [\n                                                    -71.878,\n                                                    40.591\n                                                ],\n                                                [\n                                                    59.669,\n                                                    40.591\n                                                ],\n                                                [\n                                                    84.086,\n                                                    16.174\n                                                ]\n                                            ],\n                                            \"c\": true\n                                        },\n                                        \"ix\": 2\n                                    },\n                                    \"nm\": \"Path 1\",\n                                    \"mn\": \"ADBE Vector Shape - Group\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"fl\",\n                                    \"c\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0.816000007181,\n                                            0.823999980852,\n                                            0.827000038297,\n                                            1\n                                        ],\n                                        \"ix\": 4\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 5\n                                    },\n                                    \"r\": 1,\n                                    \"bm\": 0,\n                                    \"nm\": \"Fill 1\",\n                                    \"mn\": \"ADBE Vector Graphic - Fill\",\n                                    \"hd\": false\n                                },\n                                {\n                                    \"ty\": \"tr\",\n                                    \"p\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            171.76,\n                                            193.166\n                                        ],\n                                        \"ix\": 2\n                                    },\n                                    \"a\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            0,\n                                            0\n                                        ],\n                                        \"ix\": 1\n                                    },\n                                    \"s\": {\n                                        \"a\": 0,\n                                        \"k\": [\n                                            100,\n                                            100\n                                        ],\n                                        \"ix\": 3\n                                    },\n                                    \"r\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 6\n                                    },\n                                    \"o\": {\n                                        \"a\": 0,\n                                        \"k\": 100,\n                                        \"ix\": 7\n                                    },\n                                    \"sk\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 4\n                                    },\n                                    \"sa\": {\n                                        \"a\": 0,\n                                        \"k\": 0,\n                                        \"ix\": 5\n                                    },\n                                    \"nm\": \"Transform\"\n                                }\n                            ],\n                            \"nm\": \"Group 5\",\n                            \"np\": 2,\n                            \"cix\": 2,\n                            \"bm\": 0,\n                            \"ix\": 1,\n                            \"mn\": \"ADBE Vector Group\",\n                            \"hd\": false\n                        }\n                    ],\n                    \"ip\": 0,\n                    \"op\": 151,\n                    \"st\": 0,\n                    \"bm\": 0\n                }\n            ]\n        }\n    ],\n    \"layers\": [\n        {\n            \"ddd\": 0,\n            \"ind\": 1,\n            \"ty\": 0,\n            \"nm\": \"Pre-comp 1\",\n            \"refId\": \"comp_0\",\n            \"sr\": 1,\n            \"ks\": {\n                \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 11\n                },\n                \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 10\n                },\n                \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                        406,\n                        306,\n                        0\n                    ],\n                    \"ix\": 2\n                },\n                \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                        400,\n                        300,\n                        0\n                    ],\n                    \"ix\": 1\n                },\n                \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                        179,\n                        179,\n                        100\n                    ],\n                    \"ix\": 6\n                }\n            },\n            \"ao\": 0,\n            \"w\": 800,\n            \"h\": 600,\n            \"ip\": 0,\n            \"op\": 147,\n            \"st\": 0,\n            \"bm\": 0\n        }\n    ],\n    \"markers\": []\n}"
  },
  {
    "path": "simple_live_tv_app/assets/statement.txt",
    "content": "在使用本软件之前，请您仔细阅读以下内容，并确保您充分理解并同意以下条款：\n1、本软件为开源软件，您可以免费获取并使用该软件。\n2、本软件完全基于您个人意愿使用，您应该对自己的使用行为和所有结果承担全部责任。\n3、本软件仅供学习交流、科研等非商业性质的用途，严禁将本软件用于商业目的。如有任何商业行为，均与本软件无关。\n4、本软件并不保证与所有操作系统或硬件设备兼容。本软件作者或贡献者不对因使用本软件而产生的任何技术或安全问题承担责任。\n5、本软件作者或贡献者不承担因使用本软件而造成的任何直接、间接、特殊或后果性的损失或损害的责任，包括但不限于财产损失、商业利润损失、信息或数据丢失或损坏等。\n6、本软件使用者应遵守国家相关法律法规和使用规范，不得利用本软件从事任何违法违规行为。如因使用本软件而导致的违法行为，使用者应承担相应的法律责任。\n7、本软件不会收集、存储、使用任何用户的个人信息，包括但不限于姓名、地址、电子邮件地址、电话号码等。在使用本软件过程中，不会进行任何形式的个人信息采集。如用户提供任何个人信息，将被视为用户已自愿提供，并且用户将自行承担由此产生的所有法律责任。\n8、本软件作者或贡献者保留随时修改、增加、删除本免责声明中的内容而不另行通知的权利。\n9、如果本软件存在侵犯您的合法权益的情况，请及时与作者联系，作者将会及时删除有关内容。\n如您不同意本免责声明中的任何内容，请勿使用本软件。使用本软件即代表您已完全理解并同意上述内容。"
  },
  {
    "path": "simple_live_tv_app/lib/app/app_error.dart",
    "content": "class AppError extends Error {\n  /// 错误码\n  final int code;\n\n  /// 错误信息\n  final String message;\n\n  /// 是否是Http请求错误\n  final bool isHttpError;\n\n  final bool notLogin;\n\n  AppError(\n    this.message, {\n    this.code = 0,\n    this.isHttpError = false,\n    this.notLogin = false,\n  });\n  @override\n  String toString() {\n    return message;\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/app_focus_node.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\n/// 拓展FoucsNode\nclass AppFocusNode extends FocusNode {\n  var isFoucsed = false.obs;\n  AppFocusNode() {\n    isFoucsed.value = hasFocus;\n    addListener(updateFoucs);\n  }\n\n  updateFoucs() {\n    isFoucsed.value = hasFocus;\n  }\n\n  @override\n  void dispose() {\n    removeListener(updateFoucs);\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/app_style.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\n\nclass AppColors {\n  static ColorScheme lightColorScheme = ColorScheme.fromSwatch(\n    primarySwatch: Colors.pink,\n    brightness: Brightness.dark,\n    //primaryColorDark: const Color(0xfff06595),\n    accentColor: const Color(0xfff06595),\n  );\n}\n\nclass AppStyle {\n  static ThemeData lightTheme = ThemeData(\n    colorScheme: AppColors.lightColorScheme,\n    appBarTheme: const AppBarTheme(\n      elevation: 0,\n      centerTitle: true,\n    ),\n    scaffoldBackgroundColor: const Color(0xfffafafa),\n    radioTheme: RadioThemeData(\n      fillColor: WidgetStateProperty.all(AppColors.lightColorScheme.primary),\n    ),\n    checkboxTheme: CheckboxThemeData(\n      fillColor: WidgetStateProperty.all(AppColors.lightColorScheme.primary),\n    ),\n    fontFamily: Platform.isWindows ? 'Microsoft YaHei' : null,\n  );\n\n  static SizedBox get vGap4 => SizedBox(\n        height: 4.w,\n      );\n  static SizedBox get vGap8 => SizedBox(\n        height: 8.w,\n      );\n  static SizedBox get vGap12 => SizedBox(\n        height: 12.w,\n      );\n  static SizedBox get vGap16 => SizedBox(\n        height: 16.w,\n      );\n  static SizedBox get vGap24 => SizedBox(\n        height: 24.w,\n      );\n  static SizedBox get vGap32 => SizedBox(\n        height: 32.w,\n      );\n  static SizedBox get vGap40 => SizedBox(\n        height: 40.w,\n      );\n  static SizedBox get vGap48 => SizedBox(\n        height: 48.w,\n      );\n  static SizedBox get hGap4 => SizedBox(\n        width: 4.w,\n      );\n  static SizedBox get hGap8 => SizedBox(\n        width: 8.w,\n      );\n  static SizedBox get hGap12 => SizedBox(\n        width: 12.w,\n      );\n  static SizedBox get hGap16 => SizedBox(\n        width: 16.w,\n      );\n  static SizedBox get hGap20 => SizedBox(\n        width: 20.w,\n      );\n  static SizedBox get hGap24 => SizedBox(\n        width: 24.w,\n      );\n  static SizedBox get hGap32 => SizedBox(\n        width: 32.w,\n      );\n  static SizedBox get hGap40 => SizedBox(\n        width: 40.w,\n      );\n  static SizedBox get hGap48 => SizedBox(\n        width: 48.w,\n      );\n\n  static EdgeInsets get edgeInsetsH4 => EdgeInsets.symmetric(horizontal: 4.w);\n  static EdgeInsets get edgeInsetsH8 => EdgeInsets.symmetric(horizontal: 8.w);\n  static EdgeInsets get edgeInsetsH12 => EdgeInsets.symmetric(horizontal: 12.w);\n  static EdgeInsets get edgeInsetsH16 => EdgeInsets.symmetric(horizontal: 16.w);\n  static EdgeInsets get edgeInsetsH20 => EdgeInsets.symmetric(horizontal: 20.w);\n  static EdgeInsets get edgeInsetsH24 => EdgeInsets.symmetric(horizontal: 24.w);\n  static EdgeInsets get edgeInsetsH32 => EdgeInsets.symmetric(horizontal: 32.w);\n  static EdgeInsets get edgeInsetsH40 => EdgeInsets.symmetric(horizontal: 40.w);\n  static EdgeInsets get edgeInsetsH48 => EdgeInsets.symmetric(horizontal: 48.w);\n\n  static EdgeInsets get edgeInsetsV4 => EdgeInsets.symmetric(vertical: 4.w);\n  static EdgeInsets get edgeInsetsV8 => EdgeInsets.symmetric(vertical: 8.w);\n  static EdgeInsets get edgeInsetsV12 => EdgeInsets.symmetric(vertical: 12.w);\n  static EdgeInsets get edgeInsetsV24 => EdgeInsets.symmetric(vertical: 24.w);\n  static EdgeInsets get edgeInsetsV32 => EdgeInsets.symmetric(vertical: 32.w);\n  static EdgeInsets get edgeInsetsV40 => EdgeInsets.symmetric(vertical: 40.w);\n  static EdgeInsets get edgeInsetsV48 => EdgeInsets.symmetric(vertical: 48.w);\n\n  static EdgeInsets get edgeInsetsA4 => EdgeInsets.all(4.w);\n  static EdgeInsets get edgeInsetsA8 => EdgeInsets.all(8.w);\n  static EdgeInsets get edgeInsetsA12 => EdgeInsets.all(12.w);\n  static EdgeInsets get edgeInsetsA16 => EdgeInsets.all(16.w);\n  static EdgeInsets get edgeInsetsA20 => EdgeInsets.all(20.w);\n  static EdgeInsets get edgeInsetsA24 => EdgeInsets.all(24.w);\n  static EdgeInsets get edgeInsetsA32 => EdgeInsets.all(32.w);\n  static EdgeInsets get edgeInsetsA40 => EdgeInsets.all(40.w);\n  static EdgeInsets get edgeInsetsA48 => EdgeInsets.all(48.w);\n\n  static EdgeInsets get edgeInsetsR4 => EdgeInsets.only(right: 4.w);\n  static EdgeInsets get edgeInsetsR8 => EdgeInsets.only(right: 8.w);\n  static EdgeInsets get edgeInsetsR12 => EdgeInsets.only(right: 12.w);\n  static EdgeInsets get edgeInsetsR16 => EdgeInsets.only(right: 16.w);\n  static EdgeInsets get edgeInsetsR20 => EdgeInsets.only(right: 20.w);\n  static EdgeInsets get edgeInsetsR24 => EdgeInsets.only(right: 24.w);\n\n  static EdgeInsets get edgeInsetsL4 => EdgeInsets.only(left: 4.w);\n  static EdgeInsets get edgeInsetsL8 => EdgeInsets.only(left: 8.w);\n  static EdgeInsets get edgeInsetsL12 => EdgeInsets.only(left: 12.w);\n  static EdgeInsets get edgeInsetsL16 => EdgeInsets.only(left: 16.w);\n  static EdgeInsets get edgeInsetsL20 => EdgeInsets.only(left: 20.w);\n  static EdgeInsets get edgeInsetsL24 => EdgeInsets.only(left: 24.w);\n\n  static EdgeInsets get edgeInsetsT4 => EdgeInsets.only(top: 4.w);\n  static EdgeInsets get edgeInsetsT8 => EdgeInsets.only(top: 8.w);\n  static EdgeInsets get edgeInsetsT12 => EdgeInsets.only(top: 12.w);\n  static EdgeInsets get edgeInsetsT24 => EdgeInsets.only(top: 24.w);\n\n  static EdgeInsets get edgeInsetsB4 => EdgeInsets.only(bottom: 4.w);\n  static EdgeInsets get edgeInsetsB8 => EdgeInsets.only(bottom: 8.w);\n  static EdgeInsets get edgeInsetsB12 => EdgeInsets.only(bottom: 12.w);\n  static EdgeInsets get edgeInsetsB24 => EdgeInsets.only(bottom: 24.w);\n\n  static BorderRadius get radius4 => BorderRadius.circular(4.w);\n  static BorderRadius get radius8 => BorderRadius.circular(8.w);\n  static BorderRadius get radius12 => BorderRadius.circular(12.w);\n  static BorderRadius get radius16 => BorderRadius.circular(16.w);\n  static BorderRadius get radius24 => BorderRadius.circular(24.w);\n  static BorderRadius get radius32 => BorderRadius.circular(32.w);\n  static BorderRadius get radius48 => BorderRadius.circular(48.w);\n\n  static const colorBlack33 = Color(0xff333333);\n\n  /// 顶部状态栏的高度\n  static double get statusBarHeight => MediaQuery.of(Get.context!).padding.top;\n\n  /// 底部导航条的高度\n  static double get bottomBarHeight =>\n      MediaQuery.of(Get.context!).padding.bottom;\n\n  static TextStyle get titleStyleWhite => TextStyle(\n        color: Colors.white,\n        fontSize: 40.w,\n      );\n  static TextStyle get titleStyleBlack => TextStyle(\n        color: colorBlack33,\n        fontSize: 40.w,\n      );\n  static TextStyle get textStyleWhite => TextStyle(\n        color: Colors.white,\n        fontSize: 32.w,\n      );\n  static TextStyle get textStyleBlack => TextStyle(\n        color: colorBlack33,\n        fontSize: 32.w,\n      );\n  static TextStyle get subTextStyleWhite => TextStyle(\n        color: Colors.white54,\n        fontSize: 24.w,\n        height: 1.0,\n      );\n  static TextStyle get subTextStyleBlack => TextStyle(\n        color: Colors.black54,\n        fontSize: 24.w,\n        height: 1.0,\n      );\n\n  static List<BoxShadow> get highlightShadow => [\n        BoxShadow(\n          blurRadius: 6.w,\n          spreadRadius: 2.w,\n          color: Colors.pink.shade400,\n          //color: Color.fromARGB(255, 255, 120, 167),\n        )\n      ];\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/base_focus_model.dart",
    "content": "import 'package:simple_live_tv_app/app/app_focus_node.dart';\n\nclass BaseFocusModel {\n  final AppFocusNode focusNode = AppFocusNode();\n  bool get isFoucsed => focusNode.isFoucsed.value;\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/constant.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass Constant {\n  static const String kUpdateFollow = \"UpdateFollow\";\n  static const String kUpdateHistory = \"UpdateHistory\";\n\n  static const String kBiliBili = \"bilibili\";\n  static const String kDouyu = \"douyu\";\n  static const String kHuya = \"huya\";\n  static const String kDouyin = \"douyin\";\n}\n\nclass HomePageItem {\n  final IconData iconData;\n  final String title;\n  final int index;\n  HomePageItem({\n    required this.iconData,\n    required this.title,\n    required this.index,\n  });\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/controller/app_settings_controller.dart",
    "content": "import 'package:simple_live_tv_app/services/local_storage_service.dart';\n\nimport 'package:get/get.dart';\n\nclass AppSettingsController extends GetxController {\n  static AppSettingsController get instance =>\n      Get.find<AppSettingsController>();\n\n  /// 缩放模式\n  var scaleMode = 0.obs;\n\n  var firstRun = false;\n\n  @override\n  void onInit() {\n    firstRun = LocalStorageService.instance\n        .getValue(LocalStorageService.kFirstRun, true);\n    danmuSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuSize, 40.0);\n    danmuOpacity.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuOpacity, 1.0);\n    danmuArea.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuArea, 0.25);\n    danmuSpeed.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuSpeed, 10.0);\n    danmuEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuEnable, true);\n    danmuStrokeWidth.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuStrokeWidth, 4.0);\n    danmuTopMargin.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuTopMargin, 0.0);\n    danmuBottomMargin.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kDanmuBottomMargin, 0.0);\n\n    hardwareDecode.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kHardwareDecode, true);\n    chatTextSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kChatTextSize, 14.0);\n\n    chatTextGap.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kChatTextGap, 4.0);\n\n    chatBubbleStyle.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kChatBubbleStyle,\n      false,\n    );\n\n    qualityLevel.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kQualityLevel, 1);\n    qualityLevelCellular.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kQualityLevelCellular, 1);\n\n    autoExitEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoExitEnable, false);\n\n    autoExitDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoExitDuration, 60);\n\n    roomAutoExitDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kRoomAutoExitDuration, 60);\n\n    playerCompatMode.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerCompatMode, true);\n\n    playerAutoPause.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerAutoPause, false);\n\n    autoFullScreen.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoFullScreen, false);\n\n    // ignore: invalid_use_of_protected_member\n    shieldList.value = LocalStorageService.instance.shieldBox.values.toSet();\n\n    scaleMode.value = LocalStorageService.instance.getValue(\n      LocalStorageService.kPlayerScaleMode,\n      0,\n    );\n\n    pipHideDanmu.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPIPHideDanmu, true);\n\n    styleColor.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kStyleColor, 0xff3498db);\n\n    isDynamic.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kIsDynamic, false);\n\n    bilibiliLoginTip.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kBilibiliLoginTip, true);\n\n    playerBufferSize.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kPlayerBufferSize, 32);\n\n    autoUpdateFollowEnable.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kAutoUpdateFollowEnable, true);\n\n    autoUpdateFollowDuration.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kUpdateFollowDuration, 10);\n\n    updateFollowThreadCount.value = LocalStorageService.instance\n        .getValue(LocalStorageService.kUpdateFollowThreadCount, 4);\n\n    super.onInit();\n  }\n\n  void setNoFirstRun() {\n    LocalStorageService.instance.setValue(LocalStorageService.kFirstRun, false);\n  }\n\n  var hardwareDecode = true.obs;\n  void setHardwareDecode(bool e) {\n    hardwareDecode.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kHardwareDecode, e);\n  }\n\n  var chatTextSize = 14.0.obs;\n  void setChatTextSize(double e) {\n    chatTextSize.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kChatTextSize, e);\n  }\n\n  var chatTextGap = 4.0.obs;\n  void setChatTextGap(double e) {\n    chatTextGap.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kChatTextGap, e);\n  }\n\n  var chatBubbleStyle = false.obs;\n  void setChatBubbleStyle(bool e) {\n    chatBubbleStyle.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kChatBubbleStyle, e);\n  }\n\n  var danmuSize = 40.0.obs;\n  void setDanmuSize(double e) {\n    danmuSize.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuSize, e);\n  }\n\n  var danmuSpeed = 10.0.obs;\n  void setDanmuSpeed(double e) {\n    danmuSpeed.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuSpeed, e);\n  }\n\n  var danmuArea = 0.25.obs;\n  void setDanmuArea(double e) {\n    danmuArea.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuArea, e);\n  }\n\n  var danmuOpacity = 1.0.obs;\n  void setDanmuOpacity(double e) {\n    danmuOpacity.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuOpacity, e);\n  }\n\n  var danmuEnable = true.obs;\n  void setDanmuEnable(bool e) {\n    danmuEnable.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kDanmuEnable, e);\n  }\n\n  var danmuStrokeWidth = 4.0.obs;\n  void setDanmuStrokeWidth(double e) {\n    danmuStrokeWidth.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuStrokeWidth, e);\n  }\n\n  var qualityLevel = 1.obs;\n  void setQualityLevel(int level) {\n    qualityLevel.value = level;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kQualityLevel, level);\n  }\n\n  var qualityLevelCellular = 1.obs;\n  void setQualityLevelCellular(int level) {\n    qualityLevelCellular.value = level;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kQualityLevelCellular, level);\n  }\n\n  var autoExitEnable = false.obs;\n  void setAutoExitEnable(bool e) {\n    autoExitEnable.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoExitEnable, e);\n  }\n\n  var autoExitDuration = 60.obs;\n  void setAutoExitDuration(int e) {\n    autoExitDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoExitDuration, e);\n  }\n\n  var roomAutoExitDuration = 60.obs;\n  void setRoomAutoExitDuration(int e) {\n    roomAutoExitDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kRoomAutoExitDuration, e);\n  }\n\n  var playerCompatMode = false.obs;\n  void setPlayerCompatMode(bool e) {\n    playerCompatMode.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerCompatMode, e);\n  }\n\n  var playerBufferSize = 32.obs;\n  void setPlayerBufferSize(int e) {\n    playerBufferSize.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerBufferSize, e);\n  }\n\n  var playerAutoPause = false.obs;\n  void setPlayerAutoPause(bool e) {\n    playerAutoPause.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kPlayerAutoPause, e);\n  }\n\n  var autoFullScreen = false.obs;\n  void setAutoFullScreen(bool e) {\n    autoFullScreen.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoFullScreen, e);\n  }\n\n  RxSet<String> shieldList = <String>{}.obs;\n  void addShieldList(String e) {\n    shieldList.add(e);\n    LocalStorageService.instance.shieldBox.put(e, e);\n  }\n\n  void removeShieldList(String e) {\n    shieldList.remove(e);\n    LocalStorageService.instance.shieldBox.delete(e);\n  }\n\n  Future clearShieldList() async {\n    shieldList.clear();\n    await LocalStorageService.instance.shieldBox.clear();\n  }\n\n  void setScaleMode(int value) {\n    scaleMode.value = value;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kPlayerScaleMode,\n      value,\n    );\n  }\n\n  RxList<String> siteSort = RxList<String>();\n  void setSiteSort(List<String> e) {\n    siteSort.value = e;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kSiteSort,\n      siteSort.join(\",\"),\n    );\n  }\n\n  RxList<String> homeSort = RxList<String>();\n  void setHomeSort(List<String> e) {\n    homeSort.value = e;\n    LocalStorageService.instance.setValue(\n      LocalStorageService.kHomeSort,\n      homeSort.join(\",\"),\n    );\n  }\n\n  var pipHideDanmu = true.obs;\n  void setPIPHideDanmu(bool e) {\n    pipHideDanmu.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kPIPHideDanmu, e);\n  }\n\n  var styleColor = 0xff3498db.obs;\n  void setStyleColor(int e) {\n    styleColor.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kStyleColor, e);\n  }\n\n  var isDynamic = false.obs;\n  void setIsDynamic(bool e) {\n    isDynamic.value = e;\n    LocalStorageService.instance.setValue(LocalStorageService.kIsDynamic, e);\n  }\n\n  var danmuTopMargin = 0.0.obs;\n  void setDanmuTopMargin(double e) {\n    danmuTopMargin.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuTopMargin, e);\n  }\n\n  var danmuBottomMargin = 0.0.obs;\n  void setDanmuBottomMargin(double e) {\n    danmuBottomMargin.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kDanmuBottomMargin, e);\n  }\n\n  var bilibiliLoginTip = true.obs;\n  void setBiliBiliLoginTip(bool e) {\n    bilibiliLoginTip.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliLoginTip, e);\n  }\n\n  var autoUpdateFollowEnable = false.obs;\n  void setAutoUpdateFollowEnable(bool e) {\n    autoUpdateFollowEnable.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kAutoUpdateFollowEnable, e);\n  }\n\n  var autoUpdateFollowDuration = 10.obs;\n  void setAutoUpdateFollowDuration(int e) {\n    autoUpdateFollowDuration.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kUpdateFollowDuration, e);\n  }\n\n  var updateFollowThreadCount = 4.obs;\n  void setUpdateFollowThreadCount(int e) {\n    updateFollowThreadCount.value = e;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kUpdateFollowThreadCount, e);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/controller/base_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/widgets.dart';\nimport 'package:simple_live_tv_app/app/app_error.dart';\n\nimport 'package:flutter_easyrefresh/easy_refresh.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass BaseController extends GetxController {\n  /// 加载中，更新页面\n  var pageLoadding = false.obs;\n\n  /// 加载中\n  var loadding = false.obs;\n\n  /// 空白页面\n  var pageEmpty = false.obs;\n\n  /// 页面错误\n  var pageError = false.obs;\n\n  /// 未登录\n  var notLogin = false.obs;\n\n  /// 错误信息\n  var errorMsg = \"\".obs;\n\n  /// 显示错误\n  /// * [msg] 错误信息\n  /// * [showPageError] 显示页面错误\n  /// * 只在第一页加载错误时showPageError=true，后续页加载错误时使用Toast弹出通知\n  void handleError(Object exception, {bool showPageError = false}) {\n    var msg = exceptionToString(exception);\n    if (exception is AppError && exception.notLogin) {\n      notLogin.value = true;\n      pageError.value = false;\n      return;\n    }\n    if (showPageError) {\n      pageError.value = true;\n      errorMsg.value = msg;\n    } else {\n      SmartDialog.showToast(exceptionToString(msg));\n    }\n  }\n\n  String exceptionToString(Object exception) {\n    if (exception is AppError) {\n      return exception.toString();\n    }\n    return exception.toString().replaceAll(\"Exception:\", \"\");\n  }\n\n  void onLogin() {}\n  void onLogout() {}\n}\n\nclass BasePageController<T> extends BaseController {\n  final ScrollController scrollController = ScrollController();\n  final EasyRefreshController easyRefreshController = EasyRefreshController();\n  int currentPage = 1;\n  int count = 0;\n  int maxPage = 0;\n  int pageSize = 24;\n  var canLoadMore = false.obs;\n  var list = <T>[].obs;\n\n  Future refreshData() async {\n    currentPage = 1;\n    list.value = [];\n    await loadData();\n  }\n\n  Future loadData() async {\n    try {\n      if (loadding.value) return;\n      loadding.value = true;\n      pageError.value = false;\n      pageEmpty.value = false;\n      notLogin.value = false;\n      pageLoadding.value = currentPage == 1;\n\n      var result = await getData(currentPage, pageSize);\n      //是否可以加载更多\n      if (result.isNotEmpty) {\n        currentPage++;\n        canLoadMore.value = true;\n        pageEmpty.value = false;\n      } else {\n        canLoadMore.value = false;\n        if (currentPage == 1) {\n          pageEmpty.value = true;\n        }\n      }\n      // 赋值数据\n      if (currentPage == 1) {\n        list.value = result;\n      } else {\n        list.addAll(result);\n      }\n    } catch (e) {\n      handleError(e, showPageError: currentPage == 1);\n    } finally {\n      loadding.value = false;\n      pageLoadding.value = false;\n    }\n  }\n\n  Future<List<T>> getData(int page, int pageSize) async {\n    return [];\n  }\n\n  void scrollToTopOrRefresh() {\n    if (scrollController.offset > 0) {\n      scrollController.animateTo(\n        0,\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.linear,\n      );\n    } else {\n      easyRefreshController.callRefresh();\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/event_bus.dart",
    "content": "import 'dart:async';\n\nimport 'package:simple_live_tv_app/app/log.dart';\n\n/// 全局事件\nclass EventBus {\n  static EventBus? _instance;\n\n  static EventBus get instance {\n    _instance ??= EventBus();\n    return _instance!;\n  }\n\n  final Map<String, StreamController> _streams = {};\n\n  /// 触发事件\n  void emit<T>(String name, T data) {\n    if (!_streams.containsKey(name)) {\n      _streams.addAll({name: StreamController.broadcast()});\n    }\n    Log.d(\"Emit Event：$name\\r\\n$data\");\n\n    _streams[name]!.add(data);\n  }\n\n  /// 监听事件\n  StreamSubscription<dynamic> listen(String name, Function(dynamic)? onData) {\n    if (!_streams.containsKey(name)) {\n      _streams.addAll({name: StreamController.broadcast()});\n    }\n    return _streams[name]!.stream.listen(onData);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/log.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:logger/logger.dart';\n\nclass Log {\n  static RxList<DebugLogModel> debugLogs = <DebugLogModel>[].obs;\n\n  static Logger logger = Logger(\n    printer: PrettyPrinter(\n      methodCount: 0,\n      errorMethodCount: 8,\n      lineLength: 120,\n      colors: true,\n      printEmojis: true,\n      dateTimeFormat: DateTimeFormat.none,\n    ),\n  );\n\n  static void d(String message) {\n    logger.d(\"${DateTime.now().toString()}\\n$message\");\n  }\n\n  static void i(String message) {\n    logger.i(\"${DateTime.now().toString()}\\n$message\");\n  }\n\n  static void e(String message, StackTrace stackTrace) {\n    logger.e(\"${DateTime.now().toString()}\\n$message\", stackTrace: stackTrace);\n  }\n\n  static void w(String message) {\n    logger.w(\"${DateTime.now().toString()}\\n$message\");\n  }\n\n  static void logPrint(dynamic obj) {\n    //logger.e(obj.toString(), obj, obj?.stackTrace);\n    if (kDebugMode) {\n      print(obj);\n    }\n  }\n}\n\nclass DebugLogModel {\n  final String content;\n  final DateTime datetime;\n  final Color? color;\n  DebugLogModel(this.datetime, this.content, {this.color});\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/sites.dart",
    "content": "import 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\n\nclass Sites {\n  static final Map<String, Site> allSites = {\n    \"bilibili\": Site(\n      id: \"bilibili\",\n      logo: \"assets/images/bilibili_2.png\",\n      name: \"哔哩哔哩\",\n      liveSite: BiliBiliSite(),\n      index: 0,\n    ),\n    \"douyu\": Site(\n      id: \"douyu\",\n      logo: \"assets/images/douyu.png\",\n      name: \"斗鱼直播\",\n      liveSite: DouyuSite(),\n      index: 1,\n    ),\n    \"huya\": Site(\n      id: \"huya\",\n      logo: \"assets/images/huya.png\",\n      name: \"虎牙直播\",\n      liveSite: HuyaSite(),\n      index: 2,\n    ),\n    \"douyin\": Site(\n      id: \"douyin\",\n      logo: \"assets/images/douyin.png\",\n      name: \"抖音直播\",\n      liveSite: DouyinSite(),\n      index: 3,\n    ),\n  };\n\n  static List<Site> get supportSites {\n    return allSites.values.toList();\n  }\n}\n\nclass Site {\n  final String id;\n  final String name;\n  final String logo;\n  final LiveSite liveSite;\n  final int index;\n  AppFocusNode appFocusNode = AppFocusNode();\n  Site({\n    required this.id,\n    required this.liveSite,\n    required this.logo,\n    required this.name,\n    required this.index,\n  });\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/app/utils.dart",
    "content": "import 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:intl/intl.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\n\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\n\nclass Utils {\n  static late PackageInfo packageInfo;\n  static DateFormat dateFormat = DateFormat(\"MM-dd HH:mm\");\n  static DateFormat dateFormatWithYear = DateFormat(\"yyyy-MM-dd HH:mm\");\n\n  /// 处理时间\n  static String parseTime(DateTime? dt) {\n    if (dt == null) {\n      return \"\";\n    }\n\n    var dtNow = DateTime.now();\n    if (dt.year == dtNow.year &&\n        dt.month == dtNow.month &&\n        dt.day == dtNow.day) {\n      return \"${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}\";\n    }\n\n    if (dt.year == dtNow.year) {\n      return dateFormat.format(dt);\n    }\n\n    return dateFormatWithYear.format(dt);\n  }\n\n  /// 提示弹窗\n  /// - `content` 内容\n  /// - `title` 弹窗标题\n  /// - `confirm` 确认按钮内容，留空为确定\n  /// - `cancel` 取消按钮内容，留空为取消\n  static Future<bool> showAlertDialog(\n    String content, {\n    String title = '',\n    String confirm = '',\n    String cancel = '',\n    bool selectable = false,\n    List<Widget>? actions,\n  }) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        shape: RoundedRectangleBorder(\n          borderRadius: AppStyle.radius16,\n        ),\n        titlePadding: AppStyle.edgeInsetsA24.copyWith(left: 48.w, right: 48.w),\n        contentPadding:\n            AppStyle.edgeInsetsA24.copyWith(left: 48.w, right: 48.w),\n        insetPadding: AppStyle.edgeInsetsA16,\n        actionsPadding: AppStyle.edgeInsetsA16,\n        surfaceTintColor: Colors.transparent,\n        backgroundColor: Get.theme.cardColor,\n        title: Text(\n          title,\n          style: AppStyle.titleStyleWhite,\n        ),\n        content: Padding(\n          padding: AppStyle.edgeInsetsV12,\n          child: selectable\n              ? SelectableText(\n                  content,\n                  style: AppStyle.textStyleWhite,\n                )\n              : Text(\n                  content,\n                  style: AppStyle.textStyleWhite,\n                ),\n        ),\n        actions: [\n          TextButton(\n            onPressed: (() => Get.back(result: false)),\n            child: Text(\n              cancel.isEmpty ? \"取消\" : cancel,\n              style: AppStyle.textStyleWhite,\n            ),\n          ),\n          TextButton(\n            autofocus: true,\n            onPressed: (() => Get.back(result: true)),\n            child: Text(\n              confirm.isEmpty ? \"确定\" : confirm,\n              style: AppStyle.textStyleWhite,\n            ),\n          ),\n          ...?actions,\n        ],\n      ),\n    );\n    return result ?? false;\n  }\n\n  /// 提示弹窗\n  /// - `content` 内容\n  /// - `title` 弹窗标题\n  /// - `confirm` 确认按钮内容，留空为确定\n  static Future<bool> showMessageDialog(String content,\n      {String title = '', String confirm = '', bool selectable = false}) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: Padding(\n          padding: AppStyle.edgeInsetsV12,\n          child: selectable ? SelectableText(content) : Text(content),\n        ),\n        actions: [\n          TextButton(\n            onPressed: (() => Get.back(result: true)),\n            child: Text(confirm.isEmpty ? \"确定\" : confirm),\n          ),\n        ],\n      ),\n    );\n    return result ?? false;\n  }\n\n  static Future<T?> showOptionDialog<T>(\n    List<T> contents,\n    T value, {\n    String title = '',\n  }) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: RadioGroup(\n          onChanged: (e) => Get.back(result: e),\n          groupValue: value,\n          child: Column(\n            children: contents\n                .map(\n                  (e) => RadioListTile<T>(title: Text(e.toString()), value: e),\n                )\n                .toList(),\n          ),\n        ),\n      ),\n    );\n    return result;\n  }\n\n  static Future<T?> showMapOptionDialog<T>(\n    Map<T, String> contents,\n    T value, {\n    String title = '',\n  }) async {\n    var result = await Get.dialog(\n      AlertDialog(\n        title: Text(title),\n        content: RadioGroup(\n          onChanged: (e) => Get.back(result: e),\n          groupValue: value,\n          child: Column(\n            children: contents.keys\n                .map(\n                  (e) => RadioListTile<T>(\n                    title: Text((contents[e] ?? '-').tr),\n                    value: e,\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ),\n    );\n    return result;\n  }\n\n  static bool isRegexFormat(String keyword) {\n    return keyword.startsWith('/') &&\n        keyword.endsWith('/') &&\n        keyword.length > 2;\n  }\n\n  static String removeRegexFormat(String keyword) {\n    return keyword.substring(1, keyword.length - 1);\n  }\n\n  static void showRightDialog({\n    Function()? onDismiss,\n    required Widget child,\n    double width = 320,\n    bool useSystem = false,\n  }) {\n    SmartDialog.show(\n      alignment: Alignment.topRight,\n      animationBuilder: (controller, child, animationParam) {\n        //从右到左\n        return SlideTransition(\n          position: Tween<Offset>(\n            begin: const Offset(1, 0),\n            end: Offset.zero,\n          ).animate(controller.view),\n          child: child,\n        );\n      },\n      useSystem: useSystem,\n      maskColor: Colors.transparent,\n      animationTime: const Duration(milliseconds: 200),\n      builder: (context) => Container(\n        width: width,\n        decoration: BoxDecoration(\n          color: Get.theme.cardColor,\n        ),\n        child: child,\n      ),\n    );\n  }\n\n  static Future<void> showSystemRightDialog({\n    Function()? onDismiss,\n    required Widget child,\n    double width = 320,\n  }) {\n    return Get.dialog(\n      Dialog(\n        insetPadding: EdgeInsets.zero,\n        backgroundColor: Colors.transparent,\n        child: Align(\n          alignment: Alignment.topRight,\n          child: Container(\n            width: width,\n            decoration: BoxDecoration(\n              color: Get.theme.cardColor,\n            ),\n            child: child,\n          ),\n        ),\n      ),\n    );\n  }\n\n  static void hideRightDialog() {\n    SmartDialog.dismiss(status: SmartStatus.allCustom);\n  }\n\n  static int parseVersion(String version) {\n    var sp = version.split('.');\n    var num = \"\";\n    for (var item in sp) {\n      num = num + item.padLeft(2, '0');\n    }\n    return int.parse(num);\n  }\n\n  static String onlineToString(int num) {\n    if (num >= 10000) {\n      return \"${(num / 10000.0).toStringAsFixed(1)}万\";\n    }\n    return num.toString();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/main.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_flutter/hive_flutter.dart';\nimport 'package:logger/logger.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:package_info_plus/package_info_plus.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\nimport 'package:simple_live_tv_app/models/db/history.dart';\nimport 'package:simple_live_tv_app/routes/app_pages.dart';\nimport 'package:simple_live_tv_app/routes/route_path.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\nimport 'package:simple_live_tv_app/services/local_storage_service.dart';\nimport 'package:simple_live_tv_app/services/sync_service.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  MediaKit.ensureInitialized();\n  await Hive.initFlutter();\n  //初始化服务\n  await initServices();\n  // 强制横屏\n  SystemChrome.setPreferredOrientations([\n    DeviceOrientation.landscapeRight,\n    DeviceOrientation.landscapeLeft,\n  ]);\n  // 全屏\n  SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);\n  runApp(const MyApp());\n}\n\nFuture initServices() async {\n  //日志信息\n  CoreLog.enableLog = !kReleaseMode;\n  CoreLog.requestLogType = RequestLogType.short;\n  CoreLog.onPrintLog = (level, msg) {\n    switch (level) {\n      case Level.debug:\n        Log.d(msg);\n        break;\n      case Level.error:\n        Log.e(msg, StackTrace.current);\n        break;\n      case Level.info:\n        Log.i(msg);\n        break;\n      case Level.warning:\n        Log.w(msg);\n        break;\n      default:\n        Log.logPrint(msg);\n    }\n  };\n\n  Hive.registerAdapter(FollowUserAdapter());\n  Hive.registerAdapter(HistoryAdapter());\n\n  //包信息\n  Utils.packageInfo = await PackageInfo.fromPlatform();\n  //本地存储\n  Log.d(\"Init LocalStorage Service\");\n  await Get.put(LocalStorageService()).init();\n  await Get.put(DBService()).init();\n  //初始化设置控制器\n  Get.put(AppSettingsController());\n\n  Get.put(BiliBiliAccountService());\n\n  Get.put(SyncService());\n\n  Get.put(FollowUserService());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return ScreenUtilInit(\n      designSize: const Size(1920, 1080),\n      minTextAdapt: true,\n      splitScreenMode: true,\n      builder: (context, child) {\n        return GetMaterialApp(\n          title: 'Simple Live TV',\n          theme: AppStyle.lightTheme,\n          initialRoute: AppSettingsController.instance.firstRun\n              ? RoutePath.kAgreement\n              : RoutePath.kHome,\n          getPages: AppPages.routes,\n          debugShowCheckedModeBanner: false,\n          builder: FlutterSmartDialog.init(\n            loadingBuilder: (msg) => Center(\n              child: SizedBox(\n                width: 64.w,\n                height: 64.w,\n                child: CircularProgressIndicator(\n                  strokeWidth: 8.w,\n                  color: Colors.white,\n                ),\n              ),\n            ),\n            //字体大小不跟随系统变化\n            builder: (context, child) => MediaQuery(\n              data: MediaQuery.of(context).copyWith(\n                textScaler: const TextScaler.linear(1.0),\n              ),\n              child: child!,\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/account/bilibili_user_info_page.dart",
    "content": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass BiliBiliUserInfoModel {\n  BiliBiliUserInfoModel({\n    this.mid,\n    this.uname,\n    this.userid,\n    this.sign,\n    this.birthday,\n    this.sex,\n    this.nickFree,\n    this.rank,\n  });\n\n  factory BiliBiliUserInfoModel.fromJson(Map<String, dynamic> json) =>\n      BiliBiliUserInfoModel(\n        mid: asT<int?>(json['mid']),\n        uname: asT<String?>(json['uname']),\n        userid: asT<String?>(json['userid']),\n        sign: asT<String?>(json['sign']),\n        birthday: asT<String?>(json['birthday']),\n        sex: asT<String?>(json['sex']),\n        nickFree: asT<bool?>(json['nick_free']),\n        rank: asT<String?>(json['rank']),\n      );\n\n  int? mid;\n  String? uname;\n  String? userid;\n  String? sign;\n  String? birthday;\n  String? sex;\n  bool? nickFree;\n  String? rank;\n\n  @override\n  String toString() {\n    return jsonEncode(this);\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n        'mid': mid,\n        'uname': uname,\n        'userid': userid,\n        'sign': sign,\n        'birthday': birthday,\n        'sex': sex,\n        'nick_free': nickFree,\n        'rank': rank,\n      };\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/db/follow_user.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\n\npart 'follow_user.g.dart';\n\n@HiveType(typeId: 1)\nclass FollowUser {\n  FollowUser({\n    required this.id,\n    required this.roomId,\n    required this.siteId,\n    required this.userName,\n    required this.face,\n    required this.addTime,\n  });\n\n  ///id=siteId_roomId\n  @HiveField(0)\n  String id;\n\n  @HiveField(1)\n  String roomId;\n\n  @HiveField(2)\n  String siteId;\n\n  @HiveField(3)\n  String userName;\n\n  @HiveField(4)\n  String face;\n\n  @HiveField(5)\n  DateTime addTime;\n\n  /// 直播状态\n  /// 0=未知(加载中) 1=未开播 2=直播中\n  Rx<int> liveStatus = 0.obs;\n\n  factory FollowUser.fromJson(Map<String, dynamic> json) => FollowUser(\n        id: json['id'],\n        roomId: json['roomId'],\n        siteId: json['siteId'],\n        userName: json['userName'],\n        face: json['face'],\n        addTime: DateTime.parse(json['addTime']),\n      );\n\n  Map<String, dynamic> toJson() => {\n        'id': id,\n        'roomId': roomId,\n        'siteId': siteId,\n        'userName': userName,\n        'face': face,\n        'addTime': addTime.toString(),\n      };\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/db/follow_user.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'follow_user.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass FollowUserAdapter extends TypeAdapter<FollowUser> {\n  @override\n  final int typeId = 1;\n\n  @override\n  FollowUser read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return FollowUser(\n      id: fields[0] as String,\n      roomId: fields[1] as String,\n      siteId: fields[2] as String,\n      userName: fields[3] as String,\n      face: fields[4] as String,\n      addTime: fields[5] as DateTime,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, FollowUser obj) {\n    writer\n      ..writeByte(6)\n      ..writeByte(0)\n      ..write(obj.id)\n      ..writeByte(1)\n      ..write(obj.roomId)\n      ..writeByte(2)\n      ..write(obj.siteId)\n      ..writeByte(3)\n      ..write(obj.userName)\n      ..writeByte(4)\n      ..write(obj.face)\n      ..writeByte(5)\n      ..write(obj.addTime);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is FollowUserAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/db/history.dart",
    "content": "import 'package:hive/hive.dart';\n\npart 'history.g.dart';\n\n@HiveType(typeId: 2)\nclass History {\n  History({\n    required this.id,\n    required this.roomId,\n    required this.siteId,\n    required this.userName,\n    required this.face,\n    required this.updateTime,\n  });\n\n  ///id=siteId_roomId\n  @HiveField(0)\n  String id;\n\n  @HiveField(1)\n  String roomId;\n\n  @HiveField(2)\n  String siteId;\n\n  @HiveField(3)\n  String userName;\n\n  @HiveField(4)\n  String face;\n\n  @HiveField(5)\n  DateTime updateTime;\n\n  factory History.fromJson(Map<String, dynamic> json) => History(\n        id: json[\"id\"],\n        roomId: json[\"roomId\"],\n        siteId: json[\"siteId\"],\n        userName: json[\"userName\"],\n        face: json[\"face\"],\n        updateTime: DateTime.parse(json[\"updateTime\"]),\n      );\n\n  Map<String, dynamic> toJson() => {\n        \"id\": id,\n        \"roomId\": roomId,\n        \"siteId\": siteId,\n        \"userName\": userName,\n        \"face\": face,\n        \"updateTime\": updateTime.toString(),\n      };\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/db/history.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'history.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass HistoryAdapter extends TypeAdapter<History> {\n  @override\n  final int typeId = 2;\n\n  @override\n  History read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return History(\n      id: fields[0] as String,\n      roomId: fields[1] as String,\n      siteId: fields[2] as String,\n      userName: fields[3] as String,\n      face: fields[4] as String,\n      updateTime: fields[5] as DateTime,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, History obj) {\n    writer\n      ..writeByte(6)\n      ..writeByte(0)\n      ..write(obj.id)\n      ..writeByte(1)\n      ..write(obj.roomId)\n      ..writeByte(2)\n      ..write(obj.siteId)\n      ..writeByte(3)\n      ..write(obj.userName)\n      ..writeByte(4)\n      ..write(obj.face)\n      ..writeByte(5)\n      ..write(obj.updateTime);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is HistoryAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/follow_user_item.dart",
    "content": "\n"
  },
  {
    "path": "simple_live_tv_app/lib/models/version_model.dart",
    "content": "import 'dart:convert';\n\nT? asT<T>(dynamic value) {\n  if (value is T) {\n    return value;\n  }\n  return null;\n}\n\nclass VersionModel {\n  VersionModel({\n    required this.version,\n    required this.versionNum,\n    required this.versionDesc,\n    required this.downloadUrl,\n  });\n\n  factory VersionModel.fromJson(Map<String, dynamic> json) => VersionModel(\n        version: asT<String>(json['version'])!,\n        versionNum: asT<int>(json['version_num'])!,\n        versionDesc: asT<String>(json['version_desc'])!,\n        downloadUrl: asT<String>(json['download_url'])!,\n      );\n\n  String version;\n  int versionNum;\n  String versionDesc;\n  String downloadUrl;\n\n  @override\n  String toString() {\n    return jsonEncode(this);\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n        'version': version,\n        'version_num': versionNum,\n        'version_desc': versionDesc,\n        'download_url': downloadUrl,\n      };\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/account/bilibili/qr_login_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/requests/http_client.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\n\nenum QRStatus {\n  loading,\n  unscanned,\n  scanned,\n  expired,\n  failed,\n}\n\nclass BiliBiliQRLoginController extends GetxController {\n  @override\n  void onInit() {\n    loadQRCode();\n    super.onInit();\n  }\n\n  Timer? timer;\n\n  var qrcodeUrl = \"\".obs;\n  var qrcodeKey = \"\";\n\n  /// 二维码状态\n  /// - [0] 加载中\n  /// - [1] 未扫描\n  /// - [2] 已扫描，待确认\n  /// - [3] 二维码已经失效\n  /// - [4] 登录失败\n  Rx<QRStatus> qrStatus = QRStatus.loading.obs;\n\n  void loadQRCode() async {\n    try {\n      qrStatus.value = QRStatus.loading;\n\n      var result = await HttpClient.instance.getJson(\n        \"https://passport.bilibili.com/x/passport-login/web/qrcode/generate\",\n      );\n      if (result[\"code\"] != 0) {\n        throw result[\"message\"];\n      }\n      qrcodeKey = result[\"data\"][\"qrcode_key\"];\n      qrcodeUrl.value = result[\"data\"][\"url\"];\n      qrStatus.value = QRStatus.unscanned;\n      startPoll();\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(e.toString());\n      qrStatus.value = QRStatus.failed;\n    }\n  }\n\n  void startPoll() {\n    timer = Timer.periodic(\n      const Duration(seconds: 3),\n      (timer) {\n        pollQRStatus();\n      },\n    );\n  }\n\n  void pollQRStatus() async {\n    try {\n      var response = await HttpClient.instance.get(\n        \"https://passport.bilibili.com/x/passport-login/web/qrcode/poll\",\n        queryParameters: {\n          \"qrcode_key\": qrcodeKey,\n        },\n      );\n      if (response.data[\"code\"] != 0) {\n        throw response.data[\"message\"];\n      }\n      var data = response.data[\"data\"];\n      var code = data[\"code\"];\n      if (code == 0) {\n        var cookies = <String>[];\n        response.headers[\"set-cookie\"]?.forEach((element) {\n          var cookie = element.split(\";\")[0];\n          cookies.add(cookie);\n        });\n        if (cookies.isNotEmpty) {\n          var cookieStr = cookies.join(\";\");\n          Log.i(cookieStr);\n          BiliBiliAccountService.instance.setCookie(cookieStr);\n          await BiliBiliAccountService.instance.loadUserInfo();\n          Get.back();\n        }\n      } else if (code == 86038) {\n        qrStatus.value = QRStatus.expired;\n        qrcodeKey = \"\";\n        timer?.cancel();\n      } else if (code == 86090) {\n        qrStatus.value = QRStatus.scanned;\n      }\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  @override\n  void onClose() {\n    timer?.cancel();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/account/bilibili/qr_login_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/modules/account/bilibili/qr_login_controller.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\n\nclass BiliBiliQRLoginPage extends GetView<BiliBiliQRLoginController> {\n  const BiliBiliQRLoginPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"登录哔哩哔哩\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n            ],\n          ),\n          AppStyle.vGap48,\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.stretch,\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Center(\n                  child: Obx(\n                    () {\n                      if (controller.qrStatus.value == QRStatus.loading) {\n                        return SizedBox(\n                          width: 64.w,\n                          height: 64.w,\n                          child: CircularProgressIndicator(\n                            strokeWidth: 8.w,\n                            color: Colors.white,\n                          ),\n                        );\n                      }\n                      if (controller.qrStatus.value == QRStatus.failed) {\n                        return Column(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            Text(\n                              \"二维码加载失败\",\n                              style: AppStyle.textStyleWhite,\n                            ),\n                            HighlightButton(\n                              focusNode: AppFocusNode(),\n                              iconData: Icons.refresh,\n                              text: \"重试\",\n                              onTap: controller.loadQRCode,\n                            ),\n                          ],\n                        );\n                      }\n                      if (controller.qrStatus.value == QRStatus.failed) {\n                        return Column(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            Text(\n                              \"二维码已失效\",\n                              style: AppStyle.textStyleWhite,\n                            ),\n                            HighlightButton(\n                              focusNode: AppFocusNode(),\n                              iconData: Icons.refresh,\n                              text: \"刷新\",\n                              onTap: controller.loadQRCode,\n                            ),\n                          ],\n                        );\n                      }\n                      return Column(\n                        children: [\n                          ClipRRect(\n                            borderRadius: AppStyle.radius12,\n                            child: QrImageView(\n                              data: controller.qrcodeUrl.value,\n                              version: QrVersions.auto,\n                              backgroundColor: Colors.white,\n                              size: 360.w,\n                              padding: AppStyle.edgeInsetsA12,\n                            ),\n                          ),\n                          AppStyle.vGap8,\n                          Visibility(\n                            visible:\n                                controller.qrStatus.value == QRStatus.scanned,\n                            child: Text(\n                              \"已扫描，请在手机上确认登录\",\n                              style: AppStyle.textStyleWhite,\n                            ),\n                          ),\n                        ],\n                      );\n                    },\n                  ),\n                ),\n                Padding(\n                  padding: AppStyle.edgeInsetsA24,\n                  child: Text(\n                    \"请使用哔哩哔哩手机客户端扫描二维码登录\\n必须登录后才能观看哔哩哔哩直播\",\n                    textAlign: TextAlign.center,\n                    style: TextStyle(fontSize: 32.w),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/agreement/agreement_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/routes/route_path.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\n\nclass AgreementPage extends StatelessWidget {\n  const AgreementPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Center(\n        child: SizedBox(\n          width: 1000.w,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.stretch,\n            children: [\n              Text(\n                \"使用须知\",\n                textAlign: TextAlign.center,\n                style: AppStyle.titleStyleWhite,\n              ),\n              AppStyle.vGap24,\n              Text(\n                \"欢迎使用Simple Live TV，请在使用前仔细阅读以下内容：\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap12,\n              Text(\n                \"1. 本软件为开源软件，仅供学习交流使用，禁止用于任何商业用途。\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap12,\n              Text(\n                \"2. 本软件不提供任何直播内容，所有直播内容均来自网络。\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap12,\n              Text(\n                \"3. 本软件完全基于您个人意愿使用，您应该对自己的使用行为和所有结果承担全部责任。\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap12,\n              Text(\n                \"4. 如果本软件存在侵犯您的合法权益的情况，请及时与作者联系，作者将会及时删除有关内容。\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap12,\n              Text(\n                \"如您继续使用本软件即代表您已完全理解并同意上述内容。\",\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap32,\n              Row(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  HighlightButton(\n                    text: \"已阅读并同意\",\n                    autofocus: true,\n                    focusNode: AppFocusNode(),\n                    onTap: () {\n                      AppSettingsController.instance.setNoFirstRun();\n                      Get.offAllNamed(RoutePath.kHome);\n                    },\n                  ),\n                  AppStyle.hGap32,\n                  HighlightButton(\n                    text: \"退出应用\",\n                    focusNode: AppFocusNode(),\n                    onTap: () {\n                      //退出软件\n                      exit(0);\n                    },\n                  ),\n                ],\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/category/category_controller.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\n\nclass CategoryController extends BasePageController<AppLiveCategory> {\n  var siteId = Constant.kBiliBili.obs;\n  var site = Sites.allSites[Constant.kBiliBili]!;\n\n  @override\n  void onInit() {\n    refreshData();\n    super.onInit();\n  }\n\n  void setSite(String id) {\n    siteId.value = id;\n    site = Sites.allSites[id]!;\n    refreshData();\n  }\n\n  @override\n  Future<List<AppLiveCategory>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getCategores();\n\n    return result.map((e) => AppLiveCategory.fromLiveCategory(e)).toList();\n  }\n}\n\nclass AppLiveCategory extends LiveCategory {\n  var showAll = false.obs;\n  final List<LiveSubCategoryExt> childrenExt;\n  AppLiveCategory({\n    required super.id,\n    required super.name,\n    required super.children,\n  }) : childrenExt = children\n            .map((e) => LiveSubCategoryExt(\n                  id: e.id,\n                  name: e.name,\n                  parentId: e.parentId,\n                  pic: e.pic,\n                ))\n            .toList() {\n    showAll.value = children.length < 19;\n  }\n\n  List<LiveSubCategoryExt> get take15 => childrenExt.take(15).toList();\n\n  AppFocusNode moreFocusNode = AppFocusNode();\n\n  factory AppLiveCategory.fromLiveCategory(LiveCategory item) {\n    return AppLiveCategory(\n      children: item.children,\n      id: item.id,\n      name: item.name,\n    );\n  }\n}\n\nclass LiveSubCategoryExt extends LiveSubCategory {\n  LiveSubCategoryExt({\n    required super.id,\n    required super.name,\n    required super.parentId,\n    super.pic,\n  });\n\n  AppFocusNode focusNode = AppFocusNode();\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/category/category_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\nimport 'package:simple_live_tv_app/widgets/net_image.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/category/category_controller.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\n\nclass CategoryPage extends GetView<CategoryController> {\n  const CategoryPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"直播类目\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Visibility(\n                  visible: controller.loadding.value,\n                  child: SizedBox(\n                    width: 48.w,\n                    height: 48.w,\n                    child: CircularProgressIndicator(\n                      color: Colors.white,\n                      strokeWidth: 4.w,\n                    ),\n                  ),\n                ),\n              ),\n              //  AppStyle.hGap24,\n              // HighlightButton(\n              //   focusNode: AppFocusNode(),\n              //   iconData: Icons.refresh,\n              //   text: \"刷新\",\n              //   onTap: () {\n              //     controller.refreshData();\n              //   },\n              // ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap24,\n          Wrap(\n            alignment: WrapAlignment.center,\n            spacing: 36.w,\n            children: Sites.supportSites\n                .map(\n                  (e) => Obx(\n                    () => HighlightButton(\n                      icon: Image.asset(\n                        e.logo,\n                        width: 48.w,\n                        height: 48.w,\n                      ),\n                      text: e.name,\n                      selected: controller.siteId.value == e.id,\n                      focusNode: AppFocusNode(),\n                      onTap: () {\n                        controller.setSite(e.id);\n                      },\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Obx(\n              () => ListView.builder(\n                padding: AppStyle.edgeInsetsH48,\n                itemCount: controller.list.length,\n                controller: controller.scrollController,\n                itemBuilder: (_, i) {\n                  var item = controller.list[i];\n                  return Column(\n                    crossAxisAlignment: CrossAxisAlignment.stretch,\n                    children: [\n                      Padding(\n                        padding: AppStyle.edgeInsetsV32,\n                        child: Text(\n                          item.name,\n                          style: AppStyle.titleStyleWhite,\n                        ),\n                      ),\n                      Obx(\n                        () => GridView.count(\n                          shrinkWrap: true,\n                          padding: AppStyle.edgeInsetsV8,\n                          physics: const NeverScrollableScrollPhysics(),\n                          crossAxisCount: 8,\n                          crossAxisSpacing: 36.w,\n                          mainAxisSpacing: 36.w,\n                          children: item.showAll.value\n                              ? (item.childrenExt\n                                  .map(\n                                    (e) => buildSubCategory(e),\n                                  )\n                                  .toList())\n                              : (item.take15\n                                  .map(\n                                    (e) => buildSubCategory(e),\n                                  )\n                                  .toList()\n                                ..add(buildShowMore(item))),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildSubCategory(LiveSubCategoryExt item) {\n    return HighlightWidget(\n      focusNode: item.focusNode,\n      onTap: () {\n        AppNavigator.toCategoryDetail(site: controller.site, category: item);\n      },\n      color: Colors.white10,\n      borderRadius: AppStyle.radius16,\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: [\n          (item.pic != null && item.pic!.isNotEmpty)\n              ? NetImage(\n                  item.pic ?? \"\",\n                  width: 64.w,\n                  height: 64.w,\n                  borderRadius: 16.w,\n                  cacheWidth: 100,\n                )\n              : Image.asset(\n                  \"assets/images/${controller.site.id}.png\",\n                  width: 64.w,\n                  height: 64.w,\n                ),\n          AppStyle.vGap12,\n          Text(\n            item.name,\n            maxLines: 1,\n            textAlign: TextAlign.center,\n            style: item.focusNode.isFoucsed.value\n                ? AppStyle.textStyleBlack\n                : AppStyle.textStyleWhite,\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildShowMore(AppLiveCategory item) {\n    return HighlightWidget(\n      focusNode: item.moreFocusNode,\n      onTap: () {\n        item.showAll.value = true;\n      },\n      color: Colors.white10,\n      borderRadius: AppStyle.radius16,\n      child: Center(\n        child: Text(\n          \"显示全部\",\n          maxLines: 1,\n          textAlign: TextAlign.center,\n          style: item.moreFocusNode.isFoucsed.value\n              ? AppStyle.textStyleBlack\n              : AppStyle.textStyleWhite,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/category/detail/category_detail_controller.dart",
    "content": "import 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/category/category_controller.dart';\nimport 'package:simple_live_tv_app/modules/hot_live/hot_live_controller.dart';\n\nclass CategoryDetailController extends BasePageController<LiveRoomItemExt> {\n  final Site site;\n  final LiveSubCategoryExt subCategory;\n  CategoryDetailController({\n    required this.site,\n    required this.subCategory,\n  });\n\n  @override\n  void onInit() {\n    scrollController.addListener(scrollListener);\n    refreshData();\n    super.onInit();\n  }\n\n  void scrollListener() {\n    if (scrollController.position.pixels >=\n        (scrollController.position.maxScrollExtent - 100.w)) {\n      loadData();\n    }\n  }\n\n  @override\n  Future<List<LiveRoomItemExt>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getCategoryRooms(subCategory, page: page);\n    return result.items\n        .map(\n          (e) => LiveRoomItemExt(\n            roomId: e.roomId,\n            title: e.title,\n            cover: e.cover,\n            userName: e.userName,\n            online: e.online,\n          ),\n        )\n        .toList();\n  }\n\n  @override\n  void onClose() {\n    scrollController.removeListener(scrollListener);\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/category/detail/category_detail_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/modules/category/detail/category_detail_controller.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/live_room_card.dart';\n\nclass CategoryDetailPage extends GetView<CategoryDetailController> {\n  const CategoryDetailPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                controller.subCategory.name,\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Visibility(\n                  visible: controller.loadding.value,\n                  child: SizedBox(\n                    width: 48.w,\n                    height: 48.w,\n                    child: CircularProgressIndicator(\n                      color: Colors.white,\n                      strokeWidth: 4.w,\n                    ),\n                  ),\n                ),\n              ),\n              //AppStyle.hGap24,\n              // HighlightButton(\n              //   focusNode: AppFocusNode(),\n              //   iconData: Icons.refresh,\n              //   text: \"刷新\",\n              //   onTap: () {\n              //     controller.refreshData();\n              //   },\n              // ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Obx(\n              () => MasonryGridView.count(\n                padding: AppStyle.edgeInsetsA48,\n                itemCount: controller.list.length,\n                crossAxisCount: 5,\n                crossAxisSpacing: 48.w,\n                mainAxisSpacing: 40.w,\n                controller: controller.scrollController,\n                itemBuilder: (_, i) {\n                  var item = controller.list[i];\n\n                  if (i == 0) {\n                    Future.delayed(Duration.zero, () {\n                      if (controller.currentPage == 2) {\n                        item.focusNode.requestFocus();\n                      }\n                    });\n                  }\n                  return LiveRoomCard(\n                    cover: item.cover,\n                    anchor: item.userName,\n                    title: item.title,\n                    focusNode: item.focusNode,\n                    roomId: item.roomId,\n                    online: item.online,\n                    onTap: () {\n                      AppNavigator.toLiveRoomDetail(\n                        site: controller.site,\n                        roomId: item.roomId,\n                      );\n                    },\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/follow_user/follow_user_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/anchor_card.dart';\n\nclass FollowUserPage extends StatelessWidget {\n  const FollowUserPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"我的关注\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.refresh,\n                text: \"刷新\",\n                onTap: () {\n                  FollowUserService.instance.refreshData();\n                },\n              ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap48,\n          Expanded(\n            child: Obx(\n              () => MasonryGridView.count(\n                padding: AppStyle.edgeInsetsH48,\n                itemCount: FollowUserService.instance.list.length,\n                crossAxisCount: 3,\n                crossAxisSpacing: 48.w,\n                mainAxisSpacing: 40.w,\n                shrinkWrap: true,\n                physics: const NeverScrollableScrollPhysics(),\n                itemBuilder: (_, i) {\n                  var item = FollowUserService.instance.list[i];\n                  return AnchorCard(\n                    face: item.face,\n                    name: item.userName,\n                    siteId: item.siteId,\n                    liveStatus: item.liveStatus.value,\n                    roomId: item.roomId,\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/history/history_controller.dart",
    "content": "import 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/models/db/history.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\n\nclass HistoryController extends BasePageController<History> {\n  @override\n  void onInit() {\n    refreshData();\n    super.onInit();\n  }\n\n  @override\n  Future<List<History>> getData(int page, int pageSize) {\n    if (page > 1) {\n      return Future.value([]);\n    }\n    return Future.value(DBService.instance.getHistores());\n  }\n\n  void clean() async {\n    var result = await Utils.showAlertDialog(\"确定要清空观看记录吗?\", title: \"清空观看记录\");\n    if (!result) {\n      return;\n    }\n    await DBService.instance.historyBox.clear();\n    refreshData();\n  }\n\n  void removeItem(History item) async {\n    var result = await Utils.showAlertDialog(\"确定要删除此记录吗?\", title: \"删除记录\");\n    if (!result) {\n      return;\n    }\n    await DBService.instance.historyBox.delete(item.id);\n    refreshData();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/history/history_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/modules/history/history_controller.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/anchor_card.dart';\n\nclass HistoryPage extends GetView<HistoryController> {\n  const HistoryPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"观看记录\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.delete_outline_rounded,\n                text: \"清空\",\n                onTap: () {\n                  controller.clean();\n                },\n              ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap48,\n          Expanded(\n            child: Obx(\n              () => MasonryGridView.count(\n                padding: AppStyle.edgeInsetsH48,\n                itemCount: controller.list.length,\n                crossAxisCount: 3,\n                crossAxisSpacing: 48.w,\n                mainAxisSpacing: 40.w,\n                shrinkWrap: true,\n                physics: const NeverScrollableScrollPhysics(),\n                itemBuilder: (_, i) {\n                  var item = controller.list[i];\n                  return AnchorCard(\n                    face: item.face,\n                    name: item.userName,\n                    siteId: item.siteId,\n                    liveStatus: 0,\n                    roomId: item.roomId,\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/home/home_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:get/get.dart';\n\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\n\nimport 'package:simple_live_tv_app/routes/route_path.dart';\n\nclass HomeController extends BaseController {\n  var datetime = \"00:00\".obs;\n\n  @override\n  void onInit() {\n    initTimer();\n    super.onInit();\n  }\n\n  void initTimer() {\n    Timer.periodic(const Duration(seconds: 1), (timer) {\n      var now = DateTime.now();\n      datetime.value =\n          \"${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}\";\n    });\n  }\n\n  void toSync() {\n    Get.toNamed(RoutePath.kSync);\n  }\n\n  void toFollow() {\n    Get.toNamed(RoutePath.kFollow);\n  }\n\n  void toSettings() {\n    Get.toNamed(RoutePath.kSettings);\n  }\n\n  void toHistory() {\n    Get.toNamed(RoutePath.kHistory);\n  }\n\n  void toHotLive() {\n    Get.toNamed(RoutePath.kHotLive);\n  }\n\n  void toSearchRoom(String keyword) {\n    Get.toNamed(RoutePath.kSearchRoom, arguments: keyword);\n  }\n\n  void toSearchAnchor(String keyword) {\n    Get.toNamed(RoutePath.kSearchAnchor, arguments: keyword);\n  }\n\n  void toCategory() {\n    Get.toNamed(RoutePath.kCategory);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/home/home_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:lottie/lottie.dart';\nimport 'package:remixicon/remixicon.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/modules/home/home_controller.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_list_tile.dart';\nimport 'package:simple_live_tv_app/widgets/card/anchor_card.dart';\nimport 'package:simple_live_tv_app/widgets/button/home_big_button.dart';\nimport 'package:simple_live_tv_app/widgets/net_image.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_empty_widget.dart';\n\nclass HomePage extends GetView<HomeController> {\n  const HomePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              Text(\n                \"Simple Live TV\",\n                style: AppStyle.titleStyleWhite,\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Text(\n                  controller.datetime.value,\n                  style: AppStyle.titleStyleWhite.copyWith(fontSize: 36.w),\n                ),\n              ),\n              AppStyle.hGap32,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.settings,\n                text: \"设置\",\n                onTap: () {\n                  controller.toSettings();\n                },\n              ),\n              AppStyle.hGap48,\n            ],\n          ),\n          Expanded(\n            child: ListView(\n              padding: AppStyle.edgeInsetsV32,\n              children: [\n                Padding(\n                  padding: AppStyle.edgeInsetsH48,\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: [\n                      Expanded(\n                        child: HomeBigButton(\n                          autofocus: true,\n                          focusNode: AppFocusNode(),\n                          text: \"热门直播\",\n                          iconData: Remix.fire_line,\n                          onTap: controller.toHotLive,\n                        ),\n                      ),\n                      AppStyle.hGap48,\n                      Expanded(\n                        child: HomeBigButton(\n                          autofocus: true,\n                          focusNode: AppFocusNode(),\n                          text: \"直播类目\",\n                          iconData: Remix.apps_line,\n                          onTap: controller.toCategory,\n                        ),\n                      ),\n                      AppStyle.hGap48,\n                      Expanded(\n                        child: HomeBigButton(\n                          autofocus: true,\n                          focusNode: AppFocusNode(),\n                          text: \"搜索直播\",\n                          iconData: Remix.search_2_line,\n                          onTap: showSearchDialog,\n                        ),\n                      ),\n                      // AppStyle.hGap40,\n                      // Expanded(\n                      //   child: HomeBigButton(\n                      //     focusNode: AppFocusNode(),\n                      //     text: \"我的关注\",\n                      //     iconData: Icons.favorite_border,\n                      //     onTap: controller.toFollow,\n                      //   ),\n                      // ),\n                      AppStyle.hGap48,\n                      Expanded(\n                        child: HomeBigButton(\n                          focusNode: AppFocusNode(),\n                          text: \"观看记录\",\n                          iconData: Icons.history,\n                          onTap: controller.toHistory,\n                        ),\n                      ),\n                      AppStyle.hGap48,\n                      Expanded(\n                        child: HomeBigButton(\n                          focusNode: AppFocusNode(),\n                          text: \"数据同步\",\n                          iconData: Icons.devices,\n                          onTap: controller.toSync,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                AppStyle.vGap32,\n                Padding(\n                  padding: AppStyle.edgeInsetsH48,\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    children: [\n                      SizedBox(\n                        width: 64.w,\n                        height: 64.w,\n                        child: Center(\n                          child: Icon(\n                            Icons.favorite_border,\n                            color: Colors.white,\n                            size: 56.w,\n                          ),\n                        ),\n                      ),\n                      AppStyle.hGap24,\n                      Expanded(\n                        child: Text(\n                          \"我的关注\",\n                          style: AppStyle.titleStyleWhite,\n                        ),\n                      ),\n                      Obx(\n                        () => Visibility(\n                          visible: FollowUserService.instance.updating.value,\n                          child: Row(\n                            children: [\n                              SizedBox(\n                                width: 48.w,\n                                height: 48.w,\n                                child: CircularProgressIndicator(\n                                  color: Colors.white,\n                                  strokeWidth: 4.w,\n                                ),\n                              ),\n                              AppStyle.hGap16,\n                              Text(\n                                \"更新状态中...\",\n                                style: AppStyle.textStyleWhite,\n                              ),\n                            ],\n                          ),\n                        ),\n                      ),\n                      AppStyle.hGap16,\n                      HighlightButton(\n                        focusNode: AppFocusNode(),\n                        iconData: Icons.settings,\n                        text: \"管理\",\n                        onTap: showManageDialog,\n                      ),\n                      AppStyle.hGap32,\n                      HighlightButton(\n                        focusNode: AppFocusNode(),\n                        iconData: Icons.refresh,\n                        text: \"刷新\",\n                        onTap: () {\n                          FollowUserService.instance.refreshData();\n                        },\n                      ),\n                    ],\n                  ),\n                ),\n                AppStyle.vGap32,\n                Obx(\n                  () => MasonryGridView.count(\n                    padding: AppStyle.edgeInsetsH48,\n                    itemCount: FollowUserService.instance.list.length,\n                    crossAxisCount: 3,\n                    crossAxisSpacing: 48.w,\n                    mainAxisSpacing: 48.w,\n                    shrinkWrap: true,\n                    physics: const NeverScrollableScrollPhysics(),\n                    itemBuilder: (_, i) {\n                      var item = FollowUserService.instance.list[i];\n                      return Obx(\n                        () => AnchorCard(\n                          face: item.face,\n                          name: item.userName,\n                          siteId: item.siteId,\n                          liveStatus: item.liveStatus.value,\n                          roomId: item.roomId,\n                        ),\n                      );\n                    },\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: FollowUserService.instance.list.isEmpty,\n                    child: Column(\n                      children: [\n                        AppStyle.vGap24,\n                        LottieBuilder.asset(\n                          'assets/lotties/empty.json',\n                          width: 160.w,\n                          height: 160.w,\n                          repeat: false,\n                        ),\n                        AppStyle.vGap24,\n                        Text(\n                          \"暂无任何关注\\n您可以从其他端同步数据到此处\",\n                          textAlign: TextAlign.center,\n                          style: AppStyle.textStyleWhite,\n                        ),\n                        AppStyle.vGap16,\n                        HighlightButton(\n                          focusNode: AppFocusNode(),\n                          iconData: Icons.devices,\n                          text: \"同步数据\",\n                          onTap: () {\n                            controller.toSync();\n                          },\n                        ),\n                      ],\n                    ),\n                  ),\n                )\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showManageDialog() {\n    Utils.showSystemRightDialog(\n      //useSystem: true,\n      width: 700.w,\n      child: Column(\n        children: [\n          AppStyle.vGap24,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                onTap: () {\n                  //Utils.hideRightDialog();\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"关注管理\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n            ],\n          ),\n          Expanded(\n            child: Stack(\n              children: [\n                Obx(\n                  () => ListView.separated(\n                    itemCount: FollowUserService.instance.list.length,\n                    separatorBuilder: (_, __) => AppStyle.vGap24,\n                    padding: AppStyle.edgeInsetsA40,\n                    itemBuilder: (_, i) {\n                      var item = FollowUserService.instance.list[i];\n                      var foucsNode = AppFocusNode();\n                      return HighlightListTile(\n                        autofocus: i == 0,\n                        leading: NetImage(\n                          item.face,\n                          width: 64.w,\n                          height: 64.w,\n                          borderRadius: 64.w,\n                        ),\n                        title: item.userName,\n                        focusNode: foucsNode,\n                        trailing: Obx(\n                          () => Icon(\n                            Icons.delete_outline_outlined,\n                            size: 40.w,\n                            color: foucsNode.isFoucsed.value\n                                ? Colors.black\n                                : Colors.white,\n                          ),\n                        ),\n                        onTap: () {\n                          FollowUserService.instance\n                              .removeItem(item, refresh: false);\n                        },\n                      );\n                    },\n                  ),\n                ),\n                Obx(\n                  () => Visibility(\n                    visible: FollowUserService.instance.list.isEmpty,\n                    child: const AppEmptyWidget(\n                      text: \"关注列表为空，快去关注一些主播吧\",\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showSearchDialog() {\n    var textController = TextEditingController();\n    var mode = 0.obs;\n    var roomFocusNode = AppFocusNode()..isFoucsed.value = true;\n    var anchorFocusNode = AppFocusNode();\n    showDialog(\n      context: Get.context!,\n      builder: (_) => AlertDialog(\n        backgroundColor: Get.theme.cardColor,\n        surfaceTintColor: Colors.transparent,\n        shape: RoundedRectangleBorder(\n          borderRadius: AppStyle.radius16,\n        ),\n        contentPadding: AppStyle.edgeInsetsA48,\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Row(\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                Obx(\n                  () => HighlightButton(\n                    text: \"直播间\",\n                    iconData: Icons.live_tv,\n                    selected: mode.value == 0,\n                    focusNode: roomFocusNode,\n                    autofocus: roomFocusNode.isFoucsed.value,\n                    onTap: () {\n                      mode.value = 0;\n                    },\n                  ),\n                ),\n                AppStyle.hGap40,\n                Obx(\n                  () => HighlightButton(\n                    text: \"主播\",\n                    selected: mode.value == 1,\n                    iconData: Icons.person,\n                    focusNode: anchorFocusNode,\n                    autofocus: anchorFocusNode.isFoucsed.value,\n                    onTap: () {\n                      mode.value = 1;\n                    },\n                  ),\n                ),\n              ],\n            ),\n            AppStyle.vGap48,\n            SizedBox(\n              width: 700.w,\n              child: TextField(\n                controller: textController,\n                style: AppStyle.textStyleWhite,\n                textInputAction: TextInputAction.search,\n                onSubmitted: (e) {\n                  Get.back();\n                  if (e.isEmpty) {\n                    return;\n                  }\n                  if (mode.value == 0) {\n                    controller.toSearchRoom(textController.text);\n                  } else {\n                    controller.toSearchAnchor(textController.text);\n                  }\n                },\n                decoration: InputDecoration(\n                  hintText: mode.value == 0 ? \"点击输入关键字搜索\" : \"点击主播昵称搜索\",\n                  hintStyle: AppStyle.textStyleWhite,\n                  border: OutlineInputBorder(\n                    borderRadius: AppStyle.radius16,\n                    borderSide: BorderSide(width: 4.w),\n                  ),\n                  filled: true,\n                  isDense: true,\n                  fillColor: Get.theme.primaryColor,\n                  contentPadding: AppStyle.edgeInsetsA32,\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/hot_live/hot_live_controller.dart",
    "content": "import 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\n\nclass HotliveController extends BasePageController<LiveRoomItemExt> {\n  var siteId = Constant.kBiliBili.obs;\n  var site = Sites.allSites[Constant.kBiliBili]!;\n\n  @override\n  void onInit() {\n    scrollController.addListener(scrollListener);\n    refreshData();\n    super.onInit();\n  }\n\n  void scrollListener() {\n    if (scrollController.position.pixels >=\n        (scrollController.position.maxScrollExtent - 100.w)) {\n      loadData();\n    }\n  }\n\n  void setSite(String id) {\n    siteId.value = id;\n    site = Sites.allSites[id]!;\n    refreshData();\n  }\n\n  @override\n  Future<List<LiveRoomItemExt>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.getRecommendRooms(page: page);\n\n    return result.items\n        .map((e) => LiveRoomItemExt(\n              roomId: e.roomId,\n              title: e.title,\n              cover: e.cover,\n              userName: e.userName,\n              online: e.online,\n            ))\n        .toList();\n  }\n\n  @override\n  void onClose() {\n    scrollController.removeListener(scrollListener);\n    super.onClose();\n  }\n}\n\nclass LiveRoomItemExt extends LiveRoomItem {\n  LiveRoomItemExt({\n    required super.roomId,\n    required super.title,\n    required super.cover,\n    required super.userName,\n    super.online = 0,\n  });\n\n  AppFocusNode focusNode = AppFocusNode();\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/hot_live/hot_live_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/hot_live/hot_live_controller.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/live_room_card.dart';\n\nclass HotLivePage extends GetView<HotliveController> {\n  const HotLivePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                //autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"热门直播\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Visibility(\n                  visible: controller.loadding.value,\n                  child: SizedBox(\n                    width: 48.w,\n                    height: 48.w,\n                    child: CircularProgressIndicator(\n                      color: Colors.white,\n                      strokeWidth: 4.w,\n                    ),\n                  ),\n                ),\n              ),\n              AppStyle.hGap24,\n              // HighlightButton(\n              //   focusNode: AppFocusNode(),\n              //   iconData: Icons.refresh,\n              //   text: \"刷新\",\n              //   onTap: () {\n              //     controller.refreshData();\n              //   },\n              // ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap24,\n          Wrap(\n            alignment: WrapAlignment.center,\n            spacing: 36.w,\n            children: Sites.supportSites\n                .map(\n                  (e) => Obx(\n                    () => HighlightButton(\n                      icon: Image.asset(\n                        e.logo,\n                        width: 48.w,\n                        height: 48.w,\n                      ),\n                      text: e.name,\n                      selected: controller.siteId.value == e.id,\n                      focusNode: AppFocusNode(),\n                      onTap: () {\n                        controller.setSite(e.id);\n                      },\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Obx(\n              () => MasonryGridView.count(\n                padding: AppStyle.edgeInsetsA48,\n                itemCount: controller.list.length,\n                crossAxisCount: 5,\n                crossAxisSpacing: 48.w,\n                mainAxisSpacing: 40.w,\n                controller: controller.scrollController,\n                itemBuilder: (_, i) {\n                  var item = controller.list[i];\n\n                  if (i == 0) {\n                    Future.delayed(Duration.zero, () {\n                      if (controller.currentPage == 2) {\n                        item.focusNode.requestFocus();\n                      }\n                    });\n                  }\n                  return LiveRoomCard(\n                    cover: item.cover,\n                    anchor: item.userName,\n                    title: item.title,\n                    focusNode: item.focusNode,\n                    roomId: item.roomId,\n                    online: item.online,\n                    onTap: () {\n                      AppNavigator.toLiveRoomDetail(\n                        site: controller.site,\n                        roomId: item.roomId,\n                      );\n                    },\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/live_room/live_room_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:canvas_danmaku/models/danmaku_content_item.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/event_bus.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\nimport 'package:simple_live_tv_app/models/db/history.dart';\nimport 'package:simple_live_tv_app/modules/live_room/player/player_controller.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\n\nclass LiveRoomController extends PlayerController with WidgetsBindingObserver {\n  final Site pSite;\n  final String pRoomId;\n  late LiveDanmaku liveDanmaku;\n  LiveRoomController({\n    required this.pSite,\n    required this.pRoomId,\n  }) {\n    rxSite = pSite.obs;\n    rxRoomId = pRoomId.obs;\n    liveDanmaku = site.liveSite.getDanmaku();\n  }\n  final FocusNode focusNode = FocusNode();\n  late Rx<Site> rxSite;\n  Site get site => rxSite.value;\n  late Rx<String> rxRoomId;\n  String get roomId => rxRoomId.value;\n\n  Rx<LiveRoomDetail?> detail = Rx<LiveRoomDetail?>(null);\n  var online = 0.obs;\n  var followed = false.obs;\n  var liveStatus = false.obs;\n\n  /// 清晰度数据\n  RxList<LivePlayQuality> qualites = RxList<LivePlayQuality>();\n\n  /// 当前清晰度\n  var currentQuality = -1;\n  var currentQualityInfo = \"\".obs;\n\n  /// 线路数据\n  RxList<String> playUrls = RxList<String>();\n\n  Map<String, String>? playHeaders;\n\n  /// 当前线路\n  var currentLineIndex = -1;\n  var currentLineInfo = \"\".obs;\n\n  /// 是否处于后台\n  var isBackground = false;\n\n  var datetime = \"00:00\".obs;\n\n  void initTimer() {\n    Timer.periodic(const Duration(seconds: 1), (timer) {\n      var now = DateTime.now();\n      datetime.value =\n          \"${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}\";\n    });\n  }\n\n  /// 双击退出Flag\n  bool doubleClickExit = false;\n\n  /// 双击退出Timer\n  Timer? doubleClickTimer;\n\n  @override\n  void onInit() {\n    initTimer();\n    showDanmakuState.value = AppSettingsController.instance.danmuEnable.value;\n    followed.value = DBService.instance.getFollowExist(\"${site.id}_$roomId\");\n\n    loadData();\n\n    super.onInit();\n  }\n\n  void refreshRoom() {\n    //messages.clear();\n\n    liveDanmaku.stop();\n\n    loadData();\n  }\n\n  /// 初始化弹幕接收事件\n  void initDanmau() {\n    liveDanmaku.onMessage = onWSMessage;\n  }\n\n  /// 接收到WebSocket信息\n  void onWSMessage(LiveMessage msg) {\n    if (msg.type == LiveMessageType.chat) {\n      // 关键词屏蔽检查\n      for (var keyword in AppSettingsController.instance.shieldList) {\n        Pattern? pattern;\n        if (Utils.isRegexFormat(keyword)) {\n          String removedSlash = Utils.removeRegexFormat(keyword);\n          try {\n            pattern = RegExp(removedSlash);\n          } catch (e) {\n            // should avoid this during add keyword\n            Log.d(\"关键词：$keyword 正则格式错误\");\n          }\n        } else {\n          pattern = keyword;\n        }\n        if (pattern != null && msg.message.contains(pattern)) {\n          Log.d(\"关键词：$keyword\\n已屏蔽消息内容：${msg.message}\");\n          return;\n        }\n      }\n\n      if (!liveStatus.value || isBackground) {\n        return;\n      }\n\n      addDanmaku([\n        DanmakuContentItem(\n          msg.message,\n          color: Color.fromARGB(255, msg.color.r, msg.color.g, msg.color.b),\n        ),\n      ]);\n    } else if (msg.type == LiveMessageType.online) {\n      online.value = msg.data;\n    } else if (msg.type == LiveMessageType.superChat) {\n      //superChats.add(msg.data);\n    }\n  }\n\n  /// 加载直播间信息\n  void loadData() async {\n    try {\n      SmartDialog.showLoading(msg: \"\");\n      pageLoadding.value = true;\n      detail.value = await site.liveSite.getRoomDetail(roomId: roomId);\n\n      addHistory();\n      online.value = detail.value!.online;\n      liveStatus.value = detail.value!.status || detail.value!.isRecord;\n      if (liveStatus.value) {\n        getPlayQualites();\n      }\n      if (detail.value!.isRecord) {\n        SmartDialog.showToast(\"当前主播未开播，正在轮播录像\");\n      }\n\n      initDanmau();\n      liveDanmaku.start(detail.value?.danmakuData);\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    } finally {\n      SmartDialog.dismiss(status: SmartStatus.loading);\n      pageLoadding.value = false;\n    }\n  }\n\n  /// 初始化播放器\n  void getPlayQualites() async {\n    qualites.clear();\n    currentQuality = -1;\n    try {\n      var playQualites =\n          await site.liveSite.getPlayQualites(detail: detail.value!);\n\n      if (playQualites.isEmpty) {\n        SmartDialog.showToast(\"无法读取播放清晰度\");\n        return;\n      }\n      qualites.value = playQualites;\n      var qualityLevel = AppSettingsController.instance.qualityLevel.value;\n      if (qualityLevel == 2) {\n        //最高\n        currentQuality = 0;\n      } else if (qualityLevel == 0) {\n        //最低\n        currentQuality = playQualites.length - 1;\n      } else {\n        //中间值\n        int middle = (playQualites.length / 2).floor();\n        currentQuality = middle;\n      }\n\n      getPlayUrl();\n    } catch (e) {\n      Log.logPrint(e);\n      SmartDialog.showToast(\"无法读取播放清晰度\");\n    }\n  }\n\n  void getPlayUrl() async {\n    playUrls.clear();\n    currentQualityInfo.value = qualites[currentQuality].quality;\n    currentLineInfo.value = \"\";\n    currentLineIndex = -1;\n    var playUrl = await site.liveSite\n        .getPlayUrls(detail: detail.value!, quality: qualites[currentQuality]);\n    if (playUrl.urls.isEmpty) {\n      SmartDialog.showToast(\"无法读取播放地址\");\n      return;\n    }\n    playUrls.value = playUrl.urls;\n    playHeaders = playUrl.headers;\n    currentLineIndex = 0;\n    currentLineInfo.value = \"线路${currentLineIndex + 1}\";\n    //重置错误次数\n    mediaErrorRetryCount = 0;\n    setPlayer();\n  }\n\n  void changePlayLine(int index) {\n    currentLineIndex = index;\n    //重置错误次数\n    mediaErrorRetryCount = 0;\n    setPlayer();\n  }\n\n  void setPlayer() async {\n    currentLineInfo.value = \"线路${currentLineIndex + 1}\";\n    errorMsg.value = \"\";\n    // 初始化播放器并设置 ao 参数\n    await initializePlayer();\n    player.open(\n      Media(\n        playUrls[currentLineIndex],\n        httpHeaders: playHeaders,\n      ),\n    );\n\n    Log.d(\"播放链接\\r\\n：${playUrls[currentLineIndex]}\");\n  }\n\n  @override\n  void mediaEnd() async {\n    if (mediaErrorRetryCount < 2) {\n      Log.d(\"播放结束，尝试第${mediaErrorRetryCount + 1}次刷新\");\n      if (mediaErrorRetryCount == 1) {\n        //延迟一秒再刷新\n        await Future.delayed(const Duration(seconds: 1));\n      }\n      mediaErrorRetryCount += 1;\n      //刷新一次\n      setPlayer();\n      return;\n    }\n\n    Log.d(\"播放结束\");\n    // 遍历线路，如果全部链接都断开就是直播结束了\n    if (playUrls.length - 1 == currentLineIndex) {\n      liveStatus.value = false;\n    } else {\n      changePlayLine(currentLineIndex + 1);\n\n      //setPlayer();\n    }\n  }\n\n  int mediaErrorRetryCount = 0;\n  @override\n  void mediaError(String error) async {\n    if (mediaErrorRetryCount < 2) {\n      Log.d(\"播放失败，尝试第${mediaErrorRetryCount + 1}次刷新\");\n      if (mediaErrorRetryCount == 1) {\n        //延迟一秒再刷新\n        await Future.delayed(const Duration(seconds: 1));\n      }\n      mediaErrorRetryCount += 1;\n      //刷新一次\n      setPlayer();\n      return;\n    }\n\n    if (playUrls.length - 1 == currentLineIndex) {\n      errorMsg.value = \"播放失败\";\n      SmartDialog.showToast(\"播放失败:$error\");\n    } else {\n      //currentLineIndex += 1;\n      //setPlayer();\n      changePlayLine(currentLineIndex + 1);\n    }\n  }\n\n  /// 添加历史记录\n  void addHistory() {\n    if (detail.value == null) {\n      return;\n    }\n    var id = \"${site.id}_$roomId\";\n    var history = DBService.instance.getHistory(id);\n    if (history != null) {\n      history.updateTime = DateTime.now();\n    }\n    history ??= History(\n      id: id,\n      roomId: roomId,\n      siteId: site.id,\n      userName: detail.value?.userName ?? \"\",\n      face: detail.value?.userAvatar ?? \"\",\n      updateTime: DateTime.now(),\n    );\n\n    DBService.instance.addOrUpdateHistory(history);\n  }\n\n  /// 关注用户\n  void followUser() {\n    if (detail.value == null) {\n      return;\n    }\n    var id = \"${site.id}_$roomId\";\n    DBService.instance.addFollow(\n      FollowUser(\n        id: id,\n        roomId: roomId,\n        siteId: site.id,\n        userName: detail.value?.userName ?? \"\",\n        face: detail.value?.userAvatar ?? \"\",\n        addTime: DateTime.now(),\n      ),\n    );\n    followed.value = true;\n    EventBus.instance.emit(Constant.kUpdateFollow, id);\n    SmartDialog.showToast(\"已关注\");\n  }\n\n  /// 取消关注用户\n  void removeFollowUser() async {\n    if (detail.value == null) {\n      return;\n    }\n    // if (!await Utils.showAlertDialog(\"确定要取消关注该用户吗？\", title: \"取消关注\")) {\n    //   return;\n    // }\n\n    var id = \"${site.id}_$roomId\";\n    DBService.instance.deleteFollow(id);\n    followed.value = false;\n    EventBus.instance.emit(Constant.kUpdateFollow, id);\n    SmartDialog.showToast(\"已取消关注\");\n  }\n\n  void resetRoom(Site site, String roomId) async {\n    if (this.site == site && this.roomId == roomId) {\n      return;\n    }\n\n    rxSite.value = site;\n    rxRoomId.value = roomId;\n\n    // 清除全部消息\n    liveDanmaku.stop();\n\n    danmakuController?.clear();\n\n    // 重新设置LiveDanmaku\n    liveDanmaku = site.liveSite.getDanmaku();\n\n    // 停止播放\n    await player.stop();\n\n    // 刷新信息\n    loadData();\n  }\n\n  void nextChannel() {\n    //读取正在直播的频道\n    var liveChannels = FollowUserService.instance.livingList;\n    if (liveChannels.isEmpty) {\n      SmartDialog.showToast(\"没有正在直播的频道\");\n      return;\n    }\n    var index = liveChannels\n        .indexWhere((element) => element.id == \"${site.id}_$roomId\");\n    // if (index == -1) {\n    //   //当前频道不在列表中\n\n    //   return;\n    // }\n    index += 1;\n    if (index >= liveChannels.length) {\n      index = 0;\n    }\n    var nextChannel = liveChannels[index];\n\n    resetRoom(Sites.allSites[nextChannel.siteId]!, nextChannel.roomId);\n  }\n\n  void prevChannel() {\n    //读取正在直播的频道\n    var liveChannels = FollowUserService.instance.livingList;\n    if (liveChannels.isEmpty) {\n      SmartDialog.showToast(\"没有正在直播的频道\");\n      return;\n    }\n    var index = liveChannels\n        .indexWhere((element) => element.id == \"${site.id}_$roomId\");\n    // if (index == -1) {\n    //   //当前频道不在列表中\n\n    //   return;\n    // }\n    index -= 1;\n    if (index < 0) {\n      index = liveChannels.length - 1;\n    }\n    var nextChannel = liveChannels[index];\n\n    resetRoom(Sites.allSites[nextChannel.siteId]!, nextChannel.roomId);\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    super.didChangeAppLifecycleState(state);\n\n    if (state == AppLifecycleState.paused) {\n      Log.d(\"进入后台\");\n      //进入后台，关闭弹幕\n      danmakuController?.clear();\n      isBackground = true;\n    } else\n    //返回前台\n    if (state == AppLifecycleState.resumed) {\n      Log.d(\"返回前台\");\n      isBackground = false;\n    }\n  }\n\n  @override\n  void onClose() {\n    liveDanmaku.stop();\n\n    danmakuController = null;\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/live_room/live_room_page.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_tv_app/modules/live_room/player/player_controls.dart';\n\nclass LiveRoomPage extends GetView<LiveRoomController> {\n  const LiveRoomPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return PopScope(\n      canPop: false,\n      onPopInvokedWithResult: (didPop, result) {\n        if (!didPop) {\n          //双击返回键退出\n          if (controller.doubleClickExit) {\n            controller.doubleClickTimer?.cancel();\n            Get.back();\n            return;\n          }\n          controller.doubleClickExit = true;\n          SmartDialog.showToast(\"再按一次退出播放器\");\n          controller.doubleClickTimer = Timer(const Duration(seconds: 2), () {\n            controller.doubleClickExit = false;\n            controller.doubleClickTimer!.cancel();\n          });\n        }\n      },\n      child: KeyboardListener(\n        focusNode: controller.focusNode,\n        autofocus: true,\n        onKeyEvent: onKeyEvent,\n        child: Scaffold(\n          backgroundColor: Colors.black,\n          body: Obx(\n            () => buildMediaPlayer(),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void onKeyEvent(KeyEvent key) {\n    if (key is KeyUpEvent) {\n      return;\n    }\n    Log.logPrint(key);\n\n    // if (key.logicalKey == LogicalKeyboardKey.escape ||\n    //     key.logicalKey == LogicalKeyboardKey.backspace ||\n    //     key.logicalKey == LogicalKeyboardKey.goBack) {\n    //   // Get.back();\n    //   return;\n    // }\n    // 点击OK、Enter、Select键时显示/隐藏控制器\n    if (key.logicalKey == LogicalKeyboardKey.select ||\n        key.logicalKey == LogicalKeyboardKey.enter ||\n        key.logicalKey == LogicalKeyboardKey.space) {\n      if (!controller.showControlsState.value) {\n        controller.showControls();\n      } else {\n        controller.hideControls();\n      }\n      return;\n    }\n\n    // 点击Menu打开/关闭设置\n    if (key.logicalKey == LogicalKeyboardKey.keyM ||\n        key.logicalKey == LogicalKeyboardKey.contextMenu ||\n        key.logicalKey == LogicalKeyboardKey.arrowRight) {\n      showPlayerSettings(controller);\n      return;\n    }\n\n    // 点击左键显示关注用户\n    if (key.logicalKey == LogicalKeyboardKey.arrowLeft) {\n      showFollowUser(controller);\n      return;\n    }\n\n    // // 点击右键关注/取消关注\n    // if (key.logicalKey == LogicalKeyboardKey.arrowRight) {\n    //   if (controller.followed.value) {\n    //     controller.removeFollowUser();\n    //   } else {\n    //     controller.followUser();\n    //   }\n\n    //   return;\n    // }\n\n    // 点击上键切换上一个直播\n    if (key.logicalKey == LogicalKeyboardKey.arrowUp) {\n      controller.prevChannel();\n      return;\n    }\n\n    // 点击下键切换下一个直播\n    if (key.logicalKey == LogicalKeyboardKey.arrowDown) {\n      controller.nextChannel();\n      return;\n    }\n  }\n\n  Widget buildMediaPlayer() {\n    var boxFit = BoxFit.contain;\n    double? aspectRatio;\n    if (AppSettingsController.instance.scaleMode.value == 0) {\n      boxFit = BoxFit.contain;\n    } else if (AppSettingsController.instance.scaleMode.value == 1) {\n      boxFit = BoxFit.fill;\n    } else if (AppSettingsController.instance.scaleMode.value == 2) {\n      boxFit = BoxFit.cover;\n    } else if (AppSettingsController.instance.scaleMode.value == 3) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 16 / 9;\n    } else if (AppSettingsController.instance.scaleMode.value == 4) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 4 / 3;\n    }\n    return Stack(\n      children: [\n        Video(\n          key: controller.globalPlayerKey,\n          controller: controller.videoController,\n          pauseUponEnteringBackgroundMode:\n              AppSettingsController.instance.playerAutoPause.value,\n          resumeUponEnteringForegroundMode:\n              AppSettingsController.instance.playerAutoPause.value,\n          controls: (state) {\n            return playerControls(state, controller);\n          },\n          aspectRatio: aspectRatio,\n          fit: boxFit,\n        ),\n        Obx(\n          () => Visibility(\n            visible:\n                !controller.liveStatus.value && !controller.pageLoadding.value,\n            child: Center(\n              child: Text(\n                \"未开播\",\n                style: AppStyle.textStyleWhite,\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/live_room/player/player_controller.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter/material.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:wakelock_plus/wakelock_plus.dart';\n\nmixin PlayerMixin {\n  GlobalKey<VideoState> globalPlayerKey = GlobalKey<VideoState>();\n  GlobalKey globalDanmuKey = GlobalKey();\n\n  /// 播放器实例\n  late final player = Player(\n    configuration: const PlayerConfiguration(\n      title: \"Simple Live Player\",\n      // bufferSize:\n      //     // media-kit #549\n      //     AppSettingsController.instance.playerBufferSize.value * 1024 * 1024,\n    ),\n  );\n\n  /// 初始化播放器并设置 ao 参数\n  Future<void> initializePlayer() async {\n    var pp = player.platform as NativePlayer;\n\n    // media_kit 仓库更新导致的问题，临时解决办法\n    if (Platform.isAndroid) {\n      await pp.setProperty('force-seekable', 'yes');\n    }\n  }\n\n  /// 视频控制器\n  late final videoController = VideoController(\n    player,\n    configuration: AppSettingsController.instance.playerCompatMode.value\n        ? const VideoControllerConfiguration(\n            vo: 'mediacodec_embed',\n            hwdec: 'mediacodec',\n          )\n        : VideoControllerConfiguration(\n            enableHardwareAcceleration:\n                AppSettingsController.instance.hardwareDecode.value,\n            androidAttachSurfaceAfterVideoParameters: false,\n          ),\n  );\n}\nmixin PlayerStateMixin on PlayerMixin {\n  /// 是否显示弹幕\n  RxBool showDanmakuState = false.obs;\n\n  /// 是否显示控制器\n  RxBool showControlsState = false.obs;\n\n  /// 是否显示设置窗口\n  RxBool showSettingState = false.obs;\n\n  /// 是否显示弹幕设置窗口\n  RxBool showDanmakuSettingState = false.obs;\n\n  /// 是否处于锁定控制器状态\n  RxBool lockControlsState = false.obs;\n\n  /// 是否处于全屏状态\n  RxBool fullScreenState = false.obs;\n\n  /// 显示手势Tip\n  RxBool showGestureTip = false.obs;\n\n  /// 手势Tip文本\n  RxString gestureTipText = \"\".obs;\n\n  /// 显示提示底部Tip\n  RxBool showBottomTip = false.obs;\n\n  /// 提示底部Tip文本\n  RxString bottomTipText = \"\".obs;\n\n  /// 自动隐藏控制器计时器\n  Timer? hideControlsTimer;\n\n  /// 自动隐藏提示计时器\n  Timer? hideSeekTipTimer;\n\n  Widget? danmakuView;\n\n  var showQualites = false.obs;\n  var showLines = false.obs;\n\n  /// 隐藏控制器\n  void hideControls() {\n    showControlsState.value = false;\n    hideControlsTimer?.cancel();\n  }\n\n  void setLockState() {\n    lockControlsState.value = !lockControlsState.value;\n    if (lockControlsState.value) {\n      showControlsState.value = false;\n    } else {\n      showControlsState.value = true;\n    }\n  }\n\n  /// 显示控制器\n  void showControls() {\n    showControlsState.value = true;\n    resetHideControlsTimer();\n  }\n\n  /// 开始隐藏控制器计时\n  /// - 当点击控制器上时功能时需要重新计时\n  void resetHideControlsTimer() {\n    hideControlsTimer?.cancel();\n\n    hideControlsTimer = Timer(\n      const Duration(\n        seconds: 5,\n      ),\n      hideControls,\n    );\n  }\n\n  void updateScaleMode() {\n    var boxFit = BoxFit.contain;\n    double? aspectRatio;\n    if (player.state.width != null && player.state.height != null) {\n      aspectRatio = player.state.width! / player.state.height!;\n    }\n\n    if (AppSettingsController.instance.scaleMode.value == 0) {\n      boxFit = BoxFit.contain;\n    } else if (AppSettingsController.instance.scaleMode.value == 1) {\n      boxFit = BoxFit.fill;\n    } else if (AppSettingsController.instance.scaleMode.value == 2) {\n      boxFit = BoxFit.cover;\n    } else if (AppSettingsController.instance.scaleMode.value == 3) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 16 / 9;\n    } else if (AppSettingsController.instance.scaleMode.value == 4) {\n      boxFit = BoxFit.contain;\n      aspectRatio = 4 / 3;\n    }\n    globalPlayerKey.currentState?.update(\n      aspectRatio: aspectRatio,\n      fit: boxFit,\n    );\n  }\n}\nmixin PlayerDanmakuMixin on PlayerStateMixin {\n  /// 弹幕控制器\n  DanmakuController? danmakuController;\n\n  void initDanmakuController(DanmakuController e) {\n    danmakuController = e;\n    // danmakuController?.updateOption(\n    //   DanmakuOption(\n    //     fontSize: AppSettingsController.instance.danmuSize.value.w,\n    //     area: AppSettingsController.instance.danmuArea.value,\n    //     duration: AppSettingsController.instance.danmuSpeed.value,\n    //     opacity: AppSettingsController.instance.danmuOpacity.value,\n    //     strokeWidth: AppSettingsController.instance.danmuStrokeWidth.value.w,\n    //   ),\n    // );\n  }\n\n  void updateDanmuOption(DanmakuOption? option) {\n    if (danmakuController == null || option == null) return;\n    danmakuController!.updateOption(option);\n  }\n\n  void disposeDanmakuController() {\n    danmakuController?.clear();\n  }\n\n  void addDanmaku(List<DanmakuContentItem> items) {\n    if (!showDanmakuState.value) {\n      return;\n    }\n    for (var item in items) {\n      danmakuController?.addDanmaku(item);\n    }\n  }\n}\nmixin PlayerSystemMixin on PlayerMixin, PlayerStateMixin, PlayerDanmakuMixin {\n  final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n\n  /// 初始化一些系统状态\n  void initSystem() async {\n    // 屏幕常亮\n    WakelockPlus.enable();\n\n    // 开始隐藏计时\n    resetHideControlsTimer();\n  }\n\n  /// 释放一些系统状态\n  Future resetSystem() async {\n    await WakelockPlus.disable();\n  }\n\n  /// 是否是IOS16以下\n  Future<bool> beforeIOS16() async {\n    if (Platform.isIOS) {\n      var info = await deviceInfo.iosInfo;\n      var version = info.systemVersion;\n      var versionInt = int.tryParse(version.split('.').first) ?? 0;\n      return versionInt < 16;\n    } else {\n      return false;\n    }\n  }\n}\n\nclass PlayerController extends BaseController\n    with PlayerMixin, PlayerStateMixin, PlayerDanmakuMixin, PlayerSystemMixin {\n  @override\n  void onInit() {\n    initSystem();\n    initStream();\n    super.onInit();\n  }\n\n  var width = 0.obs;\n  var height = 0.obs;\n\n  StreamSubscription<String>? _errorSubscription;\n  StreamSubscription? _completedSubscription;\n  StreamSubscription? _widthSubscription;\n  StreamSubscription? _heightSubscription;\n  StreamSubscription? _logSubscription;\n\n  void initStream() {\n    _errorSubscription = player.stream.error.listen((event) {\n      Log.d(\"播放器错误：$event\");\n      if (event.contains('no sound.')) {\n        return;\n      }\n      //SmartDialog.showToast(event);\n      mediaError(event);\n    });\n\n    _completedSubscription = player.stream.completed.listen((event) {\n      if (event) {\n        mediaEnd();\n      }\n    });\n    _logSubscription = player.stream.log.listen((event) {\n      Log.d(\"播放器日志：$event\");\n    });\n    _widthSubscription = player.stream.width.listen((event) {\n      Log.w(\n          'width:$event  W:${(player.state.width)}  H:${(player.state.height)}');\n      width.value = event ?? 0;\n      // isVertical.value =\n      //     (player.state.height ?? 9) > (player.state.width ?? 16);\n    });\n    _heightSubscription = player.stream.height.listen((event) {\n      Log.w(\n          'height:$event  W:${(player.state.width)}  H:${(player.state.height)}');\n      height.value = event ?? 0;\n      // isVertical.value =\n      //     (player.state.height ?? 9) > (player.state.width ?? 16);\n    });\n  }\n\n  void disposeStream() {\n    _errorSubscription?.cancel();\n    _completedSubscription?.cancel();\n    _widthSubscription?.cancel();\n    _heightSubscription?.cancel();\n    _logSubscription?.cancel();\n  }\n\n  void mediaEnd() {}\n\n  void mediaError(String error) {}\n\n  @override\n  void onClose() async {\n    Log.w(\"播放器关闭\");\n    disposeStream();\n    disposeDanmakuController();\n    await resetSystem();\n    await player.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/live_room/player/player_controls.dart",
    "content": "import 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/anchor_card.dart';\nimport 'package:simple_live_tv_app/widgets/settings_item_widget.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_empty_widget.dart';\n\nWidget playerControls(VideoState videoState, LiveRoomController controller) {\n  return buildControls(videoState, controller);\n}\n\nWidget buildControls(VideoState videoState, LiveRoomController controller) {\n  return Stack(\n    children: [\n      Container(),\n      buildDanmuView(videoState, controller),\n      // 点击播放器打开设置\n      Positioned.fill(\n        child: GestureDetector(onTap: () => showPlayerSettings(controller)),\n      ),\n      Center(\n        child: // 中间\n            StreamBuilder(\n          stream: videoState.widget.controller.player.stream.buffering,\n          initialData: videoState.widget.controller.player.state.buffering,\n          builder: (_, s) => Visibility(\n            visible: s.data ?? false,\n            child: SizedBox(\n              width: 64.w,\n              height: 64.w,\n              child: CircularProgressIndicator(\n                strokeWidth: 8.w,\n                color: Colors.white,\n              ),\n            ),\n          ),\n        ),\n      ),\n\n      // 顶部\n      Obx(\n        () => AnimatedPositioned(\n          left: 0,\n          right: 0,\n          top: (controller.showControlsState.value &&\n                  !controller.lockControlsState.value)\n              ? 0\n              : -200.w,\n          duration: const Duration(milliseconds: 200),\n          child: Container(\n            padding: EdgeInsets.only(\n              left: 32.w,\n              right: 32.w,\n              top: 24.w,\n              bottom: 24.w,\n            ),\n            decoration: const BoxDecoration(\n              gradient: LinearGradient(\n                begin: Alignment.bottomCenter,\n                end: Alignment.topCenter,\n                colors: [Colors.transparent, Colors.black87],\n              ),\n            ),\n            child: Row(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.stretch,\n                    children: [\n                      Text(\n                        controller.detail.value?.title ?? '正在读取直播信息...',\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: AppStyle.textStyleWhite,\n                      ),\n                      Text(\n                        \"${controller.detail.value?.userName} · ${controller.followed.value ? \"已关注\" : \"未关注\"}\",\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: AppStyle.textStyleWhite.copyWith(fontSize: 24.w),\n                      ),\n                    ],\n                  ),\n                ),\n                Obx(\n                  () => Text(\n                    controller.datetime.value,\n                    style: AppStyle.titleStyleWhite,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n      // 底部\n      Obx(\n        () => AnimatedPositioned(\n          left: 0,\n          right: 0,\n          bottom: (controller.showControlsState.value &&\n                  !controller.lockControlsState.value)\n              ? 0\n              : -300.w,\n          duration: const Duration(milliseconds: 200),\n          child: Container(\n            decoration: const BoxDecoration(\n              gradient: LinearGradient(\n                begin: Alignment.topCenter,\n                end: Alignment.bottomCenter,\n                colors: [Colors.transparent, Colors.black87],\n              ),\n            ),\n            padding: EdgeInsets.only(\n              left: 32.w,\n              right: 32.w,\n              bottom: 24.w,\n              top: 24.w,\n            ),\n            child: Column(\n              children: [\n                Row(\n                  children: [\n                    //清晰度\n                    Obx(\n                      () => Text(\n                        \"清晰度: ${controller.currentQualityInfo.value}\",\n                        style: AppStyle.textStyleWhite,\n                      ),\n                    ),\n                    //线路\n                    AppStyle.hGap32,\n                    Obx(\n                      () => Text(\n                        \"线路：${controller.currentLineInfo.value}\",\n                        style: AppStyle.textStyleWhite,\n                      ),\n                    ),\n                    //弹幕开关\n                    AppStyle.hGap32,\n                    Obx(\n                      () => Text(\n                        \"弹幕: ${controller.showDanmakuState.value ? \"开\" : \"关\"}\",\n                        style: AppStyle.textStyleWhite,\n                      ),\n                    ),\n                    //分辨率\n                    AppStyle.hGap32,\n                    Obx(\n                      () => Text(\n                        \"分辨率: ${controller.width.value}x${controller.height.value}\",\n                        style: AppStyle.textStyleWhite,\n                      ),\n                    ),\n                  ],\n                ),\n                AppStyle.vGap12,\n                Row(\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  children: [\n                    Icon(\n                      Icons.arrow_circle_up_rounded,\n                      color: Colors.white,\n                      size: 40.w,\n                    ),\n                    AppStyle.hGap16,\n                    Text(\"上一频道\", style: AppStyle.textStyleWhite),\n                    AppStyle.hGap32,\n                    Icon(\n                      Icons.arrow_circle_down_rounded,\n                      color: Colors.white,\n                      size: 40.w,\n                    ),\n                    AppStyle.hGap16,\n                    Text(\"下一频道\", style: AppStyle.textStyleWhite),\n                    AppStyle.hGap32,\n                    Icon(\n                      Icons.arrow_circle_left_outlined,\n                      color: Colors.white,\n                      size: 40.w,\n                    ),\n                    AppStyle.hGap16,\n                    Text(\"关注列表\", style: AppStyle.textStyleWhite),\n                    AppStyle.hGap32,\n                    Icon(\n                      Icons.arrow_circle_right_outlined,\n                      color: Colors.white,\n                      size: 40.w,\n                    ),\n                    AppStyle.hGap16,\n                    Icon(Icons.menu, color: Colors.white, size: 44.w),\n                    AppStyle.hGap16,\n                    Text(\"设置\", style: AppStyle.textStyleWhite),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    ],\n  );\n}\n\nWidget buildDanmuView(VideoState videoState, LiveRoomController controller) {\n  var padding = MediaQuery.of(videoState.context).padding;\n  controller.danmakuView ??= DanmakuScreen(\n    key: controller.globalDanmuKey,\n    createdController: controller.initDanmakuController,\n    option: DanmakuOption(\n      fontSize: AppSettingsController.instance.danmuSize.value.w,\n      area: AppSettingsController.instance.danmuArea.value,\n      duration: AppSettingsController.instance.danmuSpeed.value.toInt(),\n      opacity: AppSettingsController.instance.danmuOpacity.value,\n    ),\n  );\n  return Positioned.fill(\n    top: padding.top,\n    bottom: padding.bottom,\n    child: Obx(\n      () => Offstage(\n        offstage: !controller.showDanmakuState.value,\n        child: Padding(\n          padding: controller.fullScreenState.value\n              ? EdgeInsets.only(\n                  top: AppSettingsController.instance.danmuTopMargin.value,\n                  bottom:\n                      AppSettingsController.instance.danmuBottomMargin.value,\n                )\n              : EdgeInsets.zero,\n          child: controller.danmakuView!,\n        ),\n      ),\n    ),\n  );\n}\n\n// void showLinesInfo(LiveRoomController controller) {\n//   Utils.showRightDialog(\n//     title: \"线路\",\n//     useSystem: true,\n//     child: ListView.builder(\n//       padding: EdgeInsets.zero,\n//       itemCount: controller.playUrls.length,\n//       itemBuilder: (_, i) {\n//         return ListTile(\n//           selected: controller.currentLineIndex == i,\n//           title: Text.rich(\n//             TextSpan(\n//               text: \"线路${i + 1}\",\n//               children: [\n//                 WidgetSpan(\n//                     child: Container(\n//                   decoration: BoxDecoration(\n//                     borderRadius: AppStyle.radius4,\n//                     border: Border.all(\n//                       color: Colors.grey,\n//                     ),\n//                   ),\n//                   padding: AppStyle.edgeInsetsH4,\n//                   margin: AppStyle.edgeInsetsL8,\n//                   child: Text(\n//                     controller.playUrls[i].contains(\".flv\") ? \"FLV\" : \"HLS\",\n//                     style: const TextStyle(\n//                       fontSize: 12,\n//                     ),\n//                   ),\n//                 )),\n//               ],\n//             ),\n//             style: const TextStyle(fontSize: 14),\n//           ),\n//           minLeadingWidth: 16,\n//           onTap: () {\n//             Utils.hideRightDialog();\n//             //controller.currentLineIndex = i;\n//             //controller.setPlayer();\n//             controller.changePlayLine(i);\n//           },\n//         );\n//       },\n//     ),\n//   );\n// }\n\n// void showQualitesInfo(LiveRoomController controller) {\n//   Utils.showRightDialog(\n//     title: \"清晰度\",\n//     useSystem: true,\n//     child: ListView.builder(\n//       padding: EdgeInsets.zero,\n//       itemCount: controller.qualites.length,\n//       itemBuilder: (_, i) {\n//         var item = controller.qualites[i];\n//         return ListTile(\n//           selected: controller.currentQuality == i,\n//           title: Text(\n//             item.quality,\n//             style: const TextStyle(fontSize: 14),\n//           ),\n//           minLeadingWidth: 16,\n//           onTap: () {\n//             Utils.hideRightDialog();\n//             controller.currentQuality = i;\n//             controller.getPlayUrl();\n//           },\n//         );\n//       },\n//     ),\n//   );\n// }\n\nvoid showPlayerSettings(LiveRoomController controller) {\n  // 移除焦点\n  controller.focusNode.unfocus();\n\n  var followFocusNode = AppFocusNode()..isFoucsed.value = true;\n  var qualityFoucsNode = AppFocusNode();\n  var lineFoucsNode = AppFocusNode();\n  var scaleFoucsNode = AppFocusNode();\n  var danmakuFoucsNode = AppFocusNode();\n  var danmakuSizeFoucsNode = AppFocusNode();\n  var danmakuSpeedFoucsNode = AppFocusNode();\n  var danmakuAreaFoucsNode = AppFocusNode();\n  var danmakuOpacityFoucsNode = AppFocusNode();\n  Utils.showSystemRightDialog(\n    width: 800.w,\n    child: Column(\n      children: [\n        AppStyle.vGap24,\n        Row(\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            AppStyle.hGap48,\n            HighlightButton(\n              focusNode: AppFocusNode(),\n              iconData: Icons.arrow_back,\n              text: \"返回\",\n              onTap: () {\n                //Utils.hideRightDialog();\n                Get.back();\n              },\n            ),\n            AppStyle.hGap32,\n            Text(\n              \"设置\",\n              style: AppStyle.titleStyleWhite.copyWith(\n                fontSize: 36.w,\n                fontWeight: FontWeight.bold,\n              ),\n            ),\n            AppStyle.hGap24,\n            const Spacer(),\n          ],\n        ),\n        Expanded(\n          child: ListView(\n            padding: AppStyle.edgeInsetsA48,\n            children: [\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: followFocusNode,\n                  autofocus: followFocusNode.isFoucsed.value,\n                  title: \"关注用户\",\n                  items: const {false: \"否\", true: \"是\"},\n                  value: controller.followed.value,\n                  onChanged: (e) {\n                    if (e) {\n                      controller.followUser();\n                    } else {\n                      controller.removeFollowUser();\n                    }\n                  },\n                ),\n              ),\n\n              Divider(color: Colors.grey.withAlpha(50), height: 36.w),\n              AppStyle.vGap24,\n              Padding(\n                padding: AppStyle.edgeInsetsH20,\n                child: Text(\n                  \"清晰度与线路\",\n                  style: AppStyle.textStyleWhite.copyWith(\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              ),\n              AppStyle.vGap24,\n\n              // 清晰度切换\n              Obx(\n                () => SettingsItemWidget(\n                  title: \"清晰度\",\n                  foucsNode: qualityFoucsNode,\n                  autofocus: qualityFoucsNode.isFoucsed.value,\n                  items: controller.qualites\n                      .asMap()\n                      .map((i, e) => MapEntry(i, e.quality))\n                      .cast<int, String>(),\n                  value: controller.currentQuality,\n                  onChanged: (e) {\n                    Get.back();\n                    controller.currentQuality = e;\n                    controller.getPlayUrl();\n                  },\n                ),\n              ),\n\n              AppStyle.vGap32,\n              // 线路切换\n              Obx(\n                () => SettingsItemWidget(\n                  title: \"线路\",\n                  foucsNode: lineFoucsNode,\n                  autofocus: lineFoucsNode.isFoucsed.value,\n                  items: controller.playUrls\n                      .asMap()\n                      .map((i, e) => MapEntry(i, \"线路${i + 1}\"))\n                      .cast<int, String>(),\n                  value: controller.currentLineIndex,\n                  onChanged: (e) {\n                    Get.back();\n                    controller.changePlayLine(e);\n                  },\n                ),\n              ),\n              Divider(color: Colors.grey.withAlpha(50), height: 36.w),\n              Padding(\n                padding: AppStyle.edgeInsetsH20,\n                child: Text(\n                  \"播放器\",\n                  style: AppStyle.textStyleWhite.copyWith(\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              ),\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: scaleFoucsNode,\n                  autofocus: scaleFoucsNode.isFoucsed.value,\n                  title: \"画面比例\",\n                  items: const {0: \"适应\", 1: \"拉伸\", 2: \"铺满\", 3: \"16:9\", 4: \"4:3\"},\n                  value: AppSettingsController.instance.scaleMode.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setScaleMode(e);\n                    controller.updateScaleMode();\n                  },\n                ),\n              ),\n              Divider(color: Colors.grey.withAlpha(50), height: 36.w),\n              Padding(\n                padding: AppStyle.edgeInsetsH20,\n                child: Text(\n                  \"弹幕\",\n                  style: AppStyle.textStyleWhite.copyWith(\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              ),\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: danmakuFoucsNode,\n                  autofocus: danmakuFoucsNode.isFoucsed.value,\n                  title: \"弹幕开关\",\n                  items: const {0: \"关\", 1: \"开\"},\n                  value: controller.showDanmakuState.value ? 1 : 0,\n                  onChanged: (e) {\n                    controller.showDanmakuState.value = e == 1;\n                    AppSettingsController.instance.setDanmuEnable(e == 1);\n                  },\n                ),\n              ),\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: danmakuSizeFoucsNode,\n                  autofocus: danmakuSizeFoucsNode.isFoucsed.value,\n                  title: \"弹幕大小\",\n                  items: {\n                    24.0: \"24\",\n                    32.0: \"32\",\n                    40.0: \"40\",\n                    48.0: \"48\",\n                    56.0: \"56\",\n                    64.0: \"64\",\n                    72.0: \"72\",\n                  },\n                  value: AppSettingsController.instance.danmuSize.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setDanmuSize(e);\n                    controller.updateDanmuOption(\n                      controller.danmakuController?.option.copyWith(\n                        fontSize: (e as double).w,\n                      ),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: danmakuSpeedFoucsNode,\n                  autofocus: danmakuSpeedFoucsNode.isFoucsed.value,\n                  title: \"弹幕速度\",\n                  items: {\n                    18.0: \"很慢\",\n                    14.0: \"较慢\",\n                    12.0: \"慢\",\n                    10.0: \"正常\",\n                    8.0: \"快\",\n                    6.0: \"较快\",\n                    4.0: \"很快\",\n                  },\n                  value: AppSettingsController.instance.danmuSpeed.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setDanmuSpeed(e);\n                    controller.updateDanmuOption(\n                      controller.danmakuController?.option.copyWith(\n                        duration: (e as double).toInt(),\n                      ),\n                    );\n                  },\n                ),\n              ),\n\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: danmakuAreaFoucsNode,\n                  autofocus: danmakuAreaFoucsNode.isFoucsed.value,\n                  title: \"显示区域\",\n                  items: {0.25: \"1/4\", 0.5: \"1/2\", 0.75: \"3/4\", 1.0: \"全屏\"},\n                  value: AppSettingsController.instance.danmuArea.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setDanmuArea(e);\n                    controller.updateDanmuOption(\n                      controller.danmakuController?.option.copyWith(\n                        area: e as double,\n                      ),\n                    );\n                  },\n                ),\n              ),\n              AppStyle.vGap24,\n              Obx(\n                () => SettingsItemWidget(\n                  foucsNode: danmakuOpacityFoucsNode,\n                  autofocus: danmakuOpacityFoucsNode.isFoucsed.value,\n                  title: \"不透明度\",\n                  items: {\n                    0.1: \"10%\",\n                    0.2: \"20%\",\n                    0.3: \"30%\",\n                    0.4: \"40%\",\n                    0.5: \"50%\",\n                    0.6: \"60%\",\n                    0.7: \"70%\",\n                    0.8: \"80%\",\n                    0.9: \"90%\",\n                    1.0: \"100%\",\n                  },\n                  value: AppSettingsController.instance.danmuOpacity.value,\n                  onChanged: (e) {\n                    AppSettingsController.instance.setDanmuOpacity(e);\n                    controller.updateDanmuOption(\n                      controller.danmakuController?.option.copyWith(\n                        opacity: e as double,\n                      ),\n                    );\n                  },\n                ),\n              ),\n            ],\n          ),\n        ),\n      ],\n    ),\n  ).then((value) {\n    // 还原焦点\n    controller.focusNode.requestFocus();\n  });\n}\n\nvoid showFollowUser(LiveRoomController controller) {\n  var currentIndex = 0;\n  if (controller.followed.value) {\n    currentIndex = FollowUserService.instance.livingList.indexWhere(\n      (e) =>\n          e.id ==\n          \"${controller.rxSite.value.id}_${controller.detail.value?.roomId}\",\n    );\n    if (currentIndex == -1) {\n      currentIndex = 0;\n    }\n  }\n\n  Utils.showSystemRightDialog(\n    width: 800.w,\n    child: Column(\n      children: [\n        AppStyle.vGap24,\n        Row(\n          crossAxisAlignment: CrossAxisAlignment.center,\n          children: [\n            AppStyle.hGap48,\n            HighlightButton(\n              focusNode: AppFocusNode(),\n              iconData: Icons.arrow_back,\n              text: \"返回\",\n              autofocus: currentIndex == 0 &&\n                  FollowUserService.instance.livingList.isEmpty,\n              onTap: () {\n                // Utils.hideRightDialog();\n                Get.back();\n              },\n            ),\n            AppStyle.hGap32,\n            Text(\n              \"我的关注\",\n              style: AppStyle.titleStyleWhite.copyWith(\n                fontSize: 36.w,\n                fontWeight: FontWeight.bold,\n              ),\n            ),\n            AppStyle.hGap24,\n            const Spacer(),\n          ],\n        ),\n        Expanded(\n          child: Stack(\n            children: [\n              Obx(\n                () => ListView.separated(\n                  itemCount: FollowUserService.instance.livingList.length,\n                  separatorBuilder: (context, index) => AppStyle.vGap32,\n                  padding: AppStyle.edgeInsetsA40.copyWith(\n                    left: 48.w,\n                    right: 48.w,\n                  ),\n                  itemBuilder: (_, i) {\n                    var item = FollowUserService.instance.livingList[i];\n                    var site = Sites.allSites[item.siteId]!;\n                    return AnchorCard(\n                      face: item.face,\n                      name: item.userName,\n                      siteId: item.siteId,\n                      liveStatus: item.liveStatus.value,\n                      roomId: item.roomId,\n                      autofocus: i == currentIndex,\n                      onTap: () {\n                        controller.resetRoom(site, item.roomId);\n                        Get.back();\n                      },\n                    );\n                  },\n                ),\n              ),\n              Obx(\n                () => Visibility(\n                  visible: FollowUserService.instance.list.isEmpty,\n                  child: const AppEmptyWidget(text: \"关注列表为空，快去关注一些主播吧\"),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ],\n    ),\n  ).then((value) {\n    // 还原焦点\n    controller.focusNode.requestFocus();\n  });\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/search/anchor/search_anchor_controller.dart",
    "content": "import 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get_rx/src/rx_types/rx_types.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\n\nclass SearchAnchorController extends BasePageController<LiveAnchorItemExt> {\n  final String keyword;\n  SearchAnchorController(this.keyword);\n  var siteId = Constant.kBiliBili.obs;\n  var site = Sites.allSites[Constant.kBiliBili]!;\n\n  @override\n  void onInit() {\n    scrollController.addListener(scrollListener);\n    refreshData();\n    super.onInit();\n  }\n\n  void scrollListener() {\n    if (scrollController.position.pixels >=\n        (scrollController.position.maxScrollExtent - 100.w)) {\n      loadData();\n    }\n  }\n\n  void setSite(String id) {\n    siteId.value = id;\n    site = Sites.allSites[id]!;\n    refreshData();\n  }\n\n  @override\n  Future<List<LiveAnchorItemExt>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.searchAnchors(keyword, page: page);\n\n    return result.items\n        .map((e) => LiveAnchorItemExt(\n              roomId: e.roomId,\n              avatar: e.avatar,\n              liveStatus: e.liveStatus,\n              userName: e.userName,\n            ))\n        .toList();\n  }\n\n  @override\n  void onClose() {\n    scrollController.removeListener(scrollListener);\n    super.onClose();\n  }\n}\n\nclass LiveAnchorItemExt extends LiveAnchorItem {\n  LiveAnchorItemExt({\n    required super.roomId,\n    required super.avatar,\n    required super.liveStatus,\n    required super.userName,\n  });\n\n  AppFocusNode focusNode = AppFocusNode();\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/search/anchor/search_anchor_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/search/anchor/search_anchor_controller.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/anchor_card.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_empty_widget.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_error_widget.dart';\n\nclass SearchAnchorPage extends GetView<SearchAnchorController> {\n  const SearchAnchorPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                //autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"搜索：${controller.keyword}\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Visibility(\n                  visible: controller.loadding.value,\n                  child: SizedBox(\n                    width: 48.w,\n                    height: 48.w,\n                    child: CircularProgressIndicator(\n                      color: Colors.white,\n                      strokeWidth: 4.w,\n                    ),\n                  ),\n                ),\n              ),\n              AppStyle.hGap24,\n              // HighlightButton(\n              //   focusNode: AppFocusNode(),\n              //   iconData: Icons.refresh,\n              //   text: \"刷新\",\n              //   onTap: () {\n              //     controller.refreshData();\n              //   },\n              // ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap24,\n          Wrap(\n            alignment: WrapAlignment.center,\n            spacing: 36.w,\n            children: Sites.supportSites\n                .map(\n                  (e) => Obx(\n                    () => HighlightButton(\n                      icon: Image.asset(\n                        e.logo,\n                        width: 48.w,\n                        height: 48.w,\n                      ),\n                      text: e.name,\n                      selected: controller.siteId.value == e.id,\n                      focusNode: AppFocusNode(),\n                      onTap: () {\n                        controller.setSite(e.id);\n                      },\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Obx(\n              () => Stack(\n                children: [\n                  MasonryGridView.count(\n                    padding: AppStyle.edgeInsetsA48,\n                    itemCount: controller.list.length,\n                    crossAxisCount: 3,\n                    crossAxisSpacing: 48.w,\n                    mainAxisSpacing: 40.w,\n                    controller: controller.scrollController,\n                    itemBuilder: (_, i) {\n                      var item = controller.list[i];\n\n                      if (i == 0) {\n                        Future.delayed(Duration.zero, () {\n                          if (controller.currentPage == 2) {\n                            item.focusNode.requestFocus();\n                          }\n                        });\n                      }\n                      return AnchorCard(\n                        siteId: controller.siteId.value,\n                        name: item.userName,\n                        liveStatus: item.liveStatus ? 2 : 0,\n                        face: item.avatar,\n                        roomId: item.roomId,\n                        focusNode: item.focusNode,\n                        onTap: () {\n                          AppNavigator.toLiveRoomDetail(\n                            site: controller.site,\n                            roomId: item.roomId,\n                          );\n                        },\n                      );\n                    },\n                  ),\n                  Obx(\n                    () => Visibility(\n                      visible: controller.list.isEmpty &&\n                          !controller.loadding.value &&\n                          !controller.pageError.value,\n                      child: AppEmptyWidget(\n                        onRefresh: () {\n                          controller.refreshData();\n                        },\n                      ),\n                    ),\n                  ),\n                  Obx(\n                    () => Visibility(\n                      visible: controller.pageError.value &&\n                          !controller.loadding.value,\n                      child: AppErrorWidget(\n                        errorMsg: controller.errorMsg.value,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/search/room/search_room_controller.dart",
    "content": "import 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get_rx/src/rx_types/rx_types.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/hot_live/hot_live_controller.dart';\n\nclass SearchRoomController extends BasePageController<LiveRoomItemExt> {\n  final String keyword;\n  SearchRoomController(this.keyword);\n  var siteId = Constant.kBiliBili.obs;\n  var site = Sites.allSites[Constant.kBiliBili]!;\n\n  @override\n  void onInit() {\n    scrollController.addListener(scrollListener);\n    refreshData();\n    super.onInit();\n  }\n\n  void scrollListener() {\n    if (scrollController.position.pixels >=\n        (scrollController.position.maxScrollExtent - 100.w)) {\n      loadData();\n    }\n  }\n\n  void setSite(String id) {\n    siteId.value = id;\n    site = Sites.allSites[id]!;\n    refreshData();\n  }\n\n  @override\n  Future<List<LiveRoomItemExt>> getData(int page, int pageSize) async {\n    var result = await site.liveSite.searchRooms(keyword, page: page);\n\n    return result.items\n        .map((e) => LiveRoomItemExt(\n              roomId: e.roomId,\n              title: e.title,\n              cover: e.cover,\n              userName: e.userName,\n              online: e.online,\n            ))\n        .toList();\n  }\n\n  @override\n  void onClose() {\n    scrollController.removeListener(scrollListener);\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/search/room/search_room_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/search/room/search_room_controller.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/card/live_room_card.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_empty_widget.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_error_widget.dart';\n\nclass SearchRoomPage extends GetView<SearchRoomController> {\n  const SearchRoomPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                //autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"搜索：${controller.keyword}\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n              Obx(\n                () => Visibility(\n                  visible: controller.loadding.value,\n                  child: SizedBox(\n                    width: 48.w,\n                    height: 48.w,\n                    child: CircularProgressIndicator(\n                      color: Colors.white,\n                      strokeWidth: 4.w,\n                    ),\n                  ),\n                ),\n              ),\n              AppStyle.hGap24,\n              // HighlightButton(\n              //   focusNode: AppFocusNode(),\n              //   iconData: Icons.refresh,\n              //   text: \"刷新\",\n              //   onTap: () {\n              //     controller.refreshData();\n              //   },\n              // ),\n              AppStyle.hGap48,\n            ],\n          ),\n          AppStyle.vGap24,\n          Wrap(\n            alignment: WrapAlignment.center,\n            spacing: 36.w,\n            children: Sites.supportSites\n                .map(\n                  (e) => Obx(\n                    () => HighlightButton(\n                      icon: Image.asset(\n                        e.logo,\n                        width: 48.w,\n                        height: 48.w,\n                      ),\n                      text: e.name,\n                      selected: controller.siteId.value == e.id,\n                      focusNode: AppFocusNode(),\n                      onTap: () {\n                        controller.setSite(e.id);\n                      },\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Obx(\n              () => Stack(\n                children: [\n                  MasonryGridView.count(\n                    padding: AppStyle.edgeInsetsA48,\n                    itemCount: controller.list.length,\n                    crossAxisCount: 5,\n                    crossAxisSpacing: 48.w,\n                    mainAxisSpacing: 40.w,\n                    controller: controller.scrollController,\n                    itemBuilder: (_, i) {\n                      var item = controller.list[i];\n\n                      if (i == 0) {\n                        Future.delayed(Duration.zero, () {\n                          if (controller.currentPage == 2) {\n                            item.focusNode.requestFocus();\n                          }\n                        });\n                      }\n                      return LiveRoomCard(\n                        cover: item.cover,\n                        anchor: item.userName,\n                        title: item.title,\n                        focusNode: item.focusNode,\n                        roomId: item.roomId,\n                        online: item.online,\n                        onTap: () {\n                          AppNavigator.toLiveRoomDetail(\n                            site: controller.site,\n                            roomId: item.roomId,\n                          );\n                        },\n                      );\n                    },\n                  ),\n                  Obx(\n                    () => Visibility(\n                      visible: controller.list.isEmpty &&\n                          !controller.loadding.value &&\n                          !controller.pageError.value,\n                      child: AppEmptyWidget(\n                        onRefresh: () {\n                          controller.refreshData();\n                        },\n                      ),\n                    ),\n                  ),\n                  Obx(\n                    () => Visibility(\n                      visible: controller.pageError.value &&\n                          !controller.loadding.value,\n                      child: AppErrorWidget(\n                        errorMsg: controller.errorMsg.value,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/settings/settings_controller.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\n\nclass SettingsController extends BaseController\n    with GetTickerProviderStateMixin {\n  late TabController tabController;\n  var tabIndex = 0.obs;\n\n  SettingsController() {\n    tabController = TabController(length: 5, vsync: this);\n    tabController.animation?.addListener(() {\n      var currentIndex = (tabController.animation?.value ?? 0).round();\n      if (tabIndex.value == currentIndex) {\n        return;\n      }\n      tabIndex.value = currentIndex;\n      if (tabIndex.value == 0) {\n        hardwareDecodeFocusNode.requestFocus();\n      }\n      if (tabIndex.value == 1) {\n        danmakuFoucsNode.requestFocus();\n      }\n      if (tabIndex.value == 2) {\n        autoUpdateFollowEnableFocusNode.requestFocus();\n      }\n      if (tabIndex.value == 3) {\n        bilibiliFoucsNode.requestFocus();\n      }\n      if (tabIndex.value == 4) {\n        versionFocusNode.requestFocus();\n      }\n    });\n  }\n  var hardwareDecodeFocusNode = AppFocusNode()..isFoucsed.value = true;\n  var compatibleModeFocusNode = AppFocusNode();\n  var scaleFoucsNode = AppFocusNode();\n  var defaultQualityFocusNode = AppFocusNode();\n  var danmakuFoucsNode = AppFocusNode();\n  var danmakuSizeFoucsNode = AppFocusNode();\n  var danmakuSpeedFoucsNode = AppFocusNode();\n  var danmakuAreaFoucsNode = AppFocusNode();\n  var danmakuOpacityFoucsNode = AppFocusNode();\n  var danmakuStorkeFoucsNode = AppFocusNode();\n\n  var autoUpdateFollowEnableFocusNode = AppFocusNode();\n  var autoUpdateFollowDurationFocusNode = AppFocusNode();\n  var updateFollowThreadFocusNode = AppFocusNode();\n\n  var bilibiliFoucsNode = AppFocusNode();\n  var versionFocusNode = AppFocusNode();\n  void bilibiliTap() async {\n    if (BiliBiliAccountService.instance.logined.value) {\n      var result = await Utils.showAlertDialog(\"确定要退出哔哩哔哩账号吗？\", title: \"退出登录\");\n      if (result) {\n        BiliBiliAccountService.instance.logout();\n      }\n    } else {\n      AppNavigator.toBiliBiliLogin();\n    }\n  }\n\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/settings/settings_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/modules/settings/settings_controller.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_tv_app/services/follow_user_service.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_list_tile.dart';\nimport 'package:simple_live_tv_app/widgets/settings_item_widget.dart';\n\nclass SettingsPage extends GetView<SettingsController> {\n  const SettingsPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap32,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"设置\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              AppStyle.hGap24,\n              const Spacer(),\n            ],\n          ),\n          AppStyle.vGap48,\n          Row(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Obx(\n                () => HighlightButton(\n                  focusNode: AppFocusNode(),\n                  iconData: Icons.play_circle_outline,\n                  text: \"播放\",\n                  selected: controller.tabIndex.value == 0,\n                  onTap: () {\n                    controller.tabController.animateTo(0);\n                  },\n                ),\n              ),\n              AppStyle.hGap32,\n              Obx(\n                () => HighlightButton(\n                  focusNode: AppFocusNode(),\n                  iconData: Icons.subtitles_outlined,\n                  text: \"弹幕\",\n                  selected: controller.tabIndex.value == 1,\n                  onTap: () {\n                    controller.tabController.animateTo(1);\n                  },\n                ),\n              ),\n              AppStyle.hGap32,\n              Obx(\n                () => HighlightButton(\n                  focusNode: AppFocusNode(),\n                  iconData: Icons.favorite_border,\n                  text: \"关注\",\n                  selected: controller.tabIndex.value == 2,\n                  onTap: () {\n                    controller.tabController.animateTo(2);\n                  },\n                ),\n              ),\n              AppStyle.hGap32,\n              Obx(\n                () => HighlightButton(\n                  focusNode: AppFocusNode(),\n                  iconData: Icons.account_circle_outlined,\n                  selected: controller.tabIndex.value == 3,\n                  text: \"账号\",\n                  onTap: () {\n                    controller.tabController.animateTo(3);\n                  },\n                ),\n              ),\n              AppStyle.hGap32,\n              Obx(\n                () => HighlightButton(\n                  focusNode: AppFocusNode(),\n                  iconData: Icons.info_outline,\n                  selected: controller.tabIndex.value == 4,\n                  text: \"关于\",\n                  onTap: () {\n                    controller.tabController.animateTo(4);\n                  },\n                ),\n              ),\n            ],\n          ),\n          Expanded(\n              child: SizedBox(\n            width: 800.w,\n            child: TabBarView(\n              controller: controller.tabController,\n              children: [\n                buildPlayerSettings(),\n                buildDanmakuSettings(),\n                buildFollowSettings(),\n                buildAccountSettings(),\n                buildAbout(),\n              ],\n            ),\n          )),\n        ],\n      ),\n    );\n  }\n\n  Widget buildPlayerSettings() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA48,\n      children: [\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.hardwareDecodeFocusNode,\n            autofocus: controller.hardwareDecodeFocusNode.isFoucsed.value,\n            title: \"硬件解码\",\n            items: const {\n              0: \"关\",\n              1: \"开\",\n            },\n            value: AppSettingsController.instance.hardwareDecode.value ? 1 : 0,\n            onChanged: (e) {\n              AppSettingsController.instance\n                  .setHardwareDecode(e == 1 ? true : false);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.compatibleModeFocusNode,\n            autofocus: controller.compatibleModeFocusNode.isFoucsed.value,\n            title: \"兼容模式\",\n            items: const {\n              0: \"关\",\n              1: \"开\",\n            },\n            value:\n                AppSettingsController.instance.playerCompatMode.value ? 1 : 0,\n            onChanged: (e) {\n              AppSettingsController.instance\n                  .setPlayerCompatMode(e == 1 ? true : false);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.scaleFoucsNode,\n            autofocus: controller.scaleFoucsNode.isFoucsed.value,\n            title: \"画面比例\",\n            items: const {\n              0: \"适应\",\n              1: \"拉伸\",\n              2: \"铺满\",\n              3: \"16:9\",\n              4: \"4:3\",\n            },\n            value: AppSettingsController.instance.scaleMode.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setScaleMode(e);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.defaultQualityFocusNode,\n            autofocus: controller.defaultQualityFocusNode.isFoucsed.value,\n            title: \"默认清晰度\",\n            items: const {\n              0: \"最低画质\",\n              1: \"中等画质\",\n              2: \"最高画质\",\n            },\n            value: AppSettingsController.instance.qualityLevel.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setQualityLevel(e);\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildFollowSettings() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA48,\n      children: [\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.autoUpdateFollowEnableFocusNode,\n            autofocus:\n                controller.autoUpdateFollowEnableFocusNode.isFoucsed.value,\n            title: \"自动更新关注\",\n            items: const {\n              0: \"关\",\n              1: \"开\",\n            },\n            value: AppSettingsController.instance.autoUpdateFollowEnable.value\n                ? 1\n                : 0,\n            onChanged: (e) {\n              AppSettingsController.instance\n                  .setAutoUpdateFollowEnable(e == 1 ? true : false);\n              FollowUserService.instance.initTimer();\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.autoUpdateFollowDurationFocusNode,\n            autofocus:\n                controller.autoUpdateFollowDurationFocusNode.isFoucsed.value,\n            title: \"自动更新间隔\",\n            items: const {\n              5: \"5分钟\",\n              10: \"10分钟\",\n              15: \"15分钟\",\n              20: \"20分钟\",\n              25: \"25分钟\",\n              30: \"30分钟\",\n              60: \"1小时\",\n            },\n            value:\n                AppSettingsController.instance.autoUpdateFollowDuration.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setAutoUpdateFollowDuration(e);\n              FollowUserService.instance.initTimer();\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.updateFollowThreadFocusNode,\n            autofocus: controller.updateFollowThreadFocusNode.isFoucsed.value,\n            title: \"更新线程数\",\n            items: const {\n              1: \"1\",\n              2: \"2\",\n              3: \"3\",\n              4: \"4\",\n              6: \"6\",\n              8: \"8\",\n              10: \"10\",\n              12: \"12\",\n            },\n            value: AppSettingsController.instance.updateFollowThreadCount.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setUpdateFollowThreadCount(e);\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildDanmakuSettings() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA48,\n      children: [\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuFoucsNode,\n            autofocus: controller.danmakuFoucsNode.isFoucsed.value,\n            title: \"弹幕开关\",\n            items: const {\n              0: \"关\",\n              1: \"开\",\n            },\n            value: AppSettingsController.instance.danmuEnable.value ? 1 : 0,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuEnable(e == 1);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuSizeFoucsNode,\n            autofocus: controller.danmakuSizeFoucsNode.isFoucsed.value,\n            title: \"弹幕大小\",\n            items: {\n              24.0: \"24\",\n              32.0: \"32\",\n              40.0: \"40\",\n              48.0: \"48\",\n              56.0: \"56\",\n              64.0: \"64\",\n              72.0: \"72\",\n            },\n            value: AppSettingsController.instance.danmuSize.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuSize(e);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuSpeedFoucsNode,\n            autofocus: controller.danmakuSpeedFoucsNode.isFoucsed.value,\n            title: \"弹幕速度\",\n            items: {\n              18.0: \"很慢\",\n              14.0: \"较慢\",\n              12.0: \"慢\",\n              10.0: \"正常\",\n              8.0: \"快\",\n              6.0: \"较快\",\n              4.0: \"很快\",\n            },\n            value: AppSettingsController.instance.danmuSpeed.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuSpeed(e);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuAreaFoucsNode,\n            autofocus: controller.danmakuAreaFoucsNode.isFoucsed.value,\n            title: \"显示区域\",\n            items: {\n              0.25: \"1/4\",\n              0.5: \"1/2\",\n              0.75: \"3/4\",\n              1.0: \"全屏\",\n            },\n            value: AppSettingsController.instance.danmuArea.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuArea(e);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuOpacityFoucsNode,\n            autofocus: controller.danmakuOpacityFoucsNode.isFoucsed.value,\n            title: \"不透明度\",\n            items: {\n              0.1: \"10%\",\n              0.2: \"20%\",\n              0.3: \"30%\",\n              0.4: \"40%\",\n              0.5: \"50%\",\n              0.6: \"60%\",\n              0.7: \"70%\",\n              0.8: \"80%\",\n              0.9: \"90%\",\n              1.0: \"100%\",\n            },\n            value: AppSettingsController.instance.danmuOpacity.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuOpacity(e);\n            },\n          ),\n        ),\n        AppStyle.vGap24,\n        Obx(\n          () => SettingsItemWidget(\n            foucsNode: controller.danmakuStorkeFoucsNode,\n            autofocus: controller.danmakuStorkeFoucsNode.isFoucsed.value,\n            title: \"描边宽度\",\n            items: {\n              2.0: \"2\",\n              4.0: \"4\",\n              6.0: \"6\",\n              8.0: \"8\",\n              10.0: \"10\",\n              12.0: \"12\",\n              14.0: \"14\",\n              16.0: \"16\",\n            },\n            value: AppSettingsController.instance.danmuStrokeWidth.value,\n            onChanged: (e) {\n              AppSettingsController.instance.setDanmuStrokeWidth(e);\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildAccountSettings() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA48,\n      children: [\n        Obx(\n          () => HighlightListTile(\n            focusNode: controller.bilibiliFoucsNode,\n            autofocus: controller.bilibiliFoucsNode.isFoucsed.value,\n            title: \"哔哩哔哩账号\",\n            subtitle: BiliBiliAccountService.instance.logined.value\n                ? \"已登录：${BiliBiliAccountService.instance.name.value}\"\n                : \"未登录，点击登录\",\n            leading: Image.asset(\n              \"assets/images/bilibili.png\",\n              width: 64.w,\n              height: 64.w,\n            ),\n            onTap: controller.bilibiliTap,\n          ),\n        ),\n        AppStyle.vGap24,\n        HighlightListTile(\n          focusNode: AppFocusNode(),\n          title: \"斗鱼账号\",\n          subtitle: \"无需登录\",\n          leading: Image.asset(\n            \"assets/images/douyu.png\",\n            width: 64.w,\n            height: 64.w,\n          ),\n          onTap: () {\n            SmartDialog.showToast(\"无需登录斗鱼，您可以直接观看直播\");\n          },\n        ),\n        AppStyle.vGap24,\n        HighlightListTile(\n          focusNode: AppFocusNode(),\n          title: \"虎牙账号\",\n          subtitle: \"无需登录\",\n          leading: Image.asset(\n            \"assets/images/huya.png\",\n            width: 64.w,\n            height: 64.w,\n          ),\n          onTap: () {\n            SmartDialog.showToast(\"无需登录虎牙，您可以直接观看直播\");\n          },\n        ),\n        AppStyle.vGap24,\n        HighlightListTile(\n          focusNode: AppFocusNode(),\n          title: \"抖音账号\",\n          subtitle: \"无需登录\",\n          leading: Image.asset(\n            \"assets/images/douyin.png\",\n            width: 64.w,\n            height: 64.w,\n          ),\n          onTap: () {\n            SmartDialog.showToast(\"无需登录抖音，您可以直接观看直播\");\n          },\n        )\n      ],\n    );\n  }\n\n  Widget buildAbout() {\n    return ListView(\n      padding: AppStyle.edgeInsetsA48,\n      children: [\n        HighlightListTile(\n          focusNode: controller.versionFocusNode,\n          title: \"版本\",\n          subtitle: \"v${Utils.packageInfo.version}\",\n          onTap: ()=>{},\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/sync/sync_controller.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/event_bus.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\nimport 'package:simple_live_tv_app/models/db/history.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\nimport 'package:simple_live_tv_app/services/signalr_service.dart';\n\nclass SyncController extends BaseController {\n  final SignalRService signalR = SignalRService();\n  StreamSubscription? _stateSubscription;\n  StreamSubscription? _roomDestroyedSubscription;\n  StreamSubscription? _roomUserUpdatedSubscription;\n  StreamSubscription? _onFavoriteSubscription;\n  StreamSubscription? _onHistorySubscription;\n  StreamSubscription? _onShieldWordSubscription;\n  StreamSubscription? _onBiliAccountSubscription;\n  var currentRoomId = \"--\".obs;\n  RxList<RoomUser> roomUsers = <RoomUser>[].obs;\n  Timer? _timer;\n  var countDown = 600.obs;\n\n  Rx<SignalRConnectionState> state =\n      Rx<SignalRConnectionState>(SignalRConnectionState.connecting);\n\n  @override\n  void onInit() {\n    connect();\n    super.onInit();\n  }\n\n  void connect() async {\n    listenSignalR();\n    await signalR.connect();\n    if (signalR.state == SignalRConnectionState.connected) {\n      createRoom();\n    }\n  }\n\n  void createRoom() async {\n    try {\n      var resp = await signalR.createRoom();\n      if (resp.isSuccess) {\n        currentRoomId.value = resp.data!;\n        _startTimer();\n      } else {\n        SmartDialog.showToast(resp.message);\n        Get.back();\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"创建房间失败\");\n      Get.back();\n    }\n  }\n\n  void _startTimer() {\n    // 倒计时5分钟，自动关闭页面\n    countDown.value = 600;\n    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {\n      countDown--;\n      if (countDown <= 0) {\n        timer.cancel();\n        Get.back();\n      }\n    });\n  }\n\n  void listenSignalR() {\n    _stateSubscription = signalR.stateStream.listen((event) {\n      state.value = event;\n    });\n    _roomDestroyedSubscription = signalR.onRoomDestroyedStream.listen((roomId) {\n      SmartDialog.showToast(\"房间已被销毁\");\n      Get.back();\n    });\n    _roomUserUpdatedSubscription = signalR.onRoomUserUpdatedStream.listen(\n      (roomUsers) {\n        this.roomUsers.assignAll(roomUsers);\n      },\n    );\n    _onFavoriteSubscription = signalR.onFavoriteStream.listen((data) {\n      onReceiveFavorite(data.$1, data.$2);\n    });\n    _onHistorySubscription = signalR.onHistoryStream.listen((data) {\n      onReceiveHistory(data.$1, data.$2);\n    });\n    _onShieldWordSubscription = signalR.onShieldWordStream.listen((data) {\n      onReceiveShieldWord(data.$1, data.$2);\n    });\n    _onBiliAccountSubscription = signalR.onBiliAccountStream.listen((data) {\n      onReceiveBiliAccount(data.$1, data.$2);\n    });\n  }\n\n  void onReceiveFavorite(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        await DBService.instance.followBox.clear();\n      }\n      for (var item in jsonBody) {\n        var user = FollowUser.fromJson(item);\n        await DBService.instance.followBox.put(user.id, user);\n      }\n      SmartDialog.showToast('已同步关注用户列表');\n      EventBus.instance.emit(Constant.kUpdateFollow, 0);\n      SmartDialog.showToast(\"已同步关注列表\");\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveHistory(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        await DBService.instance.historyBox.clear();\n      }\n      for (var item in jsonBody) {\n        var history = History.fromJson(item);\n        if (DBService.instance.historyBox.containsKey(history.id)) {\n          var old = DBService.instance.historyBox.get(history.id);\n          //如果本地的更新时间比较新，就不更新\n          if (old!.updateTime.isAfter(history.updateTime)) {\n            continue;\n          }\n        }\n        await DBService.instance.addOrUpdateHistory(history);\n      }\n      SmartDialog.showToast('已同步历史记录');\n      EventBus.instance.emit(Constant.kUpdateHistory, 0);\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveShieldWord(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      if (overlay) {\n        AppSettingsController.instance.clearShieldList();\n      }\n      for (var item in jsonBody) {\n        AppSettingsController.instance.addShieldList(item);\n      }\n      SmartDialog.showToast('已同步屏蔽词');\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  void onReceiveBiliAccount(bool overlay, String data) async {\n    try {\n      var jsonBody = json.decode(data);\n      var cookie = jsonBody['cookie'];\n      BiliBiliAccountService.instance.setCookie(cookie);\n      BiliBiliAccountService.instance.loadUserInfo();\n      SmartDialog.showToast('已同步哔哩哔哩账号');\n    } catch (e) {\n      SmartDialog.showToast(\"同步失败:$e\");\n      Log.logPrint(e);\n    }\n  }\n\n  @override\n  void onClose() {\n    _timer?.cancel();\n    _stateSubscription?.cancel();\n    _roomDestroyedSubscription?.cancel();\n    _roomUserUpdatedSubscription?.cancel();\n    _onFavoriteSubscription?.cancel();\n    _onHistorySubscription?.cancel();\n    _onShieldWordSubscription?.cancel();\n    _onBiliAccountSubscription?.cancel();\n    signalR.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/modules/sync/sync_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:qr_flutter/qr_flutter.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/modules/sync/sync_controller.dart';\nimport 'package:simple_live_tv_app/services/signalr_service.dart';\nimport 'package:simple_live_tv_app/services/sync_service.dart';\nimport 'package:simple_live_tv_app/widgets/app_scaffold.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\n\nclass SyncPage extends GetView<SyncController> {\n  const SyncPage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return AppScaffold(\n      child: Column(\n        children: [\n          AppStyle.vGap24,\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              AppStyle.hGap48,\n              HighlightButton(\n                focusNode: AppFocusNode(),\n                iconData: Icons.arrow_back,\n                text: \"返回\",\n                autofocus: true,\n                onTap: () {\n                  Get.back();\n                },\n              ),\n              AppStyle.hGap32,\n              Text(\n                \"数据同步\",\n                style: AppStyle.titleStyleWhite.copyWith(\n                  fontSize: 36.w,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              const Spacer(),\n            ],\n          ),\n          AppStyle.vGap24,\n          Expanded(\n            child: Row(\n              children: [\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    children: [\n                      Text(\n                        \"远程同步\",\n                        style: AppStyle.titleStyleWhite.copyWith(\n                          fontSize: 32.w,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      ),\n                      AppStyle.vGap16,\n                      Obx(\n                        () => Visibility(\n                          visible: SyncService.instance.httpRunning.value,\n                          child: GestureDetector(\n                            onTap: () {\n                              Get.back();\n                            },\n                            child: QrImageView(\n                              data: controller.currentRoomId.value,\n                              version: QrVersions.auto,\n                              backgroundColor: Colors.white,\n                              padding: AppStyle.edgeInsetsA24,\n                              size: 420.0.w,\n                            ),\n                          ),\n                        ),\n                      ),\n                      AppStyle.vGap24,\n                      Obx(\n                        () => Visibility(\n                          visible: controller.state.value ==\n                              SignalRConnectionState.connected,\n                          child: Text.rich(\n                            TextSpan(\n                              text: '房间号：',\n                              children: [\n                                TextSpan(\n                                  text: controller.currentRoomId.value,\n                                  style: AppStyle.textStyleWhite\n                                      .copyWith(fontWeight: FontWeight.bold),\n                                )\n                              ],\n                            ),\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                      Obx(\n                        () => Visibility(\n                          visible: controller.state.value ==\n                              SignalRConnectionState.disconnected,\n                          child: Text(\n                            '连接已断开，请尝试重进此页面',\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                      Obx(\n                        () => Visibility(\n                          visible: controller.state.value ==\n                              SignalRConnectionState.connecting,\n                          child: Text(\n                            '正在创建房间...',\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                      AppStyle.vGap12,\n                      Obx(\n                        () => Visibility(\n                          visible: controller.state.value ==\n                              SignalRConnectionState.connected,\n                          child: Text(\n                            \"${controller.countDown}秒后将自动关闭服务\\n请扫描二维码或输入房间号进行连接\",\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                VerticalDivider(\n                  color: Colors.white.withAlpha(50),\n                  thickness: 2.w,\n                  endIndent: 120.w,\n                  indent: 120.w,\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.center,\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    children: [\n                      Text(\n                        \"局域网同步\",\n                        style: AppStyle.titleStyleWhite.copyWith(\n                          fontSize: 32.w,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      ),\n                      AppStyle.vGap16,\n                      Obx(\n                        () => Visibility(\n                          visible: SyncService.instance.httpRunning.value,\n                          child: GestureDetector(\n                            onTap: () {\n                              Get.back();\n                            },\n                            child: QrImageView(\n                              data: SyncService.instance.ipAddress.value,\n                              version: QrVersions.auto,\n                              backgroundColor: Colors.white,\n                              padding: AppStyle.edgeInsetsA24,\n                              size: 420.0.w,\n                            ),\n                          ),\n                        ),\n                      ),\n                      AppStyle.vGap24,\n                      Obx(\n                        () => Visibility(\n                          visible: SyncService.instance.httpRunning.value,\n                          child: Text(\n                            '服务已启动：${SyncService.instance.ipAddress.value.split(';').map((e) => '$e:${SyncService.httpPort}').join('；')}',\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                      Obx(\n                        () => Visibility(\n                          visible: !SyncService.instance.httpRunning.value,\n                          child: Text(\n                            'HTTP服务未启动：${SyncService.instance.httpErrorMsg}，请尝试重启应用',\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                      AppStyle.vGap12,\n                      Obx(\n                        () => Visibility(\n                          visible: SyncService.instance.httpRunning.value,\n                          child: Text(\n                            \"请扫描二维码或输入IP地址进行连接\\n建立连接后可在APP端选择需要同步至TV端的数据\",\n                            style: AppStyle.textStyleWhite,\n                            textAlign: TextAlign.center,\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/requests/common_request.dart",
    "content": "import 'dart:convert';\n\nimport 'package:simple_live_tv_app/models/version_model.dart';\nimport 'package:simple_live_tv_app/requests/http_client.dart';\n\n/// 通用的请求\nclass CommonRequest {\n  Future<VersionModel> checkUpdate() async {\n    try {\n      return await checkUpdateGitMirror();\n    } catch (e) {\n      return await checkUpdateJsDelivr();\n    }\n  }\n\n  /// 检查更新\n  Future<VersionModel> checkUpdateGitMirror() async {\n    var result = await HttpClient.instance.getJson(\n      \"https://github.iill.moe/xiaoyaocz/dart_simple_live/master/assets/tv_app_version.json\",\n      queryParameters: {\n        \"ts\": DateTime.now().millisecondsSinceEpoch,\n      },\n    );\n    if (result is Map) {\n      return VersionModel.fromJson(result as Map<String, dynamic>);\n    }\n    return VersionModel.fromJson(json.decode(result));\n  }\n\n  /// 检查更新\n  Future<VersionModel> checkUpdateJsDelivr() async {\n    var result = await HttpClient.instance.getJson(\n      \"https://cdn.jsdelivr.net/gh/xiaoyaocz/dart_simple_live@master/assets/tv_app_version.json\",\n      queryParameters: {\n        \"ts\": DateTime.now().millisecondsSinceEpoch,\n      },\n    );\n    if (result is Map) {\n      return VersionModel.fromJson(result as Map<String, dynamic>);\n    }\n    return VersionModel.fromJson(json.decode(result));\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/requests/custom_log_interceptor.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\n\nclass CustomLogInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    options.extra[\"ts\"] = DateTime.now().millisecondsSinceEpoch;\n\n    super.onRequest(options, handler);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    var time =\n        DateTime.now().millisecondsSinceEpoch - err.requestOptions.extra[\"ts\"];\n    Log.e('''【HTTP请求错误-${err.type}】 耗时:${time}ms\n${err.message}\n\nRequest Method：${err.requestOptions.method}\nResponse Code：${err.response?.statusCode}\nRequest URL：${err.requestOptions.uri}\nRequest Query：${err.requestOptions.queryParameters}\nRequest Data：${err.requestOptions.data}\nRequest Headers：${err.requestOptions.headers}\nResponse Headers：${err.response?.headers.map}\nResponse Data：${err.response?.data}''', err.stackTrace);\n    super.onError(err, handler);\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    var time = DateTime.now().millisecondsSinceEpoch -\n        response.requestOptions.extra[\"ts\"];\n    Log.i(\n      '''【HTTP请求响应】 耗时:${time}ms\nRequest Method：${response.requestOptions.method}\nRequest Code：${response.statusCode}\nRequest URL：${response.requestOptions.uri}\nRequest Query：${response.requestOptions.queryParameters}\nRequest Data：${response.requestOptions.data}\nRequest Headers：${response.requestOptions.headers}\nResponse Headers：${response.headers.map}\nResponse Data：${response.data}''',\n    );\n    super.onResponse(response, handler);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/requests/http_client.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:simple_live_tv_app/requests/custom_log_interceptor.dart';\nimport 'package:simple_live_tv_app/requests/http_error.dart';\n\nclass HttpClient {\n  static HttpClient? _httpUtil;\n\n  static HttpClient get instance {\n    _httpUtil ??= HttpClient();\n    return _httpUtil!;\n  }\n\n  late Dio dio;\n  HttpClient() {\n    dio = Dio(\n      BaseOptions(\n        connectTimeout: const Duration(seconds: 20),\n        receiveTimeout: const Duration(seconds: 20),\n        sendTimeout: const Duration(seconds: 20),\n      ),\n    );\n    dio.interceptors.add(CustomLogInterceptor());\n  }\n\n  /// Get请求，返回String\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<String> getText(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.plain,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Get请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<dynamic> getJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Get请求，返回Response\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<Response<dynamic>> get(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.get(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n        ),\n        cancelToken: cancel,\n      );\n      return result;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送GET请求失败\");\n      }\n    }\n  }\n\n  /// Post请求，返回Map\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [data] 内容\n  /// * [cancel] 任务取消Token\n  Future<dynamic> postJson(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    dynamic data,\n    Map<String, dynamic>? header,\n    bool formUrlEncoded = false,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      data ??= {};\n      var result = await dio.post(\n        url,\n        queryParameters: queryParameters,\n        data: data,\n        options: Options(\n          responseType: ResponseType.json,\n          headers: header,\n          contentType:\n              formUrlEncoded ? Headers.formUrlEncodedContentType : null,\n        ),\n        cancelToken: cancel,\n      );\n      return result.data;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        throw HttpError(e.message ?? \"\",\n            statusCode: e.response?.statusCode ?? 0);\n      } else {\n        throw HttpError(\"发送POST请求失败\");\n      }\n    }\n  }\n\n  /// Head请求，返回Response\n  /// * [url] 请求链接\n  /// * [queryParameters] 请求参数\n  /// * [cancel] 任务取消Token\n  Future<Response> head(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Map<String, dynamic>? header,\n    CancelToken? cancel,\n  }) async {\n    try {\n      queryParameters ??= {};\n      header ??= {};\n      var result = await dio.head(\n        url,\n        queryParameters: queryParameters,\n        options: Options(\n          headers: header,\n          receiveDataWhenStatusError: true,\n        ),\n        cancelToken: cancel,\n      );\n      return result;\n    } catch (e) {\n      if (e is DioException && e.type == DioExceptionType.badResponse) {\n        return e.response!;\n      } else {\n        throw HttpError(\"发送HEAD请求失败\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/requests/http_error.dart",
    "content": "class HttpError extends Error {\n  /// 错误码\n  final int statusCode;\n\n  /// 错误信息\n  final String message;\n\n  HttpError(\n    this.message, {\n    this.statusCode = 0,\n  });\n  @override\n  String toString() {\n    if (statusCode != 0) {\n      return statusCodeToString(statusCode);\n    }\n\n    return message;\n  }\n\n  String statusCodeToString(int statusCode) {\n    switch (statusCode) {\n      case 400:\n        return \"错误的请求(400)\";\n      case 401:\n        return \"无权限访问资源(401)\";\n      case 403:\n        return \"无权限访问资源(403)\";\n      case 404:\n        return \"服务器找不到请求的资源(404)\";\n      case 500:\n        return \"服务器出现错误(500)\";\n      case 502:\n        return \"服务器出现错误(502)\";\n      case 503:\n        return \"服务器出现错误(503)\";\n      default:\n        return \"连接服务器失败，请稍后再试($statusCode)\";\n    }\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/routes/app_navigation.dart",
    "content": "import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/modules/category/category_controller.dart';\nimport 'package:simple_live_tv_app/routes/route_path.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\n\n/// APP页面跳转封装\n/// * 需要参数的页面都应使用此类\n/// * 如不需要参数，可以使用Get.toNamed\nclass AppNavigator {\n  /// 跳转至直播间\n  static void toLiveRoomDetail(\n      {required Site site, required String roomId}) async {\n    if (site.id == Constant.kBiliBili &&\n        !BiliBiliAccountService.instance.logined.value &&\n        AppSettingsController.instance.bilibiliLoginTip.value) {\n      await toBiliBiliLogin();\n      if (!BiliBiliAccountService.instance.logined.value) {\n        SmartDialog.showToast(\"未完成登录\");\n        return;\n      }\n    }\n\n    Get.toNamed(RoutePath.kLiveRoomDetail, arguments: site, parameters: {\n      \"roomId\": roomId,\n    });\n  }\n\n  /// 跳转至哔哩哔哩登录\n  static Future toBiliBiliLogin() async {\n    await Get.toNamed(RoutePath.kBiliBiliQRLogin);\n  }\n\n  /// 跳转至分类详情\n  static void toCategoryDetail(\n      {required Site site, required LiveSubCategoryExt category}) {\n    Get.toNamed(RoutePath.kCategoryDetail, arguments: [site, category]);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/routes/app_pages.dart",
    "content": "// ignore_for_file: prefer_inlined_adds\n\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/modules/account/bilibili/qr_login_controller.dart';\nimport 'package:simple_live_tv_app/modules/account/bilibili/qr_login_page.dart';\nimport 'package:simple_live_tv_app/modules/agreement/agreement_page.dart';\nimport 'package:simple_live_tv_app/modules/category/category_controller.dart';\nimport 'package:simple_live_tv_app/modules/category/category_page.dart';\nimport 'package:simple_live_tv_app/modules/category/detail/category_detail_controller.dart';\nimport 'package:simple_live_tv_app/modules/category/detail/category_detail_page.dart';\nimport 'package:simple_live_tv_app/modules/follow_user/follow_user_page.dart';\nimport 'package:simple_live_tv_app/modules/history/history_controller.dart';\nimport 'package:simple_live_tv_app/modules/history/history_page.dart';\nimport 'package:simple_live_tv_app/modules/home/home_controller.dart';\nimport 'package:simple_live_tv_app/modules/home/home_page.dart';\nimport 'package:simple_live_tv_app/modules/hot_live/hot_live_controller.dart';\nimport 'package:simple_live_tv_app/modules/hot_live/hot_live_page.dart';\nimport 'package:simple_live_tv_app/modules/live_room/live_room_controller.dart';\nimport 'package:simple_live_tv_app/modules/live_room/live_room_page.dart';\nimport 'package:simple_live_tv_app/modules/search/anchor/search_anchor_controller.dart';\nimport 'package:simple_live_tv_app/modules/search/anchor/search_anchor_page.dart';\nimport 'package:simple_live_tv_app/modules/search/room/search_room_controller.dart';\nimport 'package:simple_live_tv_app/modules/search/room/search_room_page.dart';\nimport 'package:simple_live_tv_app/modules/settings/settings_controller.dart';\nimport 'package:simple_live_tv_app/modules/settings/settings_page.dart';\nimport 'package:simple_live_tv_app/modules/sync/sync_controller.dart';\nimport 'package:simple_live_tv_app/modules/sync/sync_page.dart';\n\nimport 'route_path.dart';\n\nclass AppPages {\n  AppPages._();\n  static final routes = [\n    GetPage(\n      name: RoutePath.kAgreement,\n      page: () => const AgreementPage(),\n    ),\n    // 首页\n    GetPage(\n      name: RoutePath.kHome,\n      page: () => const HomePage(),\n      bindings: [\n        BindingsBuilder.put(() => HomeController()),\n      ],\n    ),\n    // 数据同步\n    GetPage(\n      name: RoutePath.kSync,\n      page: () => const SyncPage(),\n      bindings: [\n        BindingsBuilder.put(() => SyncController()),\n      ],\n    ),\n\n    // 关注\n    GetPage(\n      name: RoutePath.kFollow,\n      page: () => const FollowUserPage(),\n    ),\n\n    //直播间\n    GetPage(\n      name: RoutePath.kLiveRoomDetail,\n      page: () => const LiveRoomPage(),\n      binding: BindingsBuilder.put(\n        () => LiveRoomController(\n          pSite: Get.arguments,\n          pRoomId: Get.parameters[\"roomId\"] ?? \"\",\n        ),\n      ),\n    ),\n    //哔哩哔哩二维码登录\n    GetPage(\n      name: RoutePath.kBiliBiliQRLogin,\n      page: () => const BiliBiliQRLoginPage(),\n      bindings: [\n        BindingsBuilder.put(() => BiliBiliQRLoginController()),\n      ],\n    ),\n    // 设置\n    GetPage(\n      name: RoutePath.kSettings,\n      page: () => const SettingsPage(),\n      bindings: [\n        BindingsBuilder.put(() => SettingsController()),\n      ],\n    ),\n    // 历史记录\n    GetPage(\n      name: RoutePath.kHistory,\n      page: () => const HistoryPage(),\n      bindings: [\n        BindingsBuilder.put(() => HistoryController()),\n      ],\n    ),\n    //热门直播\n    GetPage(\n      name: RoutePath.kHotLive,\n      page: () => const HotLivePage(),\n      bindings: [\n        BindingsBuilder.put(() => HotliveController()),\n      ],\n    ),\n    //分类\n    GetPage(\n      name: RoutePath.kCategory,\n      page: () => const CategoryPage(),\n      bindings: [\n        BindingsBuilder.put(() => CategoryController()),\n      ],\n    ),\n    //分类\n    GetPage(\n      name: RoutePath.kCategoryDetail,\n      page: () => const CategoryDetailPage(),\n      binding: BindingsBuilder.put(\n        () => CategoryDetailController(\n          site: Get.arguments[0],\n          subCategory: Get.arguments[1],\n        ),\n      ),\n    ),\n    // 搜索房间\n    GetPage(\n      name: RoutePath.kSearchRoom,\n      page: () => const SearchRoomPage(),\n      bindings: [\n        BindingsBuilder.put(\n          () => SearchRoomController(\n            Get.arguments,\n          ),\n        ),\n      ],\n    ),\n    // 搜索主播\n    GetPage(\n      name: RoutePath.kSearchAnchor,\n      page: () => const SearchAnchorPage(),\n      bindings: [\n        BindingsBuilder.put(\n          () => SearchAnchorController(\n            Get.arguments,\n          ),\n        ),\n      ],\n    ),\n  ];\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/routes/route_path.dart",
    "content": "/// 路由路径\nclass RoutePath {\n  /// 用户协议\n  static const kAgreement = \"/agreement\";\n\n  /// 首页\n  static const kHome = \"/home\";\n\n  /// 数据同步\n  static const kSync = \"/sync\";\n\n  /// 搜索房间\n  static const kSearchRoom = \"/search/room\";\n\n  /// 搜索主播\n  static const kSearchAnchor = \"/search/anchor\";\n\n  /// 关注\n  static const kFollow = \"/follow\";\n\n  /// 历史记录\n  static const kHistory = \"/history\";\n\n  /// 直播间\n  static const kLiveRoomDetail = \"/room/detail\";\n\n  /// 哔哩哔哩登录\n  static const kBiliBiliQRLogin = \"/bilibili/qr_login\";\n\n  /// 设置\n  static const kSettings = \"/settings\";\n\n  /// 热门直播\n  static const kHotLive = \"/hot_live\";\n\n  /// 分类\n  static const kCategory = \"/category\";\n\n  /// 分类详情\n  static const kCategoryDetail = \"/category/detail\";\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/bilibili_account_service.dart",
    "content": "import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_core/simple_live_core.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/models/account/bilibili_user_info_page.dart';\nimport 'package:simple_live_tv_app/requests/http_client.dart';\nimport 'package:simple_live_tv_app/services/local_storage_service.dart';\n\nclass BiliBiliAccountService extends GetxService {\n  static BiliBiliAccountService get instance =>\n      Get.find<BiliBiliAccountService>();\n\n  var logined = false.obs;\n\n  var cookie = \"\";\n  var uid = 0;\n  var name = \"未登录\".obs;\n\n  @override\n  void onInit() {\n    cookie = LocalStorageService.instance\n        .getValue(LocalStorageService.kBilibiliCookie, \"\");\n    logined.value = cookie.isNotEmpty;\n    loadUserInfo();\n    super.onInit();\n  }\n\n  Future loadUserInfo() async {\n    if (cookie.isEmpty) {\n      return;\n    }\n    try {\n      var result = await HttpClient.instance.getJson(\n        \"https://api.bilibili.com/x/member/web/account\",\n        header: {\n          \"Cookie\": cookie,\n        },\n      );\n      if (result[\"code\"] == 0) {\n        var info = BiliBiliUserInfoModel.fromJson(result[\"data\"]);\n        name.value = info.uname ?? \"未登录\";\n        uid = info.mid ?? 0;\n        setSite();\n      } else {\n        SmartDialog.showToast(\"哔哩哔哩登录已失效，请重新登录\");\n        logout();\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"获取哔哩哔哩用户信息失败，可前往账号管理重试\");\n    }\n  }\n\n  void setSite() {\n    var site = (Sites.allSites[Constant.kBiliBili]!.liveSite as BiliBiliSite);\n    site.userId = uid;\n    site.cookie = cookie;\n  }\n\n  void setCookie(String cookie) {\n    this.cookie = cookie;\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliCookie, cookie);\n    logined.value = cookie.isNotEmpty;\n  }\n\n  void logout() async {\n    cookie = \"\";\n    uid = 0;\n    name.value = \"未登录\";\n    setSite();\n    LocalStorageService.instance\n        .setValue(LocalStorageService.kBilibiliCookie, \"\");\n    logined.value = false;\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/db_service.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\n\nimport 'package:simple_live_tv_app/models/db/history.dart';\n\nclass DBService extends GetxService {\n  static DBService get instance => Get.find<DBService>();\n  late Box<History> historyBox;\n  late Box<FollowUser> followBox;\n\n  Future init() async {\n    historyBox = await Hive.openBox(\"TVHostiry\");\n    followBox = await Hive.openBox(\"TVFollowUser\");\n  }\n\n  bool getFollowExist(String id) {\n    return followBox.containsKey(id);\n  }\n\n  List<FollowUser> getFollowList() {\n    return followBox.values.toList();\n  }\n\n  Future addFollow(FollowUser follow) async {\n    await followBox.put(follow.id, follow);\n  }\n\n  Future deleteFollow(String id) async {\n    await followBox.delete(id);\n  }\n\n  History? getHistory(String id) {\n    if (historyBox.containsKey(id)) {\n      return historyBox.get(id);\n    }\n    return null;\n  }\n\n  Future addOrUpdateHistory(History history) async {\n    await historyBox.put(history.id, history);\n  }\n\n  List<History> getHistores() {\n    var his = historyBox.values.toList();\n    his.sort((a, b) => b.updateTime.compareTo(a.updateTime));\n    return his;\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/follow_user_service.dart",
    "content": "import 'dart:async';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/app/event_bus.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\n\nclass FollowUserService extends BasePageController<FollowUser> {\n  static FollowUserService get instance => Get.find<FollowUserService>();\n  StreamSubscription<dynamic>? subscription;\n\n  RxList<FollowUser> livingList = RxList<FollowUser>();\n  Timer? updateTimer;\n  bool needUpdate = true;\n  @override\n  void onInit() {\n    subscription = EventBus.instance.listen(Constant.kUpdateFollow, (p0) {\n      needUpdate = false;\n      refreshData();\n    });\n\n    if (list.isEmpty) {\n      refreshData();\n    }\n    initTimer();\n    super.onInit();\n  }\n\n  void initTimer() {\n    if (AppSettingsController.instance.autoUpdateFollowEnable.value) {\n      updateTimer?.cancel();\n      updateTimer = Timer.periodic(\n        Duration(\n          minutes:\n              AppSettingsController.instance.autoUpdateFollowDuration.value,\n        ),\n        (timer) {\n          Log.logPrint(\"Update Follow Timer\");\n          refreshData();\n        },\n      );\n    } else {\n      updateTimer?.cancel();\n    }\n  }\n\n  var updatedCount = 0;\n  var updating = false.obs;\n  @override\n  Future<List<FollowUser>> getData(int page, int pageSize) async {\n    if (page > 1) {\n      return [];\n    }\n\n    var followList = DBService.instance.getFollowList();\n    if (needUpdate) {\n      startUpdateStatus(followList);\n    }\n    needUpdate = true;\n    if (followList.isEmpty) {\n      updating.value = false;\n    }\n    return followList;\n  }\n\n  void sortList() {\n    list.sort((a, b) => b.liveStatus.value.compareTo(a.liveStatus.value));\n    updateLivingList();\n  }\n\n  void updateLivingList() {\n    livingList.assignAll(list.where((x) => x.liveStatus.value == 2));\n  }\n\n  void startUpdateStatus(List<FollowUser> followList) async {\n    updatedCount = 0;\n    updating.value = true;\n\n    var threadCount =\n        AppSettingsController.instance.updateFollowThreadCount.value;\n\n    var tasks = <Future>[];\n    for (var i = 0; i < threadCount; i++) {\n      tasks.add(\n        Future(() async {\n          var start = i * followList.length ~/ threadCount;\n          var end = (i + 1) * followList.length ~/ threadCount;\n\n          // 确保 end 不超出列表长度\n          if (end > followList.length) {\n            end = followList.length;\n          }\n          var items = followList.sublist(start, end);\n          for (var item in items) {\n            await updateLiveStatus(item);\n          }\n        }),\n      );\n    }\n    await Future.wait(tasks);\n  }\n\n  Future updateLiveStatus(FollowUser item) async {\n    try {\n      var site = Sites.allSites[item.siteId]!;\n      item.liveStatus.value =\n          (await site.liveSite.getLiveStatus(roomId: item.roomId)) ? 2 : 1;\n      //sortList();\n      //updateLivingList();\n    } catch (e) {\n      Log.logPrint(e);\n    } finally {\n      updatedCount++;\n      if (updatedCount >= list.length) {\n        sortList();\n        updating.value = false;\n      }\n    }\n  }\n\n  void removeItem(FollowUser item, {bool refresh = true}) async {\n    var result =\n        await Utils.showAlertDialog(\"确定要取消关注${item.userName}吗?\", title: \"取消关注\");\n    if (!result) {\n      return;\n    }\n    await DBService.instance.followBox.delete(item.id);\n    if (refresh) {\n      refreshData();\n    } else {\n      list.remove(item);\n      livingList.remove(item);\n    }\n  }\n\n  @override\n  void onClose() {\n    updateTimer?.cancel();\n    subscription?.cancel();\n\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/local_storage_service.dart",
    "content": "import 'package:get/get.dart';\nimport 'package:hive/hive.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\n\nclass LocalStorageService extends GetxService {\n  static LocalStorageService get instance => Get.find<LocalStorageService>();\n\n  /// 首次运行\n  static const String kFirstRun = \"FirstRun\";\n\n  /// 缩放模式\n  static const String kPlayerScaleMode = \"ScaleMode\";\n\n  /// 网站排序\n  static const String kSiteSort = \"SiteSort\";\n\n  /// 首页排序\n  static const String kHomeSort = \"HomeSort\";\n\n  /// 显示模式\n  /// * [0] 跟随系统\n  /// * [1] 浅色模式\n  /// * [2] 深色模式\n  static const String kThemeMode = \"ThemeMode\";\n\n  /// DEBUG模式\n  static const String kDebugModeKey = \"DebugMode\";\n\n  /// 弹幕大小\n  static const String kDanmuSize = \"DanmuSize\";\n\n  /// 弹幕速度\n  static const String kDanmuSpeed = \"DanmuSpeed\";\n\n  /// 弹幕区域\n  static const String kDanmuArea = \"DanmuArea\";\n\n  /// 弹幕透明度\n  static const String kDanmuOpacity = \"DanmuOpacity\";\n\n  /// 弹幕描边大小\n  static const String kDanmuStrokeWidth = \"DanmuStrokeWidth\";\n\n  /// 弹幕-屏蔽滚动\n  static const String kDanmuHideScroll = \"DanmuHideScroll\";\n\n  /// 弹幕-屏蔽底部\n  static const String kDanmuHideBottom = \"DanmuHideBottom\";\n\n  /// 弹幕-屏蔽顶部\n  static const String kDanmuHideTop = \"DanmuHideTop\";\n\n  /// 弹幕-顶部边距\n  static const String kDanmuTopMargin = \"DanmuTopMargin\";\n\n  /// 弹幕-底部边距\n  static const String kDanmuBottomMargin = \"DanmuBottomMargin\";\n\n  /// 弹幕开启\n  static const String kDanmuEnable = \"DanmuEnable\";\n\n  /// 硬件解码\n  static const String kHardwareDecode = \"HardwareDecode\";\n\n  /// 聊天区文字大小\n  static const String kChatTextSize = \"ChatTextSize\";\n\n  /// 聊天区间隔\n  static const String kChatTextGap = \"ChatTextGap\";\n\n  /// 聊天区-气泡样式\n  static const String kChatBubbleStyle = \"ChatBubbleStyle\";\n\n  /// 播放清晰度，0=低，1=中，2=高\n  static const String kQualityLevel = \"QualityLevel\";\n\n  /// 蜂窝网络下播放清晰度，0=低，1=中，2=高\n  static const String kQualityLevelCellular = \"QualityLevelCellular\";\n\n  /// 开启定时关闭\n  static const String kAutoExitEnable = \"AutoExitEnable\";\n\n  /// 定时关闭时间（分钟）\n  static const String kAutoExitDuration = \"AutoExitDuration\";\n\n  /// 房间内定时关闭时间（分钟）\n  /// 需要一个不同的 key，因为用户在房间内设置的倒计时和全局的可能不同。\n  static const String kRoomAutoExitDuration = \"RoomAutoExitDuration\";\n\n  /// 播放器兼容模式\n  static const String kPlayerCompatMode = \"PlayerCompatMode\";\n\n  /// 播放器后台自动暂停\n  static const String kPlayerAutoPause = \"PlayerAutoPause\";\n\n  /// 播放器缓冲区大小\n  static const String kPlayerBufferSize = \"PlayerBufferSize\";\n\n  /// 自动全屏\n  static const String kAutoFullScreen = \"AutoFullScreen\";\n\n  /// 小窗隐藏弹幕\n  static const String kPIPHideDanmu = \"PIPHideDanmu\";\n\n  /// 哔哩哔哩cookie\n  static const String kBilibiliCookie = \"BilibiliCookie\";\n\n  ///主题色\n  static const String kStyleColor = \"kStyleColor\";\n\n  ///动态取色\n  static const String kIsDynamic = \"kIsDynamic\";\n\n  /// 提示哔哩哔哩登录\n  static const String kBilibiliLoginTip = \"BilibiliLoginTip\";\n\n  /// 开启自动更新关注\n  static const String kAutoUpdateFollowEnable = \"AutoUpdateFollowEnable\";\n\n  /// 定时自动更新关注间隔（分钟）\n  static const String kUpdateFollowDuration = \"AutoUpdateFollowDuration\";\n\n  /// 开启多线程更新关注\n  static const String kUpdateFollowThreadCount = \"UpdateFollowThreadCount\";\n\n  late Box settingsBox;\n  late Box<String> shieldBox;\n\n  Future init() async {\n    settingsBox = await Hive.openBox(\n      \"TVLocalStorage\",\n    );\n    shieldBox = await Hive.openBox(\n      \"TVDanmuShield\",\n    );\n  }\n\n  T getValue<T>(dynamic key, T defaultValue) {\n    try {\n      var value = settingsBox.get(key, defaultValue: defaultValue) as T;\n      Log.d(\"Get LocalStorage：$key\\r\\n$value\");\n      return value;\n    } catch (e) {\n      Log.logPrint(e);\n      return defaultValue;\n    }\n  }\n\n  Future setValue<T>(dynamic key, T value) async {\n    Log.d(\"Set LocalStorage：$key\\r\\n$value\");\n    return await settingsBox.put(key, value);\n  }\n\n  Future removeValue<T>(dynamic key) async {\n    Log.d(\"Remove LocalStorage：$key\");\n    return await settingsBox.delete(key);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/signalr_service.dart",
    "content": "import 'dart:async';\nimport 'package:signalr_netcore/signalr_client.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\n\nenum SignalRConnectionState {\n  connecting,\n  connected,\n  disconnected,\n}\n\nclass SignalRService {\n  static const String kUrl = \"https://sync1.nsapps.cn/sync\";\n\n  SignalRConnectionState state = SignalRConnectionState.connecting;\n\n  final _stateStreamController =\n      StreamController<SignalRConnectionState>.broadcast();\n  Stream<SignalRConnectionState> get stateStream =>\n      _stateStreamController.stream;\n\n  final _onFavoriteStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onFavoriteStream =>\n      _onFavoriteStreamController.stream;\n\n  final _onHistoryStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onHistoryStream =>\n      _onHistoryStreamController.stream;\n\n  final _onShieldWordStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onShieldWordStream =>\n      _onShieldWordStreamController.stream;\n\n  final _onBiliAccountStreamController =\n      StreamController<(bool, String)>.broadcast();\n  Stream<(bool, String)> get onBiliAccountStream =>\n      _onBiliAccountStreamController.stream;\n\n  final _onRoomDestroyedStreamController = StreamController<String>.broadcast();\n  Stream<String> get onRoomDestroyedStream =>\n      _onRoomDestroyedStreamController.stream;\n\n  final _onRoomUserUpdatedStreamController =\n      StreamController<List<RoomUser>>.broadcast();\n  Stream<List<RoomUser>> get onRoomUserUpdatedStream =>\n      _onRoomUserUpdatedStreamController.stream;\n\n  HubConnection? hubConnection;\n  Future<void> connect() async {\n    hubConnection = HubConnectionBuilder().withUrl(kUrl).build();\n    hubConnection!.onclose(({Exception? error}) {\n      state = SignalRConnectionState.disconnected;\n      _stateStreamController.add(state);\n    });\n    hubConnection!.onreconnected(({String? connectionId}) {\n      Log.d(\"reconnected: $connectionId\");\n      state = SignalRConnectionState.connected;\n      _stateStreamController.add(state);\n    });\n    await hubConnection!.start();\n    state = SignalRConnectionState.connected;\n    _stateStreamController.add(state);\n    _listen();\n  }\n\n  void _listen() {\n    hubConnection?.on(\"onFavoriteReceived\", (args) {\n      _onFavoriteStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onHistoryReceived\", (args) {\n      _onHistoryStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onShieldWordReceived\", (args) {\n      _onShieldWordStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onBiliAccountReceived\", (args) {\n      _onBiliAccountStreamController.add((args![0] as bool, args[1] as String));\n    });\n    hubConnection?.on(\"onRoomDestroyed\", (args) {\n      _onRoomDestroyedStreamController.add(args![0].toString());\n    });\n    hubConnection?.on(\"onUserUpdated\", (args) {\n      var list = (args![0] as List).map((e) => RoomUser.fromObject(e)).toList();\n      _onRoomUserUpdatedStreamController.add(list);\n    });\n  }\n\n  Future<void> disconnect() async {\n    await hubConnection?.stop();\n    state = SignalRConnectionState.disconnected;\n    _stateStreamController.add(state);\n  }\n\n  Future<Resp<String>> createRoom() async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    String app = \"Simple Live TV\";\n    String platform = 'tv';\n    String version = Utils.packageInfo.version;\n    var resp = await hubConnection\n        ?.invoke(\"CreateRoom\", args: [app, platform, version]);\n    return Resp<String>.fromObject(resp);\n  }\n\n  Future<Resp> joinRoom(String roomId) async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    String app = \"Simple Live TV\";\n    String platform = 'tv';\n    String version = Utils.packageInfo.version;\n    var resp = await hubConnection\n        ?.invoke(\"JoinRoom\", args: [roomId, app, platform, version]);\n    return Resp.fromObject(resp);\n  }\n\n  Future<Resp> sendContent({\n    required String roomName,\n    required String action,\n    required bool overlay,\n    required String content,\n  }) async {\n    if (state != SignalRConnectionState.connected) {\n      throw Exception(\"not connected\");\n    }\n    var resp =\n        await hubConnection?.invoke(action, args: [roomName, overlay, content]);\n    return Resp.fromObject(resp);\n  }\n\n  void dispose() {\n    _stateStreamController.close();\n    _onFavoriteStreamController.close();\n    _onHistoryStreamController.close();\n    _onShieldWordStreamController.close();\n    _onBiliAccountStreamController.close();\n    _onRoomDestroyedStreamController.close();\n    _onRoomUserUpdatedStreamController.close();\n\n    hubConnection?.stop();\n  }\n}\n\nclass Resp<T> {\n  final bool isSuccess;\n  final String message;\n  final T? data;\n  Resp(this.isSuccess, this.message, this.data);\n\n  factory Resp.fromJson(Map<String, dynamic> json) {\n    return Resp(\n      json['isSuccess'],\n      json['message'] ?? \"\",\n      json['data'],\n    );\n  }\n\n  factory Resp.fromObject(Object? obj) {\n    if (obj is Map<String, dynamic>) {\n      return Resp.fromJson(obj);\n    }\n    return Resp(false, \"unknown\", null);\n  }\n}\n\nclass RoomUser {\n  final String connectionId;\n  final String shortId;\n  final String platform;\n  final String version;\n  final String app;\n  final bool? isCreator;\n\n  RoomUser({\n    required this.connectionId,\n    required this.shortId,\n    required this.platform,\n    required this.version,\n    required this.app,\n    this.isCreator = false,\n  });\n\n  factory RoomUser.fromJson(Map<String, dynamic> json) {\n    return RoomUser(\n      connectionId: json['connectionId'],\n      shortId: json['shortId'],\n      platform: json['platform'],\n      version: json['version'],\n      app: json['app'],\n      isCreator: json['isCreator'],\n    );\n  }\n\n  factory RoomUser.fromObject(Object? obj) {\n    if (obj is Map<String, dynamic>) {\n      return RoomUser.fromJson(obj);\n    }\n    return RoomUser(\n      connectionId: \"\",\n      shortId: \"\",\n      platform: \"\",\n      version: \"\",\n      app: \"\",\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/services/sync_service.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:network_info_plus/network_info_plus.dart';\nimport 'package:simple_live_tv_app/app/constant.dart';\nimport 'package:simple_live_tv_app/app/controller/app_settings_controller.dart';\nimport 'package:simple_live_tv_app/app/event_bus.dart';\nimport 'package:simple_live_tv_app/app/log.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/models/db/follow_user.dart';\nimport 'package:simple_live_tv_app/models/db/history.dart';\nimport 'package:simple_live_tv_app/services/bilibili_account_service.dart';\nimport 'package:simple_live_tv_app/services/db_service.dart';\nimport 'package:udp/udp.dart';\nimport 'package:shelf/shelf.dart' as shelf;\nimport 'package:shelf/shelf_io.dart' as shelf_io;\nimport 'package:shelf_router/shelf_router.dart';\nimport 'package:uuid/uuid.dart';\n\nclass SyncService extends GetxService {\n  static SyncService get instance => Get.find<SyncService>();\n\n  UDP? udp;\n  static const int udpPort = 23235;\n  static const int httpPort = 23234;\n  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();\n  NetworkInfo networkInfo = NetworkInfo();\n  HttpServer? server;\n\n  var ipAddress = \"\".obs;\n  var httpRunning = false.obs;\n  var httpErrorMsg = \"\".obs;\n\n  var deviceId = \"\";\n  @override\n  void onInit() {\n    Log.d('SyncService init');\n    deviceId = (const Uuid().v4()).split('-').first;\n    listenUDP();\n    initServer();\n    super.onInit();\n  }\n\n  /// 监听来自其他客户端的UDP广播\n  /// - 如果收到广播，回复自己的信息\n  void listenUDP() async {\n    udp = await UDP.bind(Endpoint.any(port: const Port(udpPort)));\n    udp!.asStream().listen((datagram) {\n      var str = String.fromCharCodes(datagram!.data);\n      Log.i(\"Received: $str from ${datagram.address}:${datagram.port}\");\n      if (str.startsWith('{') && str.endsWith('}')) {\n        var data = json.decode(str);\n\n        //处理Hello的广播\n        if (data[\"type\"] == \"hello\") {\n          //如果http服务已经启动，就回复自己的信息\n          if (httpRunning.value) {\n            sendInfo();\n          }\n          return;\n        }\n      } else if (str == 'Who is SimpleLive?') {\n        //如果http服务已经启动，就回复自己的信息\n        if (httpRunning.value) {\n          sendInfo();\n        }\n      }\n    });\n  }\n\n  /// 发送自己的信息\n  void sendInfo() async {\n    //var ip = await getLocalIP();\n\n    var name = await getDeviceName();\n\n    var data = {\n      \"id\": deviceId,\n      \"type\": \"tv\",\n      \"name\": name,\n      //\"address\": ip,\n      //\"port\": httpPort,\n    };\n\n    await udp!.send(\n      json.encode(data).codeUnits,\n      Endpoint.broadcast(\n        port: const Port(udpPort),\n      ),\n    );\n    Log.i(\"send udp info: $data\");\n  }\n\n  /// 读取本地IP\n  /// - 如果是wifi，直接获取wifi的IP\n  /// - 如果是有线，获取所有的IP，找到全部的IP\n  Future<String> getLocalIP() async {\n    var ip = await networkInfo.getWifiIP();\n    if (ip == null || ip.isEmpty) {\n      var interfaces = await NetworkInterface.list();\n      var ipList = <String>[];\n      for (var interface in interfaces) {\n        for (var addr in interface.addresses) {\n          if (addr.type.name == 'IPv4' &&\n              !addr.address.startsWith('127') &&\n              !addr.isMulticast &&\n              !addr.isLoopback) {\n            ipList.add(addr.address);\n            break;\n          }\n        }\n      }\n      ip = ipList.join(';');\n    }\n    return ip;\n  }\n\n  Future<String> getDeviceName() async {\n    var name = \"SimpleLive-TV\";\n    if (Platform.isAndroid) {\n      var info = await deviceInfo.androidInfo;\n      name = info.model;\n    } else if (Platform.isIOS) {\n      var info = await deviceInfo.iosInfo;\n      name = info.name;\n    } else if (Platform.isMacOS) {\n      var info = await deviceInfo.macOsInfo;\n      name = info.computerName;\n    } else if (Platform.isLinux) {\n      var info = await deviceInfo.linuxInfo;\n      name = info.name;\n    } else if (Platform.isWindows) {\n      var info = await deviceInfo.windowsInfo;\n      name = info.userName;\n    }\n    return name;\n  }\n\n  /// 初始化HTTP服务\n  void initServer() async {\n    try {\n      var serverRouter = Router();\n      serverRouter.get('/', _helloRequest);\n      serverRouter.get('/info', _infoRequest);\n      serverRouter.post('/sync/follow', _syncFollowUserReuqest);\n      serverRouter.post('/sync/history', _syncHistoryReuqest);\n      serverRouter.post('/sync/blocked_word', _syncBlockedWordReuqest);\n      serverRouter.post('/sync/account/bilibili', _syncBiliAccountReuqest);\n\n      var server = await shelf_io.serve(\n        serverRouter,\n        InternetAddress.anyIPv4,\n        httpPort,\n      );\n\n      // Enable content compression\n      server.autoCompress = true;\n\n      httpRunning.value = true;\n\n      var ip = await getLocalIP();\n      ipAddress.value = ip;\n\n      Log.d('Serving at http://$ip:${server.port}');\n    } catch (e) {\n      httpErrorMsg.value = e.toString();\n      Log.logPrint(e);\n    }\n  }\n\n  /// 测试服务能否正常访问\n  shelf.Response _helloRequest(shelf.Request request) {\n    return toJsonResponse({\n      'status': true,\n      'message': 'http server is running...',\n      \"version\":\n          'SimpeLive ${Platform.operatingSystem} v${Utils.packageInfo.version}',\n    });\n  }\n\n  /// 发送自己的信息\n  Future<shelf.Response> _infoRequest(shelf.Request request) async {\n    var name = await getDeviceName();\n    return toJsonResponse({\n      \"id\": deviceId,\n      'type': 'tv',\n      'name': name,\n      'version': Utils.packageInfo.version,\n      'address': ipAddress.value,\n      'port': httpPort,\n    });\n  }\n\n  /// 同步关注用户列表\n  Future<shelf.Response> _syncFollowUserReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n\n      var body = await request.readAsString();\n      Log.d('_syncFollowUserReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        await DBService.instance.followBox.clear();\n      }\n      for (var item in jsonBody) {\n        var user = FollowUser.fromJson(item);\n        await DBService.instance.followBox.put(user.id, user);\n      }\n\n      SmartDialog.showToast('已同步关注用户列表');\n      EventBus.instance.emit(Constant.kUpdateFollow, 0);\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步观看记录\n  Future<shelf.Response> _syncHistoryReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n      var body = await request.readAsString();\n      Log.d('_syncFollowUserReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        await DBService.instance.historyBox.clear();\n      }\n      for (var item in jsonBody) {\n        var history = History.fromJson(item);\n        if (DBService.instance.historyBox.containsKey(history.id)) {\n          var old = DBService.instance.historyBox.get(history.id);\n          //如果本地的更新时间比较新，就不更新\n          if (old!.updateTime.isAfter(history.updateTime)) {\n            continue;\n          }\n        }\n        await DBService.instance.addOrUpdateHistory(history);\n      }\n\n      SmartDialog.showToast('已同步观看记录');\n      EventBus.instance.emit(Constant.kUpdateHistory, 0);\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步弹幕屏蔽词\n  Future<shelf.Response> _syncBlockedWordReuqest(shelf.Request request) async {\n    try {\n      var overlay =\n          int.parse(request.requestedUri.queryParameters['overlay'] ?? '0');\n      var body = await request.readAsString();\n      Log.d('_syncBlockedWordReuqest: $body');\n      var jsonBody = json.decode(body);\n      if (overlay == 1) {\n        AppSettingsController.instance.clearShieldList();\n      }\n      for (var keyword in jsonBody) {\n        AppSettingsController.instance.addShieldList(keyword.trim());\n      }\n      SmartDialog.showToast('已同步弹幕屏蔽词');\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  /// 同步哔哩哔哩账号\n  Future<shelf.Response> _syncBiliAccountReuqest(shelf.Request request) async {\n    try {\n      var body = await request.readAsString();\n      Log.d('_syncBiliAccountReuqest: $body');\n      var jsonBody = json.decode(body);\n      var cookie = jsonBody['cookie'];\n      BiliBiliAccountService.instance.setCookie(cookie);\n      BiliBiliAccountService.instance.loadUserInfo();\n      SmartDialog.showToast('已同步哔哩哔哩账号');\n      return toJsonResponse({\n        'status': true,\n        'message': 'success',\n      });\n    } catch (e) {\n      return toJsonResponse({\n        'status': false,\n        'message': e.toString(),\n      });\n    }\n  }\n\n  shelf.Response toJsonResponse(Map<String, dynamic> data) {\n    return shelf.Response.ok(\n      json.encode(data),\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      encoding: Encoding.getByName('utf-8'),\n    );\n  }\n\n  @override\n  void onClose() {\n    Log.d('SyncService close');\n    udp?.close();\n    server?.close(force: true);\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/app_scaffold.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass AppScaffold extends StatelessWidget {\n  final Widget child;\n  const AppScaffold({required this.child, Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Stack(\n        children: [\n          Container(\n            decoration: const BoxDecoration(\n              gradient: LinearGradient(\n                begin: Alignment.topLeft,\n                end: Alignment.bottomRight,\n                colors: [\n                  // //linear-gradient(135deg,#152331,#000000)\n                  // Color.fromARGB(255, 29, 50, 70),\n                  // Color.fromARGB(255, 14, 21, 29),\n                  // Color.fromARGB(255, 29, 50, 70),\n                  // linear-gradient(135deg,#141e30,#243b55)\n                  Color(0xff141e30),\n                  Color(0xff243b55),\n                  Color(0xff141e30),\n                ],\n              ),\n            ),\n          ),\n          Positioned.fill(child: child),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/button/highlight_button.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\n\nclass HighlightButton extends StatelessWidget {\n  final String text;\n  final IconData? iconData;\n  final Widget? icon;\n  final AppFocusNode focusNode;\n  final Function()? onTap;\n  final bool autofocus;\n  final bool selected;\n  const HighlightButton({\n    this.iconData,\n    required this.text,\n    this.icon,\n    this.onTap,\n    required this.focusNode,\n    this.autofocus = false,\n    this.selected = false,\n    super.key,\n  });\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => HighlightWidget(\n        focusNode: focusNode,\n        borderRadius: AppStyle.radius32,\n        color: Colors.white10,\n        onTap: onTap,\n        autofocus: autofocus,\n        selected: selected,\n        child: Container(\n          height: 64.w,\n          //width: 64.w,\n          padding: AppStyle.edgeInsetsH24,\n          decoration: BoxDecoration(\n            borderRadius: AppStyle.radius32,\n          ),\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              buildIcon(),\n              Text(\n                text,\n                style: TextStyle(\n                  fontSize: 28.w,\n                  color: (focusNode.isFoucsed.value || selected)\n                      ? Colors.black\n                      : Colors.white,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildIcon() {\n    if (icon != null || iconData != null) {\n      return Padding(\n        padding: AppStyle.edgeInsetsR12,\n        child: icon ??\n            Icon(\n              iconData,\n              size: 40.w,\n              color: (focusNode.isFoucsed.value || selected)\n                  ? Colors.black\n                  : Colors.white,\n            ),\n      );\n    }\n    return const SizedBox();\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/button/highlight_list_tile.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\n\nclass HighlightListTile extends StatelessWidget {\n  final String title;\n  final String? subtitle;\n  final Widget? leading;\n  final Widget? trailing;\n  final AppFocusNode focusNode;\n  final Function()? onTap;\n  final bool autofocus;\n\n  const HighlightListTile({\n    this.subtitle,\n    required this.title,\n    this.leading,\n    this.onTap,\n    required this.focusNode,\n    this.autofocus = false,\n    this.trailing,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => IconTheme(\n        data: IconThemeData(\n          color: focusNode.isFoucsed.value ? Colors.black : Colors.white,\n        ),\n        child: HighlightWidget(\n          onTap: onTap,\n          autofocus: autofocus,\n          focusNode: focusNode,\n          borderRadius: AppStyle.radius16,\n          child: Padding(\n            padding: AppStyle.edgeInsetsA24,\n            child: Row(\n              children: [\n                if (leading != null) leading!,\n                if (leading != null) AppStyle.hGap32,\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    children: [\n                      Text(\n                        title,\n                        style: focusNode.isFoucsed.value\n                            ? AppStyle.textStyleBlack\n                            : AppStyle.textStyleWhite,\n                      ),\n                      if (subtitle != null)\n                        Text(\n                          subtitle!,\n                          style: focusNode.isFoucsed.value\n                              ? AppStyle.textStyleBlack.copyWith(fontSize: 24.w)\n                              : AppStyle.textStyleWhite\n                                  .copyWith(fontSize: 24.w),\n                        ),\n                    ],\n                  ),\n                ),\n                AppStyle.hGap12,\n                if (onTap != null &&\n                    focusNode.isFoucsed.value &&\n                    trailing == null)\n                  Icon(\n                    Icons.chevron_right,\n                    size: 40.w,\n                    color:\n                        focusNode.isFoucsed.value ? Colors.black : Colors.white,\n                  ),\n                if (trailing != null) trailing!,\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/button/home_big_button.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\n\nclass HomeBigButton extends StatelessWidget {\n  final String text;\n  final IconData iconData;\n  final AppFocusNode focusNode;\n  final Function()? onTap;\n  final bool autofocus;\n  const HomeBigButton({\n    required this.iconData,\n    required this.text,\n    this.onTap,\n    required this.focusNode,\n    this.autofocus = false,\n    super.key,\n  });\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => HighlightWidget(\n        onTap: onTap,\n        autofocus: autofocus,\n        focusNode: focusNode,\n        borderRadius: AppStyle.radius16,\n        color: Colors.white10,\n        child: Container(\n          padding: AppStyle.edgeInsetsA32.copyWith(left: 48.w, right: 48.w),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Container(\n                padding: AppStyle.edgeInsetsA12,\n                decoration: const BoxDecoration(\n                  shape: BoxShape.circle,\n                ),\n                child: Icon(\n                  iconData,\n                  size: 64.w,\n                  color:\n                      focusNode.isFoucsed.value ? Colors.black : Colors.white,\n                ),\n              ),\n              AppStyle.vGap24,\n              Text(\n                text,\n                style: TextStyle(\n                  fontSize: 36.w,\n                  color:\n                      focusNode.isFoucsed.value ? Colors.black : Colors.white,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/card/anchor_card.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/sites.dart';\nimport 'package:simple_live_tv_app/routes/app_navigation.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\nimport 'package:simple_live_tv_app/widgets/net_image.dart';\n\nclass AnchorCard extends StatelessWidget {\n  final String siteId;\n  final String face;\n  final String name;\n  final String roomId;\n  final int liveStatus;\n  final bool autofocus;\n  final Function()? onTap;\n  final AppFocusNode? focusNode;\n  const AnchorCard({\n    required this.face,\n    required this.siteId,\n    required this.name,\n    required this.liveStatus,\n    required this.roomId,\n    this.autofocus = false,\n    this.focusNode,\n    this.onTap,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    var site = Sites.allSites[siteId]!;\n    var focusNode = this.focusNode ?? AppFocusNode();\n    return Obx(\n      () => HighlightWidget(\n        onTap: onTap ??\n            () {\n              AppNavigator.toLiveRoomDetail(site: site, roomId: roomId);\n            },\n        focusNode: focusNode,\n        autofocus: autofocus,\n        borderRadius: AppStyle.radius16,\n        color: Colors.white10,\n        child: Stack(\n          children: [\n            Padding(\n              padding: AppStyle.edgeInsetsA20,\n              child: Row(\n                mainAxisSize: MainAxisSize.max,\n                children: [\n                  NetImage(\n                    face,\n                    width: 100.w,\n                    height: 100.w,\n                    borderRadius: 100.w,\n                    cacheWidth: 100,\n                  ),\n                  AppStyle.hGap16,\n                  Expanded(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.stretch,\n                      children: [\n                        Text(\n                          name,\n                          style: TextStyle(\n                            fontSize: 36.w,\n                            overflow: TextOverflow.ellipsis,\n                            color: focusNode.isFoucsed.value\n                                ? Colors.black\n                                : Colors.white,\n                          ),\n                        ),\n                        Text.rich(\n                          TextSpan(\n                            children: [\n                              WidgetSpan(\n                                child: Image.asset(\n                                  site.logo,\n                                  width: 32.w,\n                                ),\n                              ),\n                              TextSpan(\n                                text: \" ${site.name}\",\n                              ),\n                            ],\n                          ),\n                          style: TextStyle(\n                            fontSize: 24.w,\n                            color: focusNode.isFoucsed.value\n                                ? Colors.black\n                                : Colors.white,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            if (liveStatus == 2)\n              Positioned(\n                right: 0,\n                top: 0,\n                child: Container(\n                  padding:\n                      AppStyle.edgeInsetsH16.copyWith(top: 4.w, bottom: 4.w),\n                  decoration: BoxDecoration(\n                    color: Colors.green,\n                    borderRadius: BorderRadius.only(\n                      topRight: Radius.circular(12.w),\n                      bottomLeft: Radius.circular(12.w),\n                    ),\n                  ),\n                  child: Text(\n                    \"直播中\",\n                    style: TextStyle(\n                      fontSize: 24.w,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/card/live_room_card.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/app/utils.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\nimport 'package:simple_live_tv_app/widgets/net_image.dart';\nimport 'package:marquee/marquee.dart';\n\nclass LiveRoomCard extends StatelessWidget {\n  final String cover;\n  final String title;\n  final String anchor;\n  final String roomId;\n  final int online;\n  final bool autofocus;\n  final AppFocusNode focusNode;\n  final Function()? onTap;\n  const LiveRoomCard({\n    required this.cover,\n    required this.title,\n    required this.anchor,\n    required this.roomId,\n    required this.focusNode,\n    required this.online,\n    this.autofocus = false,\n    this.onTap,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return HighlightWidget(\n      focusNode: focusNode,\n      color: Colors.white10,\n      onTap: onTap,\n      borderRadius: AppStyle.radius16,\n      child: Obx(\n        () => Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            ClipRRect(\n              borderRadius: BorderRadius.only(\n                topLeft: Radius.circular(16.w),\n                topRight: Radius.circular(16.w),\n              ),\n              child: Stack(\n                children: [\n                  AspectRatio(\n                    aspectRatio: 16 / 9,\n                    child: NetImage(\n                      cover,\n                      cacheWidth: 400,\n                    ),\n                  ),\n                  Positioned(\n                    right: 8.w,\n                    top: 8.w,\n                    child: Container(\n                      padding:\n                          AppStyle.edgeInsetsH8.copyWith(top: 4.w, bottom: 4.w),\n                      decoration: BoxDecoration(\n                        color: focusNode.isFoucsed.value\n                            ? Colors.white\n                            : Colors.black54,\n                        borderRadius: AppStyle.radius8,\n                      ),\n                      child: Text.rich(\n                        TextSpan(\n                          text: \"\",\n                          children: [\n                            WidgetSpan(\n                              alignment: PlaceholderAlignment.middle,\n                              child: Padding(\n                                padding: AppStyle.edgeInsetsR8,\n                                child: Icon(\n                                  Icons.whatshot,\n                                  color: focusNode.isFoucsed.value\n                                      ? Colors.orange\n                                      : Colors.white,\n                                  size: 20.w,\n                                ),\n                              ),\n                            ),\n                            TextSpan(\n                              text: Utils.onlineToString(online),\n                            ),\n                          ],\n                        ),\n                        style: TextStyle(\n                          fontSize: 20.w,\n                          color: focusNode.isFoucsed.value\n                              ? Colors.black\n                              : Colors.white,\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n              // child: Container(\n              //   height: 200.w,\n              // ),\n            ),\n            AppStyle.vGap8,\n            Padding(\n              padding: AppStyle.edgeInsetsH20,\n              child: SizedBox(\n                height: 56.w,\n                child: focusNode.isFoucsed.value\n                    ? Marquee(\n                        text: title,\n                        style: AppStyle.textStyleBlack,\n                        startAfter: const Duration(seconds: 1),\n                        velocity: 20,\n                        blankSpace: 200.w,\n                        //decelerationDuration: const Duration(seconds: 2),\n                        scrollAxis: Axis.horizontal,\n                      )\n                    : Container(\n                        alignment: Alignment.centerLeft,\n                        child: Text(\n                          title,\n                          style: AppStyle.textStyleWhite,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                      ),\n              ),\n            ),\n            Row(\n              crossAxisAlignment: CrossAxisAlignment.end,\n              children: [\n                AppStyle.hGap20,\n                Icon(\n                  Icons.account_circle,\n                  color: focusNode.isFoucsed.value\n                      ? Colors.black54\n                      : Colors.white54,\n                  size: 32.w,\n                ),\n                AppStyle.hGap12,\n                Expanded(\n                  child: Text(\n                    anchor,\n                    style: focusNode.isFoucsed.value\n                        ? AppStyle.subTextStyleBlack\n                        : AppStyle.subTextStyleWhite,\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n              ],\n            ),\n            AppStyle.vGap12,\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/highlight_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\n\ntypedef FocusOnKeyDownCallback = KeyEventResult Function();\n\n/// 高亮组件\nclass HighlightWidget extends StatelessWidget {\n  final AppFocusNode focusNode;\n  final Widget child;\n  final FocusOnKeyDownCallback? onUpKey;\n  final FocusOnKeyDownCallback? onDownKey;\n  final FocusOnKeyDownCallback? onLeftKey;\n  final FocusOnKeyDownCallback? onRightKey;\n  final Function(bool)? onFocusChange;\n  final Function()? onTap;\n  final Color foucsedColor;\n  final Color color;\n  final bool autofocus;\n  final BorderRadius? borderRadius;\n  final double order;\n  final bool selected;\n  const HighlightWidget({\n    required this.focusNode,\n    required this.child,\n    this.onUpKey,\n    this.onDownKey,\n    this.onLeftKey,\n    this.onRightKey,\n    this.onFocusChange,\n    this.onTap,\n    this.autofocus = false,\n    this.selected = false,\n    this.borderRadius,\n    this.order = 0.0,\n    this.color = Colors.transparent,\n    this.foucsedColor = Colors.white,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return FocusTraversalOrder(\n      order: NumericFocusOrder(order),\n      child: Focus(\n        focusNode: focusNode,\n        autofocus: autofocus,\n        onFocusChange: onFocusChange,\n        onKeyEvent: (node, e) {\n          if (e is KeyDownEvent) {\n            if (e.logicalKey == LogicalKeyboardKey.arrowRight) {\n              return onRightKey?.call() ?? KeyEventResult.ignored;\n            }\n            if (e.logicalKey == LogicalKeyboardKey.arrowLeft) {\n              return onLeftKey?.call() ?? KeyEventResult.ignored;\n            }\n            if (e.logicalKey == LogicalKeyboardKey.arrowUp) {\n              return onUpKey?.call() ?? KeyEventResult.ignored;\n            }\n            if (e.logicalKey == LogicalKeyboardKey.arrowDown) {\n              return onDownKey?.call() ?? KeyEventResult.ignored;\n            }\n            if (e.logicalKey == LogicalKeyboardKey.enter ||\n                e.logicalKey == LogicalKeyboardKey.select ||\n                e.logicalKey == LogicalKeyboardKey.space) {\n              return onTap?.call() ?? KeyEventResult.ignored;\n            }\n          }\n\n          return KeyEventResult.ignored;\n        },\n        child: GestureDetector(\n          onTap: onTap,\n          child: Obx(\n            () => AnimatedScale(\n              scale: focusNode.isFoucsed.value ? 1.1 : 1,\n              duration: const Duration(milliseconds: 200),\n              child: GestureDetector(\n                onTap: onTap,\n                child: Container(\n                  decoration: BoxDecoration(\n                    borderRadius: borderRadius,\n                    boxShadow: focusNode.isFoucsed.value\n                        ? AppStyle.highlightShadow\n                        : null,\n                    color: (focusNode.isFoucsed.value || selected)\n                        ? foucsedColor\n                        : color,\n                  ),\n                  child: child,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/keep_alive_wrapper.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass KeepAliveWrapper extends StatefulWidget {\n  final Widget child;\n\n  const KeepAliveWrapper({Key? key, required this.child}) : super(key: key);\n\n  @override\n  State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();\n}\n\nclass _KeepAliveWrapperState extends State<KeepAliveWrapper>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return widget.child;\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/net_image.dart",
    "content": "import 'package:extended_image/extended_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\n\nclass NetImage extends StatelessWidget {\n  final String picUrl;\n  final double? width;\n  final double? height;\n  final BoxFit? fit;\n  final double borderRadius;\n  final int? cacheWidth;\n  const NetImage(this.picUrl,\n      {this.width,\n      this.height,\n      this.fit = BoxFit.cover,\n      this.borderRadius = 0,\n      this.cacheWidth,\n      Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    var pic = picUrl;\n    if (pic.startsWith(\"//\")) {\n      pic = 'https:$pic';\n    }\n    return ClipRRect(\n      borderRadius: BorderRadius.circular(borderRadius),\n      child: ExtendedImage.network(\n        pic,\n        fit: fit,\n        height: height,\n        width: width,\n        cacheWidth: cacheWidth,\n        shape: BoxShape.rectangle,\n        borderRadius: BorderRadius.circular(borderRadius),\n        loadStateChanged: (e) {\n          if (e.extendedImageLoadState == LoadState.loading) {\n            return const SizedBox();\n          }\n          if (e.extendedImageLoadState == LoadState.failed) {\n            return Icon(\n              Icons.broken_image,\n              color: Colors.grey,\n              size: 24.w,\n            );\n          }\n          return null;\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/page_grid_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:simple_live_tv_app/app/controller/base_controller.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_empty_widget.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_error_widget.dart';\nimport 'package:simple_live_tv_app/widgets/status/app_loadding_widget.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\nimport 'package:get/get.dart';\n\nclass PageGridView extends StatelessWidget {\n  final BasePageController pageController;\n  final IndexedWidgetBuilder itemBuilder;\n  final EdgeInsets? padding;\n  final bool firstRefresh;\n  final Function()? onLoginSuccess;\n  final bool showPageLoadding;\n  final double crossAxisSpacing, mainAxisSpacing;\n  final int crossAxisCount;\n  const PageGridView({\n    required this.itemBuilder,\n    required this.pageController,\n    this.padding,\n    this.firstRefresh = false,\n    this.showPageLoadding = false,\n    this.onLoginSuccess,\n    this.crossAxisSpacing = 0.0,\n    this.mainAxisSpacing = 0.0,\n    required this.crossAxisCount,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () => Stack(\n        children: [\n          MasonryGridView.count(\n            padding: padding,\n            controller: pageController.scrollController,\n            itemCount: pageController.list.length,\n            itemBuilder: itemBuilder,\n            crossAxisCount: crossAxisCount,\n            crossAxisSpacing: crossAxisSpacing,\n            mainAxisSpacing: mainAxisSpacing,\n          ),\n          Offstage(\n            offstage: !pageController.pageEmpty.value,\n            child: AppEmptyWidget(\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n          Offstage(\n            offstage: !(showPageLoadding && pageController.pageLoadding.value),\n            child: const AppLoaddingWidget(),\n          ),\n          Offstage(\n            offstage: !pageController.pageError.value,\n            child: AppErrorWidget(\n              errorMsg: pageController.errorMsg.value,\n              onRefresh: () => pageController.refreshData(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/rectangular_indicator.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// 来自 https://github.com/adar2378/tab_indicator_styler\n\nclass RectangularIndicator extends Decoration {\n  /// topRight radius of the indicator, default to 5.\n  final double topRightRadius;\n\n  /// topLeft radius of the indicator, default to 5.\n  final double topLeftRadius;\n\n  /// bottomRight radius of the indicator, default to 0.\n  final double bottomRightRadius;\n\n  /// bottomLeft radius of the indicator, default to 0\n  final double bottomLeftRadius;\n\n  /// Color of the indicator, default set to [Colors.black]\n  final Color color;\n\n  /// Horizontal padding of the indicator, default set to 0\n  final double horizontalPadding;\n\n  /// Vertical padding of the indicator, default set to 0\n  final double verticalPadding;\n\n  /// [PagingStyle] determines if the indicator should be fill or stroke, default to fill\n  final PaintingStyle paintingStyle;\n\n  /// StrokeWidth, used for [PaintingStyle.stroke], default set to 0\n  final double strokeWidth;\n\n  const RectangularIndicator({\n    this.topRightRadius = 5,\n    this.topLeftRadius = 5,\n    this.bottomRightRadius = 0,\n    this.bottomLeftRadius = 0,\n    this.color = Colors.black,\n    this.horizontalPadding = 0,\n    this.verticalPadding = 0,\n    this.paintingStyle = PaintingStyle.fill,\n    this.strokeWidth = 2,\n  });\n  @override\n  MyCustomPainter createBoxPainter([VoidCallback? onChanged]) {\n    return MyCustomPainter(\n      this,\n      onChanged,\n      bottomLeftRadius: bottomLeftRadius,\n      bottomRightRadius: bottomRightRadius,\n      color: color,\n      horizontalPadding: horizontalPadding,\n      topLeftRadius: topLeftRadius,\n      topRightRadius: topRightRadius,\n      verticalPadding: verticalPadding,\n      paintingStyle: paintingStyle,\n      strokeWidth: strokeWidth,\n    );\n  }\n}\n\nclass MyCustomPainter extends BoxPainter {\n  final RectangularIndicator decoration;\n  final double topRightRadius;\n  final double topLeftRadius;\n  final double bottomRightRadius;\n  final double bottomLeftRadius;\n  final Color color;\n  final double horizontalPadding;\n  final double verticalPadding;\n  final PaintingStyle paintingStyle;\n  final double strokeWidth;\n\n  MyCustomPainter(\n    this.decoration,\n    VoidCallback? onChanged, {\n    required this.topRightRadius,\n    required this.topLeftRadius,\n    required this.bottomRightRadius,\n    required this.bottomLeftRadius,\n    required this.color,\n    required this.horizontalPadding,\n    required this.verticalPadding,\n    required this.paintingStyle,\n    required this.strokeWidth,\n  }) : super(onChanged);\n\n  @override\n  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {\n    assert(horizontalPadding >= 0);\n    assert(horizontalPadding < configuration.size!.width / 2,\n        \"Padding must be less than half of the size of the tab\");\n    assert(verticalPadding < configuration.size!.height / 2 &&\n        verticalPadding >= 0);\n    assert(strokeWidth >= 0 &&\n        strokeWidth < configuration.size!.width / 2 &&\n        strokeWidth < configuration.size!.height / 2);\n\n    //offset is the position from where the decoration should be drawn.\n    //configuration.size tells us about the height and width of the tab.\n    Size mysize = Size(configuration.size!.width - (horizontalPadding * 2),\n        configuration.size!.height - (2 * verticalPadding));\n\n    Offset myoffset =\n        Offset(offset.dx + (horizontalPadding), offset.dy + verticalPadding);\n    final Rect rect = myoffset & mysize;\n    final Paint paint = Paint();\n    paint.color = color;\n    paint.style = paintingStyle;\n    paint.strokeWidth = 3;\n    canvas.drawRRect(\n        RRect.fromRectAndCorners(\n          rect,\n          bottomRight: Radius.circular(bottomRightRadius),\n          bottomLeft: Radius.circular(bottomLeftRadius),\n          topLeft: Radius.circular(topLeftRadius),\n          topRight: Radius.circular(topRightRadius),\n        ),\n        paint);\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/settings_item_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:simple_live_tv_app/widgets/highlight_widget.dart';\n\nclass SettingsItemWidget extends StatelessWidget {\n  final AppFocusNode foucsNode;\n  final Map<dynamic, String> items;\n  final dynamic value;\n  final String title;\n  final bool autofocus;\n  final Function(dynamic) onChanged;\n  const SettingsItemWidget({\n    required this.foucsNode,\n    required this.items,\n    required this.value,\n    required this.title,\n    required this.onChanged,\n    this.autofocus = false,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return HighlightWidget(\n      focusNode: foucsNode,\n      autofocus: autofocus,\n      borderRadius: AppStyle.radius16,\n      onLeftKey: () {\n        if (items.isEmpty) return KeyEventResult.handled;\n        if (items.keys.first == value) {\n          onChanged(items.keys.last);\n        } else {\n          onChanged(\n              items.keys.elementAt(items.keys.toList().indexOf(value) - 1));\n        }\n        return KeyEventResult.handled;\n      },\n      onRightKey: () {\n        if (items.isEmpty) return KeyEventResult.handled;\n        if (items.keys.last == value) {\n          onChanged(items.keys.first);\n        } else {\n          onChanged(\n              items.keys.elementAt(items.keys.toList().indexOf(value) + 1));\n        }\n        return KeyEventResult.handled;\n      },\n      onTap: () {\n        showSettingsDialog();\n      },\n      child: Obx(\n        () => Padding(\n          padding: AppStyle.edgeInsetsA24,\n          child: Row(\n            children: [\n              Text(\n                title,\n                style: foucsNode.isFoucsed.value\n                    ? AppStyle.textStyleBlack\n                    : AppStyle.textStyleWhite,\n              ),\n              const Spacer(),\n              if (foucsNode.isFoucsed.value && items.isNotEmpty)\n                Icon(\n                  Icons.chevron_left,\n                  size: 40.w,\n                  color:\n                      foucsNode.isFoucsed.value ? Colors.black : Colors.white,\n                ),\n              AppStyle.hGap12,\n              ConstrainedBox(\n                constraints: BoxConstraints(minWidth: 120.w),\n                child: Text(\n                  items[value] ?? '',\n                  style: foucsNode.isFoucsed.value\n                      ? AppStyle.textStyleBlack\n                      : AppStyle.textStyleWhite,\n                  textAlign: foucsNode.isFoucsed.value\n                      ? TextAlign.center\n                      : TextAlign.right,\n                ),\n              ),\n              AppStyle.hGap12,\n              if (foucsNode.isFoucsed.value && items.isNotEmpty)\n                Icon(\n                  Icons.chevron_right,\n                  size: 40.w,\n                  color:\n                      foucsNode.isFoucsed.value ? Colors.black : Colors.white,\n                ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void showSettingsDialog() {\n    Get.dialog(\n      AlertDialog(\n        backgroundColor: Get.theme.cardColor,\n        surfaceTintColor: Colors.transparent,\n        title: Text(title, style: AppStyle.titleStyleWhite),\n        scrollable: true,\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: items.keys.map((e) {\n            return ListTile(\n              title: Text(items[e] ?? '', style: AppStyle.textStyleWhite),\n              contentPadding: AppStyle.edgeInsetsH20,\n              autofocus: e == value,\n              shape: RoundedRectangleBorder(\n                borderRadius: AppStyle.radius16,\n              ),\n              focusColor: Colors.white54,\n              onTap: () {\n                onChanged(e);\n                Get.back();\n              },\n            );\n          }).toList(),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/status/app_empty_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:simple_live_tv_app/app/app_focus_node.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:lottie/lottie.dart';\nimport 'package:simple_live_tv_app/widgets/button/highlight_button.dart';\n\nclass AppEmptyWidget extends StatelessWidget {\n  final Function()? onRefresh;\n  final String? text;\n  const AppEmptyWidget({\n    this.onRefresh,\n    this.text,\n    Key? key,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: GestureDetector(\n        onTap: () {\n          onRefresh?.call();\n        },\n        child: Padding(\n          padding: AppStyle.edgeInsetsA48,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              LottieBuilder.asset(\n                'assets/lotties/empty.json',\n                width: 160.w,\n                height: 160.w,\n                repeat: false,\n              ),\n              AppStyle.vGap24,\n              Text(\n                text ?? \"这里什么都没有\",\n                textAlign: TextAlign.center,\n                style: AppStyle.textStyleWhite,\n              ),\n              AppStyle.vGap24,\n              if (onRefresh != null)\n                HighlightButton(\n                  text: \"刷新\",\n                  iconData: Icons.refresh,\n                  onTap: onRefresh,\n                  focusNode: AppFocusNode(),\n                ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/status/app_error_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\nimport 'package:lottie/lottie.dart';\n\nclass AppErrorWidget extends StatelessWidget {\n  final Function()? onRefresh;\n  final String errorMsg;\n  const AppErrorWidget({this.errorMsg = \"\", this.onRefresh, Key? key})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: Padding(\n        padding: AppStyle.edgeInsetsA12,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            LottieBuilder.asset(\n              'assets/lotties/error.json',\n              width: 200.w,\n              repeat: false,\n            ),\n            AppStyle.vGap24,\n            Text(\n              errorMsg.isEmpty ? \"出错了，请稍后重试\" : errorMsg,\n              textAlign: TextAlign.center,\n              style: AppStyle.textStyleWhite,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/lib/widgets/status/app_loadding_widget.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:simple_live_tv_app/app/app_style.dart';\n\nclass AppLoaddingWidget extends StatelessWidget {\n  const AppLoaddingWidget({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Center(\n      child: Container(\n        padding: AppStyle.edgeInsetsA12,\n        decoration: BoxDecoration(\n          shape: BoxShape.circle,\n          color: Theme.of(context).cardColor,\n          boxShadow: Get.isDarkMode\n              ? []\n              : [\n                  BoxShadow(\n                    blurRadius: 4,\n                    color: Colors.grey.withAlpha(50),\n                  )\n                ],\n        ),\n        child: const CupertinoActivityIndicator(\n          radius: 10,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/pubspec.yaml",
    "content": "name: simple_live_tv_app\ndescription: A new Flutter project.\npublish_to: \"none\"\nversion: 1.6.5+10605\n\nenvironment:\n  sdk: \">=3.1.2 <4.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  simple_live_core:\n    path: ../simple_live_core\n  cupertino_icons: ^1.0.2\n  remixicon: ^1.0.0 #Remix图标\n\n  # 框架、工具\n  get: ^4.7.2 #状态管理、路由管理、国际化\n  dio: ^5.9.0 #网络请求\n  hive: 2.2.3 #持久化存储\n  hive_flutter: 1.1.0 #持久化存储\n  logger: ^2.6.1 #日志\n  intl: ^0.20.2 #国际化\n  flutter_screenutil: ^5.9.3 #UI适配\n  uuid: ^4.5.1 #UUID\n  signalr_netcore: ^1.4.4 #SignalR\n  crypto: ^3.0.6\n\n  #Widget\n  flutter_staggered_grid_view: ^0.7.0 #瀑布流/GridView\n  flutter_easyrefresh: 2.2.2 #下拉刷新、上拉加载\n  extended_image: ^10.0.1 #拓展Image,支持缓存\n  flutter_smart_dialog: ^4.9.8+9 #各种弹窗 Toast/Dialog/Popup\n  marquee: ^2.3.0 #跑马灯\n  lottie: ^3.3.2 #Lottie动画\n  qr_flutter: ^4.1.0 #二维码\n  sticky_headers: ^0.3.0+2 #吸顶\n  canvas_danmaku: ^0.2.7 #弹幕\n\n  #系统交互\n  package_info_plus: ^9.0.0 #包信息\n  url_launcher: ^6.3.2 #打开链接\n  network_info_plus: ^7.0.0\n  shelf: ^1.4.2\n  shelf_router: ^1.1.4\n  udp: ^5.0.3 #UDP\n  device_info_plus: ^12.1.0 #设备信息\n  wakelock_plus: ^1.4.0 #屏幕常亮，media_kit中自带，但似乎不生效\n\n  # 视频播放\n  media_kit: ^1.2.1\n  media_kit_video: ^1.3.1\n  media_kit_libs_video: ^1.0.7\n\ndependency_overrides:\n  fading_edge_scrollview: ^4.1.1\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n  flutter_lints: ^2.0.0\n\nflutter:\n  uses-material-design: true\n  assets:\n    - assets/statement.txt\n    - assets/images/\n    - assets/icons/\n    - assets/lotties/\n"
  },
  {
    "path": "simple_live_tv_app/test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility in the flutter_test package. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:simple_live_tv_app/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(const MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/.gitignore",
    "content": "flutter/ephemeral/\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n"
  },
  {
    "path": "simple_live_tv_app/windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(simple_live_tv_app LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"simple_live_tv_app\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(VERSION 3.14...3.25)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\")\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n"
  },
  {
    "path": "simple_live_tv_app/windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# Set fallback configurations for older versions of the flutter tool.\nif (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n  set(FLUTTER_TARGET_PLATFORM \"windows-x64\")\nendif()\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "simple_live_tv_app/windows/flutter/generated_plugin_registrant.cc",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#include \"generated_plugin_registrant.h\"\n\n#include <media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h>\n#include <media_kit_video/media_kit_video_plugin_c_api.h>\n#include <url_launcher_windows/url_launcher_windows.h>\n#include <volume_controller/volume_controller_plugin_c_api.h>\n\nvoid RegisterPlugins(flutter::PluginRegistry* registry) {\n  MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitLibsWindowsVideoPluginCApi\"));\n  MediaKitVideoPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"MediaKitVideoPluginCApi\"));\n  UrlLauncherWindowsRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"UrlLauncherWindows\"));\n  VolumeControllerPluginCApiRegisterWithRegistrar(\n      registry->GetRegistrarForPlugin(\"VolumeControllerPluginCApi\"));\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/flutter/generated_plugin_registrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GENERATED_PLUGIN_REGISTRANT_\n#define GENERATED_PLUGIN_REGISTRANT_\n\n#include <flutter/plugin_registry.h>\n\n// Registers Flutter plugins.\nvoid RegisterPlugins(flutter::PluginRegistry* registry);\n\n#endif  // GENERATED_PLUGIN_REGISTRANT_\n"
  },
  {
    "path": "simple_live_tv_app/windows/flutter/generated_plugins.cmake",
    "content": "#\n# Generated file, do not edit.\n#\n\nlist(APPEND FLUTTER_PLUGIN_LIST\n  media_kit_libs_windows_video\n  media_kit_video\n  url_launcher_windows\n  volume_controller\n)\n\nlist(APPEND FLUTTER_FFI_PLUGIN_LIST\n)\n\nset(PLUGIN_BUNDLED_LIBRARIES)\n\nforeach(plugin ${FLUTTER_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})\n  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})\nendforeach(plugin)\n\nforeach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})\n  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})\n  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})\nendforeach(ffi_plugin)\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_link_libraries(${BINARY_NAME} PRIVATE \"dwmapi.lib\")\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"com.example\" \"\\0\"\n            VALUE \"FileDescription\", \"simple_live_tv_app\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"simple_live_tv_app\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2023 com.example. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"simple_live_tv_app.exe\" \"\\0\"\n            VALUE \"ProductName\", \"simple_live_tv_app\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/flutter_window.cpp",
    "content": "#include \"flutter_window.h\"\n\n#include <optional>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nbool FlutterWindow::OnCreate() {\n  if (!Win32Window::OnCreate()) {\n    return false;\n  }\n\n  RECT frame = GetClientArea();\n\n  // The size here must match the window dimensions to avoid unnecessary surface\n  // creation / destruction in the startup path.\n  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n      frame.right - frame.left, frame.bottom - frame.top, project_);\n  // Ensure that basic setup of the controller was successful.\n  if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n    return false;\n  }\n  RegisterPlugins(flutter_controller_->engine());\n  SetChildContent(flutter_controller_->view()->GetNativeWindow());\n\n  flutter_controller_->engine()->SetNextFrameCallback([&]() {\n    this->Show();\n  });\n\n  // Flutter can complete the first frame before the \"show window\" callback is\n  // registered. The following call ensures a frame is pending to ensure the\n  // window is shown. It is a no-op if the first frame hasn't completed yet.\n  flutter_controller_->ForceRedraw();\n\n  return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n  if (flutter_controller_) {\n    std::optional<LRESULT> result =\n        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n    if (result) {\n      return *result;\n    }\n  }\n\n  switch (message) {\n    case WM_FONTCHANGE:\n      flutter_controller_->engine()->ReloadSystemFonts();\n      break;\n  }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.Create(L\"simple_live_tv_app\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr)\n    -1; // remove the trailing null character\n  int input_length = (int)wcslen(utf16_string);\n  std::string utf8_string;\n  if (target_length <= 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      input_length, utf8_string.data(), target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <dwmapi.h>\n#include <flutter_windows.h>\n\n#include \"resource.h\"\n\nnamespace {\n\n/// Window attribute that enables dark mode window decorations.\n///\n/// Redefined in case the developer's machine has a Windows SDK older than\n/// version 10.0.22000.0.\n/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute\n#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE\n#define DWMWA_USE_IMMERSIVE_DARK_MODE 20\n#endif\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n/// Registry key for app theme preference.\n///\n/// A value of 0 indicates apps should use dark mode. A non-zero or missing\n/// value indicates apps should use light mode.\nconstexpr const wchar_t kGetPreferredBrightnessRegKey[] =\n  L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\";\nconstexpr const wchar_t kGetPreferredBrightnessRegValue[] = L\"AppsUseLightTheme\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n  }\n  FreeLibrary(user32_module);\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registrar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::Create(const std::wstring& title,\n                         const Point& origin,\n                         const Size& size) {\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  UpdateTheme(window);\n\n  return OnCreate();\n}\n\nbool Win32Window::Show() {\n  return ShowWindow(window_handle_, SW_SHOWNORMAL);\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n\n    case WM_DWMCOLORIZATIONCOLORCHANGED:\n      UpdateTheme(hwnd);\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n\nvoid Win32Window::UpdateTheme(HWND const window) {\n  DWORD light_mode;\n  DWORD light_mode_size = sizeof(light_mode);\n  LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,\n                               kGetPreferredBrightnessRegValue,\n                               RRF_RT_REG_DWORD, nullptr, &light_mode,\n                               &light_mode_size);\n\n  if (result == ERROR_SUCCESS) {\n    BOOL enable_dark_mode = light_mode == 0;\n    DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,\n                          &enable_dark_mode, sizeof(enable_dark_mode));\n  }\n}\n"
  },
  {
    "path": "simple_live_tv_app/windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates a win32 window with |title| that is positioned and sized using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size this function will scale the inputted width and height as\n  // as appropriate for the default monitor. The window is invisible until\n  // |Show| is called. Returns true if the window was created successfully.\n  bool Create(const std::wstring& title, const Point& origin, const Size& size);\n\n  // Show the current window. Returns true if the window was successfully shown.\n  bool Show();\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  // Update the window frame's theme to match the system theme.\n  static void UpdateTheme(HWND const window);\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  }
]